【发布时间】:2021-06-02 12:14:11
【问题描述】:
我有一个类型,它是通用接口与 2 个通用类型的联合。其中一个是枚举,另一个对于每个枚举值都不同。
调用函数时,TS 根据函数调用中的枚举值正确识别数据类型,但不明白返回值应该与该对象的属性之一相同
代码:
interface Base<D = any, T = string> {
data: D;
type: T;
}
enum BaseTypes {
foo,
bar,
boo,
}
type BaseSet = Base<number, BaseTypes.foo> | Base<string, BaseTypes.bar> | Base<{d: number}, BaseType.boo>;
function processData(payload: BaseSet): typeof payload.data {
return payload.data;
}
// a type should be number
// but it's number | string
const a = processData({ data: 1, type: BaseTypes.foo });
我的理解是a的类型应该继承自payload数据类型,在这种情况下应该是string。我的两个问题是:
- 为什么它不起作用?
- 我怎样才能让它工作?
【问题讨论】:
-
payload不是泛型的返回类型是Base<D = any, T = string>.data: string | number。我们可以通过使函数泛型来解决这个问题。我会写一个答案。
标签: typescript types typescript-generics