0

以下代码:

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

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

4

2 回答 2

2

您可以通过指定以下类型来实现此目的keysToIterateOver

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

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

于 2017-12-25T07:42:05.673 回答
0

编译器无法检测动态属性的类型并认为该属性具有any类型。作为一种解决方法,您可以使用索引器编写界面。这将告诉编译器任何带有[]索引器的动态访问属性都包含stringornumber并且foo[key] = 'newStringValue'分配是正确的。

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

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

于 2017-12-25T07:23:23.820 回答