打字稿在过滤器循环声明类型?

时间:2020-05-15 06:58:13

标签: typescript

我遇到了错误

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定义了一个接口,它不能解决问题。

1 个答案:

答案 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的返回类型之前,这可能是唯一可行的解​​决方案。