递归数组类型打字稿

nig*_*gel 7 typescript

说我有类型 type Atom = string | boolean | number.我想定义一种类型的数组:

NestedArray = Atom | [a_0, a_1, ... , a_n]每个a_i都是a Atom或a NestedArray.

这可以在打字稿中实现吗?

Tit*_*mir 10

类型别名不能引用自己,所以这种天真的方法将失败:

type NestedArray = Atom | Array<NestedArray | Atom> //Type alias 'NestedArray' circularly references itself.
Run Code Online (Sandbox Code Playgroud)

然而,接口可以参考自己:

interface NestedArray extends Array<NestedArray | Atom> {

}
Run Code Online (Sandbox Code Playgroud)

我们可以在顶层定义一个额外的联合来处理根情况:

type Atom = string | boolean | number

interface NestedArray extends Array<NestedArray | Atom> {

}

type AtomOrArray = Atom | NestedArray;

//Usage
let foo: AtomOrArray = [
    "",
    1, 
    [1, 2, ""]
]   

let bar: AtomOrArray =  ""
Run Code Online (Sandbox Code Playgroud)