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.