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

如何在不修改库的情况下从继承未导出父类的类提取自身属性类型

问题描述

给定如下TypeScript代码:

class Arachnid {
    numberOfLegs: number = 8;
}
export class Spider extends Arachnid {
    numberOfEyes: number = 2;
}

需求:基于Spider创建一个仅包含numberOfEyes属性的类型,但无法使用type WolfSpider = Omit<Spider, keyof Arachnid>(因为Arachnid未导出),在不修改库代码的前提下如何实现?

解决方案

方法一:通过原型链类型推导实现通用排除

可以利用类的原型链在类型层面间接获取未导出父类的属性集合,再结合Omit实现需求:

// 从Spider的原型链推导未导出父类的原型类型
type ArachnidPrototype = typeof Spider.prototype extends { __proto__: infer P } ? P : never;
// 排除父类属性,仅保留Spider自身的属性
type WolfSpider = Omit<Spider, keyof ArachnidPrototype>;

// 验证:WolfSpider仅包含numberOfEyes属性
const validSpider: WolfSpider = { numberOfEyes: 2 }; // 类型校验通过
// const invalidSpider: WolfSpider = { numberOfLegs: 8 }; // 类型错误,符合预期

如果需要复用这个逻辑,可以封装成通用工具类型:

// 提取子类自身属性的通用工具类型
type OwnProps<T extends object> = typeof T.prototype extends { __proto__: infer P } 
  ? Omit<T, keyof P> 
  : T;

// 使用示例
type WolfSpider = OwnProps<Spider>;

方法二:直接Pick已知属性

如果明确知道需要保留的属性名称,直接用Pick更简洁:

type WolfSpider = Pick<Spider, 'numberOfEyes'>;

这种方式适合属性数量少且固定的场景,代码更直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:18:18