typescript - Funksjon som tar hvilken som helst type og dens subtype
Jeg vil skrive følgende funksjon
function override<T, U>(first: T, second: U): T {
let result = <T>{};
for (let id in first) {
result[id] = first[id];
}
for (let id in second) {
result[id] = second[id];
}
return result;
}
men gjør det typesikkert. I mitt brukstilfelle er både T og U enkle registertyper. Jeg vil at T skal være pålagt å ha alle egenskapene til U. Finnes det en måte å uttrykke dette forholdet på?
Svar #1
Du kan ikke gjøre det i en enkelt funksjonsdeklarasjon. Grunnen er at extends generiske begrensninger ikke kan referere til andre generiske i samme gruppe. Du kan imidlertid dele funksjonen i to deler (currying). Og deretter bruke typen til det første argumentet (nå i en separat funksjon) for å begrense typen til det andre argumentet som vist nedenfor:
var override = <T>(first:T) => <U extends T>(second:U) : T => {
let result = <T>{};
for (let id in first) {
result[id] = first[id];
}
for (let id in second) {
result[id] = second[id];
}
return result;
}
override({a:123})({a:123, b:456}); // okay
override({a:123})({b:456}); // error
Svar #2
Jeg vet at det er et gammelt spørsmål, men for tiden støtter TS følgende syntaks:
type Partial<T>={ [P in keyof T]?: T[P]; }
(Som er i lib.d.ts, så du trenger kanskje ikke å inkludere det i koden din)
Så :
function override<T>(first: T, second: Partial<T>): T { ...
