为什么TypeScript中类型A与B不等价?赋值差异解析
为什么TypeScript中类型A和B不等价?
先看两个类型的定义:
type A = { prop: string } | { prop: number }; type B = { prop: string | number }
核心差异在于类型的结构本质:
- 类型A是两个独立对象类型的联合,它的实例必须严格匹配联合中的某一个成员——要么是
{ prop: string },要么是{ prop: number },每个实例的prop类型是明确的单一值类型。 - 类型B是单个对象类型,它只要求
prop的类型是string | number,允许prop的类型在运行时是不确定的联合类型(比如一个值可能是string也可能是number,无法提前确定)。
举个实际例子就能明白:
// 这些都能同时赋值给A和B,因为它们明确匹配A的某一个子类型 const validA1: A = { prop: "foo" }; const validA2: A = { prop: 123 }; // 这个只能赋值给B,无法赋值给A const validB: B = { prop: Math.random() > 0.5 ? "bar" : 456 };
validB的prop类型是string | number,TypeScript无法确定它到底属于A的哪个子类型,因此不允许赋值给A。
总结来说:
- A的实例必然满足B的约束(因为每个A的实例的
prop都是string或number),所以A可以赋值给B; - B的实例可能存在
prop类型不确定的情况,无法匹配A的任一子类型,因此不能赋值给A。
内容的提问来源于stack exchange,提问作者Ashish Yadav
相关产品推荐
相关产品推荐

