Есть функционал перевода при помощь provide/inject
Если указать тип any, то все работает, но какой все же правильный тип должен быть?
Это компонент куда inject-тируется функция localizeFilter в которую передается строковый ключ по которому возвращается слово на определенном языке.
Сейчас у messagePlagin задан тип any, так как с ним ошибок нет.
<script lang="ts">
import { inject, computed } from 'vue'
export default {
props: ['modelValue'],
setup() {
const messagePlagin: any = inject('localizeFilter')
const links = computed(() => {
return [
{ title: messagePlagin('Bill'), url: '/' },
{ title: messagePlagin('History'), url: '/history' },
{ title: messagePlagin('Planning'), url: '/planning' },
{ title: messagePlagin('Record'), url: '/record' },
{ title: messagePlagin('Categories'), url: '/categories' }
]
})
return {
links
}
}
}
</script>
Этот код представляет из себя реализацию provide.
На самом деле тут тоже есть проблемы с типами, которые я еще не смог решить(по закомментированным eslint строкам можете понять))), но это наверное другой вопрос
import { store, key } from '@/store'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import ru from '@/locales/ru.json'
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
import en from '@/locales/en.json'
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$localizeFilter: (text: string) => string
}
}
const locales = {
'ru-RU': ru as string,
'en-US': en as string
}
export default {
install(app: any, options: any) {
const localizeFilter = app.config.globalProperties.$localizeFilter = (key: string) => {
const locale = store.getters['info/info'].locale || 'ru-RU' as string
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return locales[locale][key] || `[Localize error]: key ${key} not found`
}
app.provide('localizeFilter', localizeFilter)
}
}
Подводя итог, как задать тип кроме any в messagePlagin при ипользовании inject