我遇到了错误
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ 1: { abc: number; }; 2: boolean; 3: string; }'.
No index signature with a parameter of type 'string' was found on type '{ 1: { abc: number; }; 2: boolean; 3: string; }'
具有以下代码
interface testInterface {
1: { abc: number };
2: boolean;
3: string;
}
const test: testInterface = {
"1": {abc:123},
"2": false,
"3": "123"
}
Object.keys(test)
.filter((key) => !test[key] )
https://codesandbox.io/s/exciting-forest-12llz?file=/src/App.tsx:55-131
我应该在哪里定义类型?我为test
定义了一个接口,它不能解决问题。
答案 0 :(得分:0)
面对这个问题实际上不是你的错,这是TypeScript的设计缺陷,原因在this issue中有所说明。
您遇到此问题的原因是Object.keys(x)
不返回keyof typeof x
,而是返回string[]
。
这就是为什么出现错误type 'string' can't be used to index type 'testInterface'
的原因,因为keyof testInterface
是(1|2|3)[]
,显然不能与string[]
匹配。
因此,解决此问题的一种方法是使用as
运算符进行类型转换。
您可以在this playground上尝试一下。
interface testInterface {
1: { abc: number };
2: boolean;
3: string;
}
const test: testInterface = {
"1": { abc: 123 },
"2": false,
"3": "123"
};
(Object.keys(test) as unknown as (keyof testInterface)[])
.filter((key) => !test[key])
请注意,强制转换为unknown
是必要的,否则,您将收到另一个错误消息,提示无法将string[]
强制转换为(1|2|3)[]
。
坦率地说,这是一个非常丑陋的解决方案,但是在撰写本文时,直到TypeScript的开发人员决定优化Object.keys
的返回类型之前,这可能是唯一可行的解决方案。