typescript - 从 TypeScript 静态方法访问实例类型
问题描述
在基类的静态方法中,是否可以命名当前类的实例类型?
换句话说,你能不能做这个代码类型检查:
class Base {
static addInitializer(i: (v: any /* What type would go here? */) => void) {
// implementation is irrelevent
}
}
class Dog extends Base {
bark() {}
}
class Fish extends Base {
swim() {}
}
Dog.addInitializer((dog) => {
dog.bark();
// @ts-expect-error
dog.swim();
});
Fish.addInitializer((fish) => {
fish.swim();
// @ts-expect-error
fish.bark();
});
注意// @ts-expect-error
应该是类型错误的前行的使用。它们被突出显示为“未使用”,因为v
具有类型any
而不是我在这里尝试命名的类型。
解决方案
通过使静态方法通用并受静态方法的this
参数约束,您可以使调用静态方法的类的类型可用。从那里,只需使用InstanceType
运算符,如下所示:
class Base {
static addInitializer<T extends new (...args: any) => Base>(this: T, init: (e: InstanceType<T>) => void) {
// implementation is irrelevent
}
}
class Dog extends Base {
bark() {}
}
class Fish extends Base {
swim() {}
}
Dog.addInitializer((dog) => {
dog.bark();
// @ts-expect-error
dog.swim();
});
Fish.addInitializer((fish) => {
fish.swim();
// @ts-expect-error
fish.bark();
});
推荐阅读
- vue.js - 在 VueJS 的字符串中使用动态 ID
- oracle - 基于 if 条件的 oracle 查询序列
- sql - Oracle SQL 正则表达式替换
- arrays - 如何读取具有二进制值的文本文件,其中每一行都是使用 Numpy 的二进制向量本身?
- java - 当我从抽象类扩展时,会执行任何操作吗?
- reactjs - React 功能组件:立即调用 getElementById 返回 null
- angular - 反应式表单不显示在 html 中
- python-3.x - 在 Chrome 中打开链接后,我可以终止 Webbrowser 实例吗?
- gcc - 使用 GCC 编译器编译 RISC-V 代码
- ruby-on-rails - 在 Rails 应用程序中将“belongs_to”添加到模型后测试失败