Varför har "Omit"-verktyget från Typescript extends any för "K"?


type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;

Eftersom parametern "K" i Omit utvidgar keyof any, får vi inget fel från Typescript när vi anger ett egenskapsnamn som inte finns i parametern "T".

Omit hjälper till att ta bort en egenskap som ingår i en Typ eller Interface. Jag tycker inte att det är logiskt att fritt infoga en egenskap som inte finns i den givna Typen/Interfacet.

Är det inte bättre så här:

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

Vad är den verkliga anledningen till att Typescript utökar keyof any? Och hur kan jag ändra det för mitt projekt?

Svar #1

Att använda K extends keyof any tillåter mer flexibla anrop av Omit utan att behöva ändra den andra typen för att endast inkludera egenskaper som finns i objektet. Till exempel, med din version skulle du inte kunna göra:

type BadProps = 'bad1' | 'bad2' | 'bad3';
type Omit2<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type Result = Omit2<{ bad2: 'val2'}, BadProps>

Du skulle först behöva konstruera en annan typ från BadProps. Inte att det skulle vara svårt, men det skulle lägga till onödig mallkod.

Relaterade artiklar