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.
