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[]
