Typescript-type for array med uendelig dybde
Hvordan definerer jeg en type for
string|string[]|string[][]|string[][][] // ad infinitum
i TypeScript?
rediger: løsningen ville være:
type Rec = string | string[] | Rec[]
men det er ikke tillatt.
Her er mitt brukstilfelle:
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);
}
Svar #1
I motsetning til svaret fra Rodris trenger du ikke å legge til noen av de innebygde Array-egenskapene som map, length osv.
type RecursiveArray = Array<RecursiveArray | string>;
let arr: RecursiveArray = [];
arr[1] = [];
arr[1][2] = [];
arr[1][2][2] = "item 122";
// In the other answer this throws a type error
arr[1][2][3] = ['1', '2', '3'];
arr[1][2][3].forEach(item => console.log(item));
I tillegg kan du gjøre det generisk for å spesifisere typen:
type RecursiveArray<T> = Array<T | RecursiveArray<T>>;
Svar #2
Du kan lage et rekursivt grensesnitt.
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";
