我们假设我们尝试创建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.
有解决方法吗?
答案 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)
答案 3 :(得分:-2)
看起来有一个循环引用。编译器不喜欢这样,最好不要尝试解决方法。