2017-06-23 4 views
1

Wie definiere ich einen Typ fürTyposkript Typ für Array mit unendlicher Tiefe

string|string[]|string[][]|string[][][] // ad infinitum 

in Typoskript?

edit: die Lösung wäre:

type Rec = string | string[] | Rec[] 

aber das ist nicht erlaubt.

Hier ist meine usecase:

interface RecursiveArray<T> { 
    [index: number]: (RecursiveArray<T> | T); 
} 

type Recursive<T> = T|RecursiveArray<T> 

function stringValue (value: Recursive<string|boolean>): Recursive<string> { 
    if (typeof value === 'boolean') { 
    return value ? 'true' : 'false'; 
    } 
    if (Array.isArray (value)) { 
    return (value).map (stringValue); 
    } 
    return stringValue(value); 
} 
+1

Einfachste Antwort ist nur Typ 'any', aber das ist nicht gut typisiert. Haben Sie versucht, es als 'Array ' einzugeben? – Nieminen

+1

Kann ich Sie nach dem Anwendungsfall eines unendlich tiefen Arrays fragen? –

+0

Die einzige Lösung, die ich sehen kann, wäre eine zirkuläre Referenz, die Typoskript automatisch erkennen, mehr Informationen über Ihren Anwendungsfall könnte helfen – jrmgx

Antwort

3

Sie können eine rekursive Schnittstelle erstellen.

interface RecursiveArray { 
    [index: number]: (RecursiveArray | string); 
    length: number; 
} 

let arr: RecursiveArray = []; 
arr[1] = []; 
arr[1][2] = []; 
arr[1][2][2] = "item 122"; 
arr[1][2][3] = "item 123"; 
+0

Schöne Lösung, aber RecursiveArray hat keine Längeneigenschaft – user3725805

+0

Sie können eine Längeneigenschaft hinzufügen, wenn erforderlich. Habe es zur Antwort gebracht. – Rodris