【发布时间】:2017-04-10 22:35:38
【问题描述】:
是否可以在可区分的联合类型上定义诸如通用匹配函数之类的东西? 假设我们有以下类型定义:
const Kinds = {
A: 'A',
B: 'B',
};
type Kind = typeof Kinds.A | typeof Kinds.B;
type Value = A | B;
interface A {
kind: Kinds.A
}
interface B {
kind: Kinds.B
}
使用 switch 语句可以定义匹配函数,如:
interface Matcher<T> {
Kinds.A: (value: A) => T
Kinds.B: (value: B) => T
}
function match<T>(matcher: Matcher<T>) {
return function(value: Value) {
switch (value.kind) {
case Kinds.A: return matcher[Kinds.A](value);
case Kinds.B: return matcher[Kinds.B](value);
}
}
}
它可以完成这项工作,但是定义这样的函数非常繁琐,尤其是当一个有很多工会成员时。
是否有可能以某种方式简化此定义,可能使用Mapped Types 或来自最新 2.1 分支的其他现有方式。
我在玩“映射类型”,但我不确定是否真的有可能获得具体的Value,即使我知道Kind,例如某些东西喜欢:
type Matcher<T> = {[P in Kind]: (value: P) => T};
function match<T>(matcher: Matcher<T>) {
return function(value: Value) {
return matcher[value.kind](value);
}
}
但实际上可以将 P 转换为相应的 Value 类型。
【问题讨论】:
标签: generics typescript typescript2.1