typescript - Funktion utökar objekt med egenskaper av typen any vs unknown
I nedanstående typdefinitioner, varför har P1 och P2 olika värden?
type P1 = (() => 22) extends {[k:string]:any} ? 1:2 //`P1 == 1`
type P2 = (() => 22) extends {[k:string]:unknown} ? 1:2 //`P2 == 2`
Svar #1
Se brytande förändring: { [k: string]: unknown } är inte längre ett wildcard-assigneringsmål för ett auktoritativt svar.
Indexsignaturen {[k: string]: any} beter sig särskilt i Typescript: det är ett giltigt tilldelningsmål för vilken objekttyp som helst. Vanligtvis ges inte typer som () => 22 implicit indexsignaturer, och därför är det ett fel att tilldela () => 22 till {[k: string]: unknown}. Endast när egenskapstypen är any får du det särskilda tillåtande beteendet:
let anyRec: { [k: string]: any };
anyRec = () => 22; // okay
let unkRec: { [k: string]: unknown };
unkRec = () => 22; // error
Så det är därför P1 och P2 skiljer sig åt.
Playground-länk till kod
