TypeScript中的递归类型

时间:2017-12-16 03:29:00

标签: typescript

我们假设我们尝试创建HTML构建助手

build([
  'html', { lang: 'en' }, [
    ['head', [
      ['title', 'Hello, world!']
    ]
  ]
])

build的参数的类型声明将是(实际上它会更复杂,但让我们考虑最简单的情况)

type Node = [string, { [key: string]: string }, Node[]]

不幸的是,id不起作用,因为TypeScript抱怨

TS2456: Type alias 'Node' circularly references itself.

有解决方法吗?

4 个答案:

答案 0 :(得分:6)

现在可以从打字稿3.7开始完成:https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#more-recursive-type-aliases

例如:

type ValueOrArray<T> = T | ValueOrArray<T>[];
type NestedStringArray = ValueOrArray<string>;

const nestedStringArray: NestedStringArray = [
  'hello',
  ['w', ['o', 'r', 'l'], 'd'],
];

答案 1 :(得分:5)

类型别名不能是循环的,但接口可以。这实现了你想要的:

type MyTuple<T> = [string, { [key: string]: string }, T[]];
interface Node extends MyTuple<Node> { }

答案 2 :(得分:5)

很快,使用递归类型引用https://github.com/microsoft/TypeScript/pull/33050

答案 3 :(得分:-2)

看起来有一个循环引用。编译器不喜欢这样,最好不要尝试解决方法。