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

Relaterade artiklar