为什么该类型防护在此三元表达式中不起作用?

时间:2019-11-13 10:56:58

标签: typescript

我有此代码:

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])
    ));
}

Playground link

settings[key].forEach(,我看到消息:

  

类型'string |不存在属性'forEach'字符串[]'。
    属性'forEach'在类型'string'上不存在。

那么isArray类型的后卫为什么不起作用?

1 个答案:

答案 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)