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

