Zoeken op website

Kan ik een Typescript-functie hebben die een scalair of array-waarde retourneert zonder dat de aanroeper de uitvoer hoeft te casten


Probleem

Ik heb deze functie:

save<T>(x: T | T[]) {
 if (x instanceof Array) {
     // save array to db
 } else {
     // save entity to db
 }
 return x
}

// client code
let o: SomeType = { // values here }
let updated = save(o) // compile confusion... 

TS weet niet of updated enkelvoud of een array is.

Vraag

Hoe kan ik de functie definiëren zodat:

  • als een enkelvoudige parameter wordt doorgegeven, weet TypeScript dat het resultaat enkelvoudig is
  • als een arrayparameter wordt doorgegeven, weet TypeScript dat het resultaat een array is

Antwoord #1

Verwijder de T[] uit de definitie. T[] is een deelverzameling van T.

function save<T>(x: T): T {
    if (x instanceof Array) {
        // save array to db
    } else {
        // save entity to db
    }

    return x
}

// client code
let a: SomeType = { // values here };
let updateda = save(a); // updateda is of type SomeType

let b: SomeType = { // values here };
let updatedb = save([a, b]); // updatedb is of type SomeType[]

Gerelateerde artikelen