typescript - 在泛型中使用类类型
问题描述
让我们在这里看看这个例子: https ://www.typescriptlang.org/docs/handbook/2/generics.html#using-class-types-in-generics
我需要做的就是在实例化之前调用一个静态方法,所以让我们修改示例如下:
class BeeKeeper {
hasMask: boolean = true;
}
class ZooKeeper {
nametag: string = "Mikle";
}
class Animal {
static beforeInit() {
console.log('do something here');
};
numLegs: number = 4;
}
class Bee extends Animal {
static beforeInstantiate() {
console.log('do some bee stuff here');
};
keeper: BeeKeeper = new BeeKeeper();
}
class Lion extends Animal {
static beforeInstantiate() {
console.log('do some lion stuff here');
};
keeper: ZooKeeper = new ZooKeeper();
}
function createInstance<A extends Animal>(c: new () => A): A {
c.beforeInstantiate(); // TS2339: Property 'beforeInit' does not exist on type 'new () => A'.
return new c();
}
createInstance(Lion).keeper.nametag;
createInstance(Bee).keeper.hasMask;
我所做的只是static
在类中添加一个方法Animal
,并在实例化之前在函数中调用它createInstance
,我得到了以下错误: TS2339: Property 'beforeInit' does not exist on type 'new () => A'.
我应该如何修改类型c
以使打字稿了解静态函数?
解决方案
您可以像这样使类型c
更具体:
c: (new () => A) & { beforeInstantiate: () => void }
或者像这样:
c: { new (): A, beforeInstantiate: () => void }
这些类型都说c
必须是 的构造函数A
,并且c
还必须具有静态beforeInstantiate
属性。
顺便说一句,您的示例beforeInit
在 Animal 中使用,但beforeInstantiate
在其他示例中使用。您可能希望使它们相同。
推荐阅读
- javascript - D3条形图未以角度5呈现
- spring - JPA 没有找到类型 Product 的属性 findAll
- r - dplyr 在每一列的变异分别具有几个参数的自定义函数
- google-chrome - 在 Chrome 浏览器中执行 Selenium 脚本时无法加载扩展错误
- javascript - Knex.js 非终止函数
- typescript - TypeScript 3.0 `unknown` 类型作为 `any` 或 `generics` 的替代品?
- javascript - 在每次迭代中以索引作为参数的循环中添加 EventListener
- regex - 正则表达式匹配 JLex 中的字符串
- node.js - 在 graphQL 中自定义 json 响应
- javascript - 使用 jQuery AJAX 删除记录之前的确认警报不起作用