typescript - Varför fungerar inte denna typkontroll i detta ternära uttryck?


Jag har denna kod:

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

Lekplatslänk

Vid settings[key].forEach( ser jag meddelandet:

Egenskapen 'forEach' finns inte på typen 'string | string[]'.
Egenskapen 'forEach' finns inte på typen 'string'.

Så varför fungerar inte isArray-typvaktaren?

Svar #1

Typvakter fungerar inte med getter-uttryck, som här

    (isArray(settings[key]))  // (1)
        ? settings[key].forEach(val => console.log(val)) // (2)

eftersom kompilatorn inte kan vara säker på att settings[key] i (1) och (2) är samma sak. Du måste tilldela det till en temporär variabel först:

    let temp = settings[key];
    (isArray(temp))
        ? temp.forEach(val => console.log(val))
        : console.log(temp)