我有此代码:
function isArray(v: any): v is any[] {
return Array.isArray(v);
}
type Settings = {
[key: string]: string | string[]
}
function myfunc(settings: Settings) {
Object.keys(settings).forEach(key => (
(isArray(settings[key]))
? settings[key].forEach(val => console.log(val))
: console.log(settings[key])
));
}
在settings[key].forEach(
,我看到消息:
类型'string |不存在属性'forEach'字符串[]'。
属性'forEach'在类型'string'上不存在。
那么isArray
类型的后卫为什么不起作用?
答案 0 :(得分:2)
类型防护不适用于getter表达式,例如此处
(isArray(settings[key])) // (1)
? settings[key].forEach(val => console.log(val)) // (2)
因为编译器无法确定(1)和(2)中的settings[key]
是同一件事。您必须先将其分配给临时变量:
let temp = settings[key];
(isArray(temp))
? temp.forEach(val => console.log(val))
: console.log(temp)