【问题标题】:How to define an object whose items can be accessed through a variable content in Typescript?如何定义一个可以通过 Typescript 中的变量内容访问其项目的对象?
【发布时间】:2021-05-29 04:39:19
【问题描述】:

我是 typescript 的新手,试图实现基于用户浏览器语言的内容。许多不同的国家使用相同的语言(使用不同的语言环境键),所以我试图过滤它们以避免从date-fns 导入所有语言环境(稍后将使用)。

const availableLanguages = {
    es: 'es',
    pt: 'pt-BR',
    en: 'en-US'
}

const {i18n} = useTranslation(); // library for getting user locale

const browserLanguage = i18n.language.slice(0,2); // Handles pt-BR x pt-PT
const locale = availableLanguages[browserLanguage] // throws error

最后一行抛出

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ es: string; pt: string; en: string; }'.
  No index signature with a parameter of type 'string' was found on type '{ es: string; pt: string; en: string; }'

错误。我该如何解决?

【问题讨论】:

    标签: reactjs typescript tsx


    【解决方案1】:

    首先确保browserLanguage 是对象的键之一:

    if (browserLanguage !== 'es' && browserLanguage !== 'pt' && browserLanguage !== 'en') {
        // hopefully your app is designed so that this never occurs
        // but having this branch will make TS happy
        throw new Error('Language is not in availableLanguages');
    }
    const locale = availableLanguages[browserLanguage]
    

    其他方法需要类型断言,例如:

    if (!Object.keys(availableLanguages).includes(browserLanguage)) {
        throw new Error('Language is not in availableLanguages');
    }
    const locale = availableLanguages[browserLanguage as keyof typeof availableLanguages];
    

    【讨论】:

    • 这是唯一的方法吗?我实现了一个对象来避免那些内联比较
    • 类似于if (browserLanguage in availableLangues) 在python中
    • 这是可能的,但它需要类型断言,有些人希望尽可能避免 - 请参阅编辑
    • 谢谢!我会去第一个啊啊啊
    • 为什么``` if (browserLanguage in availableLanguages){ const locale = availableLanguages[browserLanguage] } ``` 不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2014-10-17
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多