【发布时间】:2019-11-21 02:10:25
【问题描述】:
我如何编写一个 TypeScript 函数来确保一个参数是一个恰好包含另一个(更具体的)联合的联合?例如:
type Command = {
name: string
[key: string]: any
}
type Insert = { name: 'insert'; text: string }
type Delete = { name: 'delete'; position: number }
type CoreCommand = Insert | Delete
type Replace = { name: 'replace'; position: number; text: string }
type CustomCommand = CoreCommand | Replace
const exec = <T ???>(command: T) => {
switch (command.name) {
case 'insert':
// ...
break
case 'delete':
// ...
break
// ...
}
}
在上面的代码中,如何确保T 泛型类型保证包含CoreCommand 联合类型,同时仍然满足其他“自定义”命令?
能否确保自定义命令与核心命令不冲突?
【问题讨论】:
-
TypeScript 没有下界泛型,所以你不能这样做,为什么不用像
<T>(command: T | CoreCommand) => ...这样的东西? -
嘿@jcalz,它看起来确实与那个相似。我认为
T | CoreCommand的问题在于,由于我不能保证T和CoreCommand不会发生冲突,那么如果我在执行程序中使用switch,我不能保证command.name === 'insert_text'意味着我正在使用核心Insert命令了。 -
我想真正的问题是如何扩展 discriminated 联合并保持歧视有效?同时允许“核心”功能接受任何潜在的扩展,而不关心扩展位?
-
Exclude<T, { name: CoreCommand['name'] }> | CoreCommand那么呢?
标签: typescript generics union