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> {}
