TypeScript声明文件中如何定义类继承另一类实例的类型?
如何在TypeScript中描述绑定到特定实例的原型继承
要解决这个问题,核心是让TypeScript识别每个Thing实例的Child都是独一无二的构造函数——它们虽然行为相似,但原型链完全独立。我们可以通过泛型和构造函数类型来精准描述这种关系。
步骤1:先声明基础类型
首先要给ParentInstance和ChildInstance这两个工厂函数定义准确的类型,让TypeScript理解它们返回的是动态生成的类构造函数:
// 声明基础Parent类 declare class Parent {} // ParentInstance是一个工厂函数,返回继承自Parent的新类构造函数 declare const ParentInstance: () => new () => Parent; // ChildInstance是泛型工厂函数:接收一个父类构造函数,返回继承它的新类构造函数 // 泛型T会捕获传入的父类类型,确保返回的子类实例类型和父类匹配 declare const ChildInstance: <T extends new () => Parent>(InstanceParent: T) => new () => InstanceType<T>;
步骤2:用泛型定义Thing类
接下来,我们给Thing类添加泛型参数,用来标记当前实例专属的Child构造函数类型。这样TypeScript就能区分不同Thing实例的Child类型:
// 泛型TChild代表当前Thing实例专属的Child构造函数类型 // 默认值设为ChildInstance的返回类型,避免手动指定泛型参数 declare class Thing<TChild extends new () => Parent = ReturnType<typeof ChildInstance>> { // 每个Thing实例的ParentInstance都是独立的子类构造函数 ParentInstance: ReturnType<typeof ParentInstance>; // Child是当前实例专属的构造函数,类型由泛型TChild标记 Child: TChild; constructor(); }
验证效果
现在TypeScript可以正确识别每个Thing实例的Child是独立的:
let thing1 = new Thing(); let thing2 = new Thing(); let childOf1 = new thing1.Child(); childOf1 instanceof thing1.Child; // TypeScript推断为true childOf1 instanceof thing2.Child; // TypeScript推断为false(因为两个Child是不同类型)
为什么这样可行?
- 泛型
TChild会为每个Thing实例捕获独一无二的Child构造函数类型,确保不同Thing的Child不会被混淆。 InstanceType<T>工具类型可以提取构造函数T的实例类型,让TypeScript知道new thing1.Child()创建的实例属于thing1专属的类型。
内容的提问来源于stack exchange,提问作者KCE
相关产品推荐
相关产品推荐

