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.
