Javascript 在以下情况下,我是否必须声明索引签名?
用TypeScript编码。Javascript 在以下情况下,我是否必须声明索引签名?,javascript,typescript,Javascript,Typescript,用TypeScript编码。 interface Object { number: number; string: string; } const object: Object = { number: 1, string: 'a' }, object2 = {} as Object; for (const key of Object.keys(object)) object2[key] = object[key]; => Element im
interface Object {
number: number;
string: string;
}
const object: Object = { number: 1, string: 'a' },
object2 = {} as Object;
for (const key of Object.keys(object))
object2[key] = object[key];
=> Element implicitly has an 'any' type because type 'Object' has no index signature.
问题
我一直在用noImplicitAny选项做打字脚本
基本上,我猜它推断key
变量是object
和object2
的键,所以我想我不必声明索引签名
但是我想错了,所以我总是犯错误
有没有办法在不声明索引签名的情况下修复错误
谢谢阅读!:) 这里的问题是希望
Object.keys
返回(keyof Obj)[
而不是字符串[]
。这一点已经讨论了相当长的时间,可能是最好的来源。简而言之,Typescript的创建者Anders评论道:
一旦移动到实例化的类型世界,它就会退化,因为对象在运行时可以(而且通常确实)拥有比编译时静态已知的更多的属性
因此,如果Object.keys
告诉您,它只会给您number
和string
,那么在运行时它实际上可能会有所不同
因此,如果您想继续使用
Object.keys
,则需要提供更明确的键入,以告诉TypeScript一切正常。这与此没有直接关系,但我确实建议您将界面命名为Object
以外的名称,因为该名称与全局名称冲突。@jcalz感谢您的建议!在现实生活中我从来没有用过这个名字,但这是一个很好的观点。谢谢你:D。我知道了。这很有帮助。