如何解决“类型中缺少索引签名”错误?

时间:2020-03-15 20:14:58

标签: typescript

如何解决以下类型错误?

“查询”类型的参数不能分配给“输入”类型的参数。类型“查询”中缺少索引签名。(2345)

我将df1[, 2]类型用作查询字符串的通用类型(全称)。当我输入Input类型的输入时,会引发错误,但基础的JavaScript代码运行得很好。

TypeScript Playground

Query

1 个答案:

答案 0 :(得分:4)

解决方案1:使用type代替interface

这是因为类型[key: string]: string与您的Query接口不兼容,后者的接口包含两个允许的键:loremipsum,而前一个包含任何任意字符串作为键。通常,这是TypeScript接口的问题:特定的接口无法保存到更通用的接口中。

但是,可以将特定类型保存为更通用的类型,因此一种快速的解决方案是将界面简单地转换为类型:

type Query = {
    lorem: "0" | "1"
    ipsum: string
}

const query: Query = {
    lorem: "0",
    ipsum: "Hello world"
}

type Input = {
    [key: string]: string
}

const test = (input: Input) => {
    return input["lorem"]
}

test(query)

解决方案2:在调用test()

时传播变量

另一种解决方案将简单地保留接口,但在将变量query传递到test()之前,使用ES6对象散布来解构/扩展变量{ ...query }。这样,您将强制TypeScript将test(query)识别为可索引的。

此解决方案很聪明,但有点破绽,因为您可能必须在代码中添加注释以解释为什么不能只使用test({ ...query })而不是interface Query { lorem: "0" | "1" ipsum: string } const query: Query = { lorem: "0", ipsum: "Hello world" } interface Input { [key: string]: string } const test = (input: Input) => { return input["lorem"] } test({ ...query })

{{1}}

an extended thread on discussion on TypeScript's GitHub repo:可能是一个阅读更多有关它的好地方。