如何定义
的类型string|string[]|string[][]|string[][][] // ad infinitum
打字稿中的?
编辑: 解决方案是:
type Rec = string | string[] | Rec[]
但不允许这样做。
这是我的用例:
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);
}
答案 0 :(得分:3)
您可以创建递归界面。
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";
答案 1 :(得分:2)
与Rodris的答案不同,您不需要添加任何内置的Array属性,例如map,length等。
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));
答案 2 :(得分:0)
我刚遇到这个问题并没有找到任何类型定义解决方案,所以我想出了这种类型(我为 tbh 感到非常自豪):
type NestedArray<T, Depth extends number = 1> = Depth extends 0 ? T : NestedArray<T[], [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10][Depth]>;
type string2D = NestedArray<string, 2>; //=> string[][]
type string3D = NestedArray<string, 3>; //=> string[][][]
这只适用于最多 10 级递归(查看 [-1, ..., 10]
数组,如果需要更多,只需扩展它)。我希望这对未来的谷歌员工有帮助