【发布时间】:2021-02-13 06:04:01
【问题描述】:
我有两个自定义类型
type TypeA = string | number;
type TypeB = string | boolean;
我使用上述方法创建了一个交集type。
type Combined = TypeA & TypeB;
当然,Combined 类型将仅属于 string 类型,因为它是 TypeA 和 TypeB 之间唯一相交的类型。
但如果我更改 TypeB 的 union 并添加 Date 类型,我会得到一个意外的行为,例如: p>
type TypeA = string | number;
type TypeB = string | boolean | Date;
创建一个新的交叉点类型
type Combined = TypeA & TypeB;
如果我检查类型的签名,它看起来像这样
type Combined = string | (string & Date) | (number & Date)
我的问题是为什么会这样?这是预期的吗?我认为它会是 string 类型,因为它是 相交 的唯一 type。
【问题讨论】:
-
这可能是 TypeScript 中的一个错误,但
string & number是never,string & Date是string & Date,但我看不出你可以为string & Date分配什么值。 -
@ExplosionPills 这是一个错误吗?在我看来(可能很奇怪)实际上交叉口不是空的。例如,考虑表达式
Object.assign(0, new Date())...的结果... -
@CRice 不确定,但这似乎只是 0。您也可以通过
Object.assign(0, '') -
是的,我认为它只是
0。Object.assign只是在欺骗类型系统,因为它的签名设置为返回其参数类型的交集。产生的实际值不能用作Date对象,正如其类型所暗示的那样。我仍然不完全相信结果应该是never,但我认为我可以通过一些原型操作获得一个既可用作数字又可用作日期的值。 -
我只是说 TypeScript 将
string & number的 type 视为never: typescriptlang.org/play?#code/…
标签: typescript types intersection