typescript - Hur man åsidosätter push i Array beroende på typ?
Hur man åsidosätter push till en Array beroende på typen?
Jag försöker något liknande detta
interface Foo{
id:number
}
interface Bar{
name:string
}
public func1( array_var: Foo[] | Bar []){
if(array_var instanceof Array<Foo> ){
array_var.push({id:10})
}
else if(array_var instanceof Array<Bar>){
array_var.push({name:"Stack"})
}
}
Svar #1
Glöm inte att typer blir borttagna när TypeScript-koden transpilieras till JavaScript, så du kan inte ha villkor som är beroende av typen. I JavaScript finns det inget som heter Array<T>, det finns bara Array. Till exempel, [] är både en Foo[] och en Bar[], och vi kan inte avgöra skillnaden mellan de två vid körning eftersom det inte finns någon typinformation kvar.
I det här fallet måste du använda typpredikat för att övertyga kompilatorn om att du har kontrollerat det som kan kontrolleras:
interface Foo {
id: number
}
interface Bar {
name: string
}
function func1(array_var: Foo[] | Bar[]) {
if (isFooArray(array_var)) {
array_var.push({ id: 10 })
}
else {
array_var.push({ name: "Stack" })
}
}
function isFooArray(arr: any[]): arr is Foo[] {
return arr[0].id !== undefined; // Possible implementation
}
TypeScript-lekplats
Det fungerar med en speciell funktion vars implementering du måste skriva, och TypeScript anser att returvärdet av den funktionen (en boolean) representerar resultatet av arr is Foo[]-uttrycket. Det hjälper den att begränsa typerna därefter. Observera igen enligt första stycket att du behöver ett konkret värde vid körning att arbeta med: du måste som utvecklare fatta ett beslut om hur du ska hantera fallet med en tom array.
Jag skrev en exempelimplementation av det, men du kan skriva vad som helst inne i den typavgränsande funktionen.
