Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在以下情况下,我是否必须声明索引签名?_Javascript_Typescript - Fatal编程技术网

Javascript 在以下情况下,我是否必须声明索引签名?

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

用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 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。我知道了。这很有帮助。