这有效(游乐场):
type SimpleExpression = number | string | AddOperator<SimpleExpression> | PrintOperator<SimpleExpression>;
type ExtendedExpression = number | string | AddOperator<ExtendedExpression> | PrintOperator<ExtendedExpression> | PowerOperator<ExtendedExpression>;
Run Code Online (Sandbox Code Playgroud)
但是提取公共子类型不起作用(Playground):
type CommonExpression<E> = number | string | AddOperator<E> | PrintOperator<E>;
type SimpleExpression = CommonExpression<SimpleExpression>;
type ExtendedExpression = CommonExpression<ExtendedExpression> | PowerOperator<ExtendedExpression>;
Run Code Online (Sandbox Code Playgroud)
有什么办法可以解决吗?
最近 TypeScript (3.7) 得到了对递归类型的扩展支持,但仍然不是一切皆有可能。
StackOverflow 上有很多解释递归类型的问题,但有一种有用的模式我找不到解决方案。
起点是一个表达式树,其中每个运算符都有作为表达式的子项。这有效:
type Expression = number | string | AddOperator | PrintOperator;
interface AddOperator {
'first': Expression;
'second': Expression;
}
interface PrintOperator {
'value': …Run Code Online (Sandbox Code Playgroud)