typescript - När refererar en typ till sig själv cirkulärt?


Jag förstår inte varför "typ cirkulär referens själv" ibland dyker upp och ibland inte.

Exempel :

type Item = string;

type CollapsableItem = (Item | CollapsableItem)[];  // Fine

type CollapsableItem = [(Item | CollapsableItem)];  // Fine

type CollapsableItem = [Item, ...(Item | CollapsableItem)];  // TS2456: Type alias 'CollapsableItem' circularly references itself.

Den enda skillnaden i den senaste är att jag tvingade det första elementet i arrayen att vara Item. Varför orsakar det plötsligt ett circular reference type error?

I allmänhet, när uppstår ett fel som säger "typen refererar cirkulärt till sig själv"?

Svar #1

Som du nämnde var det bara ett stavfel; det borde vara

type CollapsableItem = [Item, ...(Item | CollapsableItem)[]]

För att ge kontext, att använda restoperatorn ... på något annat än en arraytyp är ogiltigt i TypeScript och kommer att resultera i följande.

type A = [string]
type B = [...(string | A)]

// Error: A rest element type must be an array type.

Anledningen till att TypeScript-kompilatorn sade att din kod var cirkulär istället för att den använde rest på den icke-array-typen Item är ett kompilatorprioriteringsbeslut, och din deklaration var ogiltig av båda dessa skäl.

Svar #2

Jag fick nyligen ett kompileringsfel TS2456 med senaste npm install om att ResultType refererar till sig själv i cirkel i node_modules@types\arcgis-js-api\index.d.ts

Kompileringsfelet försvinner när jag redigerar den här filen och ersätter:

   export type ResultType = number | string | Date | boolean | Graphic | Geometry | any | ResultType[]; 

Med :

    export type ResultType = number | string | Date | boolean | Graphic | Geometry | any | ResultTypeArray; 

    export interface ResultTypeArray extends Array<ResultType> {} 

Relaterade artiklar