Emr*_*rio 0 for-in-loop object-property typescript
我有一个从 JSON 文件(带有resolveJsonModule: true)导入的 JSON 对象。该对象如下所示:
"myobject": {
"prop1": "foo",
"prop2": "bar"
}
Run Code Online (Sandbox Code Playgroud)
因此它的类型如下所示:
"myobject": {
"prop1": "foo",
"prop2": "bar"
}
Run Code Online (Sandbox Code Playgroud)
这很好,但是当我尝试使用for...in循环时,
myobject: { prop1: string, prop2: string }
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
TS7053: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ "prop1": string; "prop2": string; }'.
No index signature with a parameter of type 'string' was found on type '{ "prop1": string; "prop2": string; }'.
Run Code Online (Sandbox Code Playgroud)
我知道这意味着迭代器key是 typestring而不是 type 'prop1' | 'prop2'。但我不明白为什么迭代器没有得到这种类型,因为我显式地遍历myobject. 我是否错过了启用此行为的 tsconfig 属性?我不想这样做:
for (const key in myobject) {
console.log(myobject[key as 'prop1' | 'prop2'])
}
Run Code Online (Sandbox Code Playgroud)
因为:
for*_*d04 19
for...in我知道三种打字循环的解决方案:
类型断言将强制key类型缩小为myobject键:
for (const key in myobject) {
console.log(myobject[key as keyof typeof myobject])
}
Run Code Online (Sandbox Code Playgroud)
key 变量不能在 for-in 循环内部输入,而是可以在外部声明:
let key: keyof typeof myobject // add this declaration
for (key in myobject) {
console.log(myobject[key]) // works
}
Run Code Online (Sandbox Code Playgroud)
function foo<T>(t: T) {
for (const k in t) {
console.log(t[k]) // works
}
}
foo(myobject)
Run Code Online (Sandbox Code Playgroud)
key在for...in循环中,根据设计默认为 typestring。这是由于TypeScript 的结构类型系统造成的:确切的属性键形状只有在运行时才知道,编译器无法静态分析编译时对象上存在哪些属性。key缩小到属性的类型将使myobject循环成为for...in类型上不安全的操作。
注意:一些链接资源讨论了Object.keys,同样的论证也成立。
Anders Hejlsberg 在 TypeScript#12253 中的评论- 还提到for...in
TypeScript#32321链接到大量重复问题
我对此有疑问。在
for (var k in x)wherexis of some type中,只有当 of 的确切类型为is时T,才可以安全地说 thatkis of type 。如果 的实际类型是 的子类型,正如我们的赋值兼容性规则所允许的那样,您将看到 中的值不属于 类型。keyof TxTxTkkeyof T
一个更好的方法是:
for (const key in myobject) {
console.log(myobject[key as keyof typeof myobject])
}
Run Code Online (Sandbox Code Playgroud)
这样,添加属性或重命名时不会中断
| 归档时间: |
|
| 查看次数: |
1056 次 |
| 最近记录: |