Hvordan tvinge TypeScript til sjekk av overskytende egenskaper på funksjonsreturverdi
I det følgende bør c: 3 være en typefeil, men det er det ikke. Hvordan kan det oppnås?
export type ExcludeUndefined<T> = T extends undefined ? never : T
export type GetRequiredKeys<T> = { [K in keyof T]: undefined extends T[K] ? never : K }[keyof T]
export type KeepRequiredKeys<t> = {
[k in ExcludeUndefined<GetRequiredKeys<t>>]-?: undefined extends t[k] ? never : t[k]
}
const ok: KeepRequiredKeys<{
b: 1
c?: number | undefined
}> = { b: 1, c: 3 } // this type errors as expected
const bad: () => KeepRequiredKeys<{
b: 1
c?: number | undefined
}> = () => ({ b: 1, c: 3 }) // c: 3 should be type error, is not
Lekerom lenke
Svar #1
Du har rett i at det relaterer seg til https://github.com/microsoft/TypeScript/issues/241 --- det er et problem med typeutvidelse. Returverdien blir inferert, og deretter blir hele funksjonsuttrykket typekontrollert for om det kan tildeles formen (typen) til const-variabelen.
Dessverre er det ingenting du kan gjøre dynamisk bortsett fra å manuelt annotere returverdien til callbacken slik at den ikke lenger blir inferert, noe som delvis motvirker hensikten i de fleste tilfeller.
Svar #2
Du har flaks. Den koblede saken er fra for 6 år siden (!) men ble nettopp løst forrige uke. Denne PR-en forbedrer «utvidelses»-atferden. Se på koden i ditt opprinnelige spørsmål, kjør den gjennom den oppdaterte kompilatoren - den siste linjen, som du markerer som «bør være en feil», blir nå korrekt merket som en feil.
Det høres ut som om de vil få PR-en inn i v4.1, men jeg ville ikke nødvendigvis holde teamet til det.