如何让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
相关产品推荐
相关产品推荐

