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

如何让TypeScript条件类型正确处理相似对象类型?

解决TypeScript条件类型中子类型匹配错误的问题

问题原因

TypeScript采用结构类型系统,Bucket类型包含了Household的所有属性,因此Bucket会被视为Household的子类型。当你的条件类型先判断Document extends HouseholdDocType时,Bucket会满足该条件,从而返回Household类型,跳过后续的Bucket分支判断。

解决方案

1. 调整条件分支顺序

将更具体的类型(Bucket)的判断放在前面,让Bucket类型优先匹配对应分支,返回正确类型:

export type RawObjectToDoc<Document extends DocType> = Document extends BucketDocType
  ? Bucket
  : Document extends HouseholdDocType
  ? Household
  : never

2. 用排除法缩小匹配范围

在判断Household时,排除掉Bucket类型,确保只有纯粹的Household类型才会匹配该分支:

export type RawObjectToDoc<Document extends DocType> = Document extends BucketDocType
  ? Bucket
  : Document extends Exclude<HouseholdDocType, BucketDocType>
  ? Household
  : never

3. 添加唯一标识属性(推荐)

给Household和Bucket添加一个唯一的字面量属性(比如type),让两个类型有明确区分,彻底避免子类型混淆:

export type Household = {
  id: string
  createdAt: number
  updatedAt: number
  name: string
  type: 'household' // 唯一标识
}

export type Bucket = {
  id: string
  createdAt: number
  updatedAt: number
  name: string
  ownerId: string
  balance: number
  type: 'bucket' // 唯一标识
}

// 对应的DocType定义可基于标识调整
type DocType = Household | Bucket
type HouseholdDocType = Household
type BucketDocType = Bucket

export type RawObjectToDoc<Document extends DocType> = Document extends HouseholdDocType
  ? Household
  : Document extends BucketDocType
  ? Bucket
  : never

这种方式通过明确的类型标识让TypeScript精准区分两个类型,是最可靠的解决方案。

内容的提问来源于stack exchange,提问作者Chris Drackett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:24