如何严格标注函数参数为Parent的子类类本身(非父类及实例)类型
解决方案
要实现这个严格的类型标注,我们可以通过构造函数类型约束 + 排除父类自身的方式来实现:
1. 定义目标类型
先定义两个核心类型:
- 匹配所有能生成
Parent实例的构造函数(包含父类和子类) - 通过
Exclude工具类型排除Parent类本身,仅保留其子类的构造函数类型
// 匹配所有能构造出Parent实例的构造函数 type ParentConstructor = new (...args: any[]) => Parent; // 排除Parent自身,仅保留子类构造函数 type ValidParentSubclass = Exclude<ParentConstructor, typeof Parent>;
2. 标注函数参数
将函数fn的参数类型指定为ValidParentSubclass:
function fn(cls: ValidParentSubclass) {}
3. 验证效果
按照需求测试:
fn(Parent):类型检查失败(被排除的父类构造函数)fn(new ChildA()):类型检查失败(传入的是实例而非构造函数)fn(new ChildB()):类型检查失败(同上)fn(ChildA):类型检查通过(符合子类构造函数类型)fn(ChildB):类型检查通过(同上)
补充说明
- 如果子类有自定义构造参数,
(...args: any[])会自动兼容任意参数列表的构造函数,无需额外调整。 - 这里利用TypeScript的
Exclude工具类型实现精确的类型排除,确保只有Parent的子类构造函数能通过校验。
内容的提问来源于stack exchange,提问作者Michael Moreno
相关产品推荐
相关产品推荐

