首页 > 解决方案 > 使用来自其他文件的枚举覆盖 i18next TFunction

问题描述

我正在尝试覆盖i18next的TFunction 。

我想要实现的是确保将使用的 i18n 键键入为:

t('invalid-key') // is invalid
t('key1') // is valid

所以我制作了以下i18next.d.ts文件来覆盖TFunction的类型:

type Keys = 'key1' | 'key2'

declare module 'i18next' {
    export type TFunction = (key: Keys) => string
}

它可以工作,但是一旦我尝试从其他文件导入该类型,TFunction 类型就会恢复为原始类型。

有人提示帮助我在声明文件中导入密钥吗?


当我通过react-i18next包的useTranslation钩子进行导入时,奇怪的导入工作:

import { I18nKey } from '../modules/core/i18n/i18nKey'

declare module 'react-i18next' {
    export function useTranslation(): {
        t: (key: I18nKey) => string
    }
}

标签: typescripti18next

解决方案


如果Keys在声明文件中导出,则声明文件将成为一个模块。这会导致 TypeScript 不全局包含该文件。declare module为全局创建一个单独的文件。


如果你想导入一个声明模块的全局文件,你应该像这样在模块中导入它们。

declare module 'react-i18next' {
    import { I18nKey } from '../modules/core/i18n/i18nKey'

    export function useTranslation(): {
        t: (key: I18nKey) => string
    }
}

推荐阅读