typescript - 类类型作为 TypeScript 中的参数
问题描述
当参数是特定类型的类时,我有点坚持 TypeScript 中的类型提示。我正在尝试实现一个事件系统,当我使用来自 TypeScript 游乐场的代码时,一切都适用于纯 JavaScript。但是,标准编译导致“TS2693:'C1'仅指一种类型,但在此处用作值”的错误。如何键入提示此方法?
function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: typeof C1, c2: typeof C2, callback: (arg1: C1, arg2: C2) => void){
// ...
}
完整示例:
abstract class BaseClass {}
const dict = {}
function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: typeof C1, c2: typeof C2, callback: (arg1: C1, arg2: C2) => void){
dict[c1] = dict[c1] || {};
dict[c1][c2] = dict[c1][c2] || [];
dict[c1][c2].push(callback);
}
class MyClass1 extends BaseClass{}
class MyClass2 extends BaseClass{}
method(MyClass1, MyClass2, (arg1: MyClass1, arg2: MyClass2) => {
console.log("Callback");
});
const c1 = new MyClass1();
const c2 = new MyClass2();
dict[MyClass1][MyClass2][0](c1, c2);
解决方案
TypeScript 中的类的行为不像你想象的那样。直接从 TS 解释器检查这个片段:
~ ts-node
> class a {}
undefined
> typeof a
'function'
它表明这a
只是一个函数,因此参数类型提示将评估为文字字符串'function'
!
> function b(param: a) { console.log(param) };
> b(a)
[Function: a]
> b(new a())
a {}
上面的代码是如何正确使用类类型作为参数的示例。不需要typeof
。在您的代码中,它可能看起来像这样:
function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: C1, c2: C2, callback: (arg1: C1, arg2: C2) => void){
// ...
}
如果您的意思是您想要实际传递类类型本身,那么您需要解决 TS 的反射限制。您可以将类型作为返回类型的函数传递:
function method
<C1 extends BaseClass, C2 extends BaseClass>
(c1: new () => C1, c2: new () => C2, callback: (arg1: C1, arg2: C2) => void){
new c1() instanceof C1; // true
new c2() instanceof C2 // true
c1 instanceof C1 // false
}
多田!
推荐阅读
- python - 从 Seaborn 散点图中删除两个图例中的一个
- javascript - 如何通过 MapView 区域更改更改 TouchableOpacity 颜色?
- reactjs - 材质 ui 样式不适用
- php - Xcode的手动配置
- java - 如何设置 VSCODE 来创建 Maven 项目?
- sql - 每笔交易的最后记录
- sql - 我们可以在oracle中将日期插入varchar2而不用to_char转换吗?
- linux - Hexeditted 共享库“未找到版本 x.so”错误
- linux - 如何使用动态指定的文件路径在程序集中创建文件?
- node.js - bootstrap 和 npm - 如何在我的项目中仅导入“reboot.scss”文件?