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

TypeScript:如何实现仅含多类型公共属性的类?

如何在TypeScript中提取多个类型的公共属性并让类实现

你需要的是自动推导多个类型的公共属性集合,而非联合或交叉类型。可以通过keyof操作符提取类型的键,再结合Pick工具类型筛选出公共属性,完美匹配你的需求。

基础实现(两个类型场景)

type TypeA = { a: string, b?: string }
type TypeB = { a: string, c?: string }

// 提取TypeA和TypeB的公共键
type CommonKeys = keyof TypeA & keyof TypeB;
// 从任意一个类型中选取公共键对应的属性,得到公共属性类型
type CommonType = Pick<TypeA, CommonKeys>;

// 类可以正常实现这个公共属性类型
class CommonClass implements CommonType {
    a = 'a';

    checkCommonProperties() {
        let x: CommonType = { a: '' }; // 完全符合类型要求
    }
}

通用工具类型(提升复用性)

如果需要频繁处理多类型公共属性提取,可以封装成通用工具类型:

// 提取两个类型的公共属性
type CommonProperties<T extends object, U extends object> = Pick<T, keyof T & keyof U>;

// 使用示例
type CommonType = CommonProperties<TypeA, TypeB>; // 结果:{ a: string }

扩展到三个及以上类型

如果需要处理更多类型,可通过递归逻辑实现通用提取:

// 递归提取多个类型的公共键
type CommonKeys<T extends object[]> = T extends [infer First, ...infer Rest]
  ? keyof First & (Rest extends object[] ? CommonKeys<Rest> : never)
  : never;

// 基于公共键提取公共属性类型
type CommonProperties<T extends object[]> = T extends [infer First, ...infer Rest]
  ? Pick<First, CommonKeys<T>>
  : never;

// 使用示例
type TypeC = { a: string, d?: number };
type CommonTypeABC = CommonProperties<[TypeA, TypeB, TypeC]>; // 结果:{ a: string }

关键区别说明

  • 联合类型无法被类实现的原因:联合类型表示“属于多个类型中的某一个”,但类的实例必须同时满足所有实现类型的全部要求,TypeScript无法确定类需要实现联合类型中的哪些属性,因此会抛出2422错误。
  • 交叉类型的差异:交叉类型TypeA & TypeB会包含两个类型的所有属性(包括可选的b和c),这和你想要的“仅公共属性”需求不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:15:33