Рекурсивный тип массива typescript

скажем, у меня есть тип type Atom = string | boolean | number. Я хочу определить тип массива, например:

NestedArray = Atom | [a_0, a_1, ... , a_n] каждая a_i это Atom или NestedArray.

может ли это быть достигнуто в Typescript?

1 ответов


псевдонимы типов не могут ссылаться на себя, поэтому этот наивный подход потерпит неудачу:

type NestedArray = Atom | Array<NestedArray | Atom> //Type alias 'NestedArray' circularly references itself.

интерфейсы могут, однако, ссылаться на себя:

interface NestedArray extends Array<NestedArray | Atom> {

}

и мы можем определить дополнительное объединение на верхнем уровне для обработки корневого случая:

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 =  ""