typescript - 打字稿。如何实现泛型接口的构造函数
问题描述
我用构造函数定义了通用接口,然后实现它但有一个错误'TS2420 Type Resetter provides no match for the signature new (defaultValue: (...args: any[]) => T): IResetter<T>
'
interface IResetter<T> {
new (defaultValue: (...args: any[]) => T): IResetter<T>;
get (): T;
set (customValue: T);
reset ();
}
class Resetter<T> implements IResetter<T> {
private customValue: T = null;
constructor (private defaultValue: (...args: any[]) => T) { }
public get () {
return this.customValue || this.defaultValue(arguments);
}
public set (customValue) {
this.customValue = customValue;
}
public reset () {
this.customValue = null;
}
}
我不明白我做错了什么。
解决方案
构造函数签名不是类实例类型的一部分,它是类的“静态”端的一部分。您不能通过实现接口来强制类实现特定的构造函数。您可以为类的静态端创建一个接口,当类分配给该接口时,我们将遇到错误:
interface IResetter<T> {
get (): T;
set (customValue: T): void;
reset (): void;
}
interface IResetterConstructor {
new <T>(defaultValue: (...args: any[]) => T): IResetter<T>;
}
class Resetter<T> implements IResetter<T> {
private customValue: T | null = null;
constructor (private defaultValue: (...args: any[]) => T) { }
public get () {
return this.customValue || this.defaultValue(arguments);
}
public set (customValue: T) {
this.customValue = customValue;
}
public reset () {
this.customValue = null;
}
}
function createNumberResetter(ctor: IResetterConstructor) {
return new ctor(() => 1);
}
createNumberResetter(Resetter) //ok
createNumberResetter(class { }) //err ctor not ok
推荐阅读
- javascript - 如何过滤对象数组以查找共享交叉引用属性的对象
- python - 了解主角
- boto3 - AWS EFS 挂载到 ECS Fargate 任务突然失败
- git - Azure DevOps,如何从上传到存储库的文件中获取时间戳?
- css - 如何使 AntDesign List 中的 Card 组件与 css 具有相同的高度?
- c++ - 成员函数指针作为没有 `std::mem_fn` 的普通函数指针
- javascript - DialogFlow 代理不返回嵌套 axios 的结果
- java - 地图的 JSON 表示
- r - 尝试根据 Shiny App 中的用户输入更新表格
- node.js - 带有条件的MongoDB find() 不起作用