Finns det ett sätt att inaktivera svag typdetektering som infördes med Typescript version 2.4?


Med Typescript version 2.4 lades svag typdetektion till. Nu håller jag med om att detta är en fantastisk funktion och kommer att hjälpa till att fånga en mängd fel när du tilldelar ett värde till en typ som inte har en enda egenskapsmatchning för typens valfria egenskaper.

Tyvärr, för ett stort projekt som ursprungligen skrevs i Javascript och sedan migrerades till Typescript, kommer det att finnas fall där kryphålet för svaga typer används.

För att möjliggöra en enkel migration till TS 2.4 och sedan gradvis ta bort alla svaga typöverträdelser - är någon medveten om en flagga eller ett hack för att tillfälligt inaktivera det svaga typavkänningen?

Svar #1

Det finns ingen kompilatorflagga, men jag kan rekommendera dig ts-migrate. Det kommer att omvandla din befintliga js till ts-kod med any där inferensen inte fungerar.

Svar #2

Vanligtvis kastas detta fel när man intersectar fullständiga valfria typer (dvs objekt med endast valfria egenskaper).

Ibland när man skriver generisk bibliotekskod är detta något man vill göra, även om snittet också resulterar i en fullständig valfri typ.

Vanliga TS-intersektioner låter dig inte kombinera svaga typer, men du kan implementera intersektionen själv:

export type WeakIntersect<T, U> = Record<string, never> extends T
  ? Record<string, never> extends U
    ? T & U // fallback to compiler check for weak types
    : U
  : Record<string, never> extends U
    ? T
    : T & U
FullyOptional1 & FullyOptional2 // error
WeakIntersect<FullyOptional1, FullyOptional2> // ok

Det är också möjligt att undvika felet när man använder extends på en svag typ:

export type AllowWeakType<T> = Record<string, never> extends T ? any : T
T extends FullyOptional // error
T extends AllowWeakType<FullyOptional> // ok

Relaterade artiklar