以下代码:
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
如何告诉编译器我只是迭代具有字符串值的键并且可以安全地重新分配它们的值?
答案 0 :(得分:2)
您可以通过指定keysToIterateOver
:
const keysToIterateOver: (keyof Foo)[] = [ 'bar', 'qux' ];
否则推断类型为string[]
,因此错误
答案 1 :(得分:0)
编译器无法检测动态属性的类型,并认为该属性具有any
类型。作为一种解决方法,您可以使用索引器编写您的界面。这将告诉编译器任何带有[]
索引器的动态访问属性包含string
或number
并且foo[key] = 'newStringValue'
赋值是正确的。
interface Foo {
[prop: string]: string | number,
bar: string;
qux: string;
baz: number;
}
另一种变体是从 tsconfig.json 文件中删除"noImplicitAny": true,
,但它不是最好的文件。