【发布时间】:2021-09-04 21:52:47
【问题描述】:
我想用 TypeScript 写一个解释器。这种语言有两种基本类型,我将它们定义如下。
type DataType = { kind: 'number' } | {kind: 'string' }
然后我想定义另一种类型,也包括它的实例。
type _DataType<T extends 'type' | 'typedValue'> = {
kind: 'number',
value: T extends 'type' ? undefined : number,
} | {
kind: 'string'
value: T extends 'type' ? undefined : string,
}
type DataType = _DataType<'type'>;
type TypedValue = _DataType<'typedValue'>;
效果很好。但是当我想定义一个像数组这样的高阶类型时,它可以将原始DataType 作为参数。我不知道如何定义它。以下是我尝试过的:
type _HigherType<T extends 'type' | 'typedValue'> = {
kind: 'Array',
t: DataType,
value: Array<?????>
} | {
kind: 'Single',
t: DataType,
value: ?????
}
type HigherType = _HigherType<'type'>;
type HigherTypedValue = _HigherType<'typedValue'>;
貌似value的类型依赖于t的类型,但是如何表达它们的关系呢?
也许我可以像下面这样扩展HigherType:
type _HigherType<T extends 'type' | 'typedValue'> = {
kind: 'Array',
t: { kind: 'number },
value: T extends 'type' ? undefined : Array<number>
} | {
kind: 'Array',
t: { kind: 'string' },
value: T extends 'type' ? undefined : Array<string>
} | {
kind: 'single',
t: { kind: 'number' },
value: T extends 'type' ? undefined : number
} | {
kind: 'single',
t: { kind: 'string' },
value: T extends 'type' ? undefined : string
}
但是如果有m个DataType变体和n个HigherType(尽管有Array,我们可能有Option, Set,......),我们需要写m*n个变体,而且大部分都有重复的部分。有没有办法只定义 m + n 个变体?
【问题讨论】:
标签: typescript typescript-typings typescript-generics