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.

Relaterte artikler