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
