在 Typescript 中迭代对象键时如何避免隐式任何

How to avoid implicit any when iterating over object keys in Typescript

以下代码:

interface Foo {
  bar: string;
  qux: string;
  baz: number;
}

const foo: Foo = {
  bar: '42',
  qux: 'baz',
  baz: 5
};

const keysToIterateOver = [ 'bar', 'qux' ];

keysToIterateOver.forEach(key => foo[key] = 'newStringValue');

给出 TypeScript 编译错误:

Element implicitly has an 'any' type because type 'Foo' has no index signature

我如何告诉编译器我只是迭代具有字符串值并且可以安全地重新分配它们的值的键?

编译器无法检测动态 属性 的类型,并认为 属性 具有 any 类型。作为解决方法,您可以使用索引器编写接口。这将告诉编译器任何使用 [] 索引器动态访问的 属性 包含 stringnumber 并且 foo[key] = 'newStringValue' 赋值是正确的。

interface Foo {
    [prop: string]: string | number,
    bar: string;
    qux: string;
    baz: number;
}

另一种变体是从 tsconfig.json 文件中删除 "noImplicitAny": true,,但这不是最好的。

您可以通过指定 keysToIterateOver 的类型来实现:

const keysToIterateOver: (keyof Foo)[] = [ 'bar', 'qux' ];

否则推断类型为string[],因此错误