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 { ...

Relaterte artikler