【问题标题】:Expression of type 'string' can't be used to index type“字符串”类型的表达式不能用于索引类型
【发布时间】:2020-07-08 19:47:29
【问题描述】:

很抱歉创建了另一个此类问题,但即使有类似的问题,我也无法将他们的解决方案应用于我的特定案例。

有人可以帮我处理这个 TypeScript 错误吗?

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'Record<RouteName, TranslatableRoute>'.
  No index signature with a parameter of type 'string' was found on type 'Record<RouteName, TranslatableRoute>'.(7053)

我正在寻找解决问题的正确方法,而不是通过破坏类型安全来解决问题。这是我遇到问题的一些虚拟示例。

type RouteName = 'home' | 'account'

interface TranslatableRoute {
    cs: string;
    en: string;
}

const translatableRoutes: Record<RouteName, TranslatableRoute> = {
    home: {
        cs: '/',
        en: '/'
    },
    account: {
        cs: '/ucet',
        en: '/account'
    }
}

const findRoute = '/ucet'
const findLang = 'cs'

for (const key in translatableRoutes) {
    if (translatableRoutes[key][findLang] === findRoute) {
        console.log(`Found route\'s name is "${key}"!`)
    }
}

打字稿游乐场link

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这里的问题是key 被推断为string 而不是keyof typeof translatableRoutes,在这种情况下这是正确的。

    complex reasons 有各种各样的原因,为什么不能总是安全地推断出来,但最终结果是 TypeScript 不能自动为您提供正确的类型 key

    另外,for-in 循环的类型注解aren't allowed,所以你不能手动内联修复它。

    幸运的是,您可以单独提供类型注释。将您的 for-in 循环替换为:

    let key: keyof typeof translatableRoutes;
    for (key in translatableRoutes) {
        if (translatableRoutes[key][findLang] === findRoute) {
            console.log(`Found route\'s name is "${key}"!`)
        }
    }
    

    这有点麻烦,但它为key 提供了正确的类型,并确保以后一切正常且安全地工作,无需进行类型转换。

    【讨论】:

    • 感谢您的精彩解释。现在我明白了。
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2019-12-12
    • 2022-10-23
    • 2020-11-13
    • 2019-12-17
    相关资源
    最近更新 更多