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

时间:2017-12-25 07:16:37

标签: typescript index-signature

以下代码:

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

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

2 个答案:

答案 0 :(得分:2)

您可以通过指定keysToIterateOver

的类型来实现此目的
const keysToIterateOver: (keyof Foo)[] = [ 'bar', 'qux' ];

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

答案 1 :(得分:0)

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

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

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