You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:22:08