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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:25:17