Exclude kan inte ta bort undefined i Typescript


Jag försöker ta bort undefined från en objekt typ. Det jag gjorde är:

type T = Exclude<{
    foo: number | undefined;
    flag?: boolean | undefined;
}, undefined>

Men T-resultatet är fortfarande

type T = {
    foo: number | undefined;
    flag?: boolean | undefined;
}

Varför fungerar inte Exclude?

Förlåt, jag glömde nämna att jag fortfarande vill behålla den valfria typen. Jag uppdaterade objektet. Antag att vi har en egenskap som är valfri och en annan som inte är det. Så resultatet jag vill ha är

type T = {
    foo: number;
    flag?: boolean;
}

Svar #1

Antagande

type A = {
    foo?: number | undefined;
    flag?: boolean | undefined;
};

A kan inte ta emot undefined, annars skulle dess definition ha varit

type UndefinableA = {
    foo?: number | undefined;
    flag?: boolean | undefined;
} | undefined;

Därför kommer både Exclude<A, undefined> och Exclude<UndefinableA, undefined> att returnera A, eftersom Exclude<T, U> inte verkar på egenskaper:

Exkludera från T de typer som kan tilldelas U


Du kan loopa genom alla nycklar och exkludera undefined från varje:

type OmitUndefined<T> = {[K in keyof T]: Exclude<T[K], undefined>};

då

type T = OmitUndefined<A>;

kommer att vara densamma som

type T = {
    foo: number;
    flag?: boolean | undefined;
}

Eftersom flag är valfri kan du inte ta bort undefined från den.