TypeScript generisk standardtyp vs kontextuell typning


I TypeScript har vi Kontextuell Typning, när en generisk typ inte är definierad, kommer TypeScript att försöka härleda rätt typ från returvärdet.

I de flesta fall fungerar det bra. Men ibland blir det konstigt. I mitt fall, när en funktionsparameter är odefinierad, används ibland inte den generiska standardtypen, och det är inte väntat.

👇 Exempel & TS Playground-länk

type State = { count: number } 

declare function simple<T = State>(second?: T): T;
const { count: countA } = simple() 
// in 4.0+ => countA: number
// in 3.9 => countA: any;

declare function complex<M, T = State>(first: M, second?: T): T;
const { count: countB } = complex(1)
// countB: any;

Jag skulle vilja fråga, är detta en TypeScript-bugg, eller finns det någon form av prioritet för att bestämma vilken typ som ska härledas från, returtypen eller den generiska standardtypen?

Svar #1

Är detta en TypeScript-bugg, eller finns det någon form av prioritet för att avgöra vilken typ som ska härledas från, returtypen eller den generiska standardtypen?

Detta verkar vara ett TS-fel med destruktureringstilldelning för mig. const {b}=fn(); borde vara ekvivalent med const tmp=fn(); const {b}=tmp eller med const b=fn().b. Jag har absolut ingen aning om varför det att skriva det som const {b}=fn() skulle bryta de härledda typerna.

type State = { count: number } 
declare function complex<M, T = State>(first: M, second?: T): T;
const { count: countB } = complex(1) // FAILS
const state = complex(2); // works!
const {count: countC} = state;
const countD = complex(3).count; // works!
let tmp;
const { count: countE } = tmp = complex(4); // works!

lekplats

Relaterade artiklar