如何在TypeScript中创建交集必填、差异字段可选的泛型类型?
实现方案
你可以通过TypeScript的内置工具类型组合,自定义一个通用工具类型来实现这个需求。核心思路是拆分出公共必填字段、类型A独有可选字段、类型B独有可选字段三部分,再将它们交叉合并。
步骤1:定义通用工具类型
type MergeWithRequiredCommon<T, U> = // 提取两个类型的公共字段并设为必填 { [K in Extract<keyof T, keyof U>]: T[K] } & // 提取类型A独有的字段并设为可选 Partial<{ [K in Exclude<keyof T, keyof U>]: T[K] }> & // 提取类型B独有的字段并设为可选 Partial<{ [K in Exclude<keyof U, keyof T>]: U[K] }>;
步骤2:测试示例
先定义两个待合并的类型:
type UserBasic = { id: string; username: string; age: number; }; type UserProfile = { id: string; username: string; address: string; avatarUrl: string; };
使用工具类型合并后:
type MergedUser = MergeWithRequiredCommon<UserBasic, UserProfile>; // MergedUser 的实际类型为: // { // id: string; // username: string; // age?: number; // address?: string; // avatarUrl?: string; // }
特殊情况说明
如果两个类型的公共字段类型不一致(比如UserBasic的id是number,UserProfile的id是string),交叉后该字段类型会变成number & string(即never类型)。这种情况下可以根据需求调整公共字段的类型定义,比如改为取联合类型:
type MergeWithRequiredCommon<T, U> = { [K in Extract<keyof T, keyof U>]: T[K] | U[K] } & Partial<{ [K in Exclude<keyof T, keyof U>]: T[K] }> & Partial<{ [K in Exclude<keyof U, keyof T>]: U[K] }>;
内容的提问来源于stack exchange,提问作者Noy Oliel
相关产品推荐
相关产品推荐

