Hur åtgärdar man denna typ i TypeScript 5.4?


Typescripts version 5.4.x introducerar några brytande förändringar i sättet intersectioner hanteras på. Allting fungerade helt perfekt på 5.3.3.

Kolla DENNA revision om du vill se det "ursprungliga" inlägget (efter formateringsändringar).

Den senaste versionen är det förenklade minimala reproducerbara exemplet enligt kommentarerna (TSPlayground av JCalz - tack):

type MustBeArray<T extends any[]> = T
type Hmm<T extends any[]> = T extends number[] ?
    MustBeArray<{ [I in keyof T]: 1 }> : never

Detta ger ett fel:

Type '{ [I in keyof T]: 1; }' does not satisfy the constraint 'any[]'.
  Types of property 'toString' are incompatible.
    Type 'number' is not assignable to type '() => string'.

Jag är inte säker på hur jag ska gå vidare?

Svar #1

Detta beteende introducerades av microsoft/TypeScript#57122 och släpptes med TypeScript 5.4. Jag lade in microsoft/TypeScript#57744. Det anses vara en regression (så i princip en bugg) och det har åtgärdats i microsoft/TypeScript#57801, vilket bör släppas med TypeScript 5.5.

Under tiden är den föreslagna lösningen från det problemet att refaktorera till en inre nytta-typ som inte har any[]-kravet:

type _Hmm<T> = T extends number[] ? 
  MustBeArray<{ [I in keyof T]: 1 }> : never // okay

type Hmm<T extends any[]> = _Hmm<T> // okay

type Z = Hmm<[2, 3, 4]>
//   ^? type Z = [1, 1, 1]

Playground-länk till kod