“字符串”类型的表达式不能用于索引类型

Tom*_*nka 2 typescript

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

有人可以帮我处理这个 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)
Run Code Online (Sandbox Code Playgroud)

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

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}"!`)
    }
}
Run Code Online (Sandbox Code Playgroud)

打字稿游乐场链接

Tim*_*rry 5

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

有各种复杂的原因导致推断并不总是安全,但最终结果是 TypeScript 无法key自动为您提供正确的类型。

此外,不允许为 for-in 循环添加类型注释,因此您无法手动修复它。

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

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

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