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)
