我有一个抽象类,它将接受传递到构造函数中的任何数据,并将其分配给实例.目标是您可以使用实例数据的子集来初始化实例.

我遇到的问题是,一旦扩展了抽象类,子类构造函数就需要一个类型为Partial<AbstractParent>的参数,而不是Partial<Child>.

我已经能够使用静态的Create方法、泛型和this参数的用法来模拟这种模式,但如果我能够使用构造函数来实现这一点,我会更愿意.

Minimal reproducible example

interface ResourceConstructor {
  new(data: Partial<Resource>): Resource

  create<T extends ResourceConstructor>(this: T, data: Partial<InstanceType<T>>): InstanceType<T>;
}

abstract class Resource {
  public abstract id: number;

  constructor(data: Partial<Resource>) {
    Object.assign(this, data);
  }

  static create<T extends ResourceConstructor>(this: T, data: Partial<InstanceType<T>>): InstanceType<T> {
    const instance = new this(data) as InstanceType<T>;
    return instance;
  }
}

class MyResource extends Resource {
  id: number = 1;
  someField: string = 'value';
}

const myResource = new MyResource({ someField: 'hello world' }); 
//this produces an error "Argument of type '{ someField: string; }' is not assignable to parameter of type 'Partial<Resource>'"

const anotherResource = MyResource.create({ someField: 'hello world' });

推荐答案

从概念上讲,您希望构造函数接受类型Partial<this>的参数,使用polymorphic this type.遗憾的是,您目前不能在类的静态端的参数类型中使用多态this,它包括constructor方法.在microsoft/TypeScript#5863,更具体地说,在microsoft/TypeScript#38038,有对此的长期开放功能请求.在这些实现之前,您无法直接表达您想要的内容.

就目前而言,你只需要解决这个问题.正如在这些问题中提到的,一种流行的解决方法是使用genericthis parameter的静态方法.当然,这意味着您需要使用Ctor.create()而不是new Ctor().我将解释如何做到这一点,除非您已经找到了这种变通方法,并在示例代码中实现了它.哦,好吧,恐怕目前没有比这更好的了.

Typescript相关问答推荐

您可以创建一个类型来表示打字员吗

在Angular中,如何在文件上传后清除文件上传文本框

有没有可能使用redux工具包的中间件同时监听状态的变化和操作

使用React处理Websocket数据

对深度对象键/路径进行适当的智能感知和类型判断,作为函数参数,而不会触发递归类型限制器

是否使用非显式名称隔离在对象属性上声明的接口的内部类型?

为什么在这个例子中,我把缺少的属性添加到对象中时,TypeScrip没有拾取,如何修复?

如何在Reaction Query Builder中添加其他字段?

AngularJS服务不会解析传入的Json响应到管道中的模型

笛卡尔产品类型

基元类型按引用传递的解决方法

有没有办法取消分发元组的联合?

如何键入并类型的函数&S各属性

是否可以定义引用另一行中的类型参数的类型?

如何在Type脚本中创建一个只接受两个对象之间具有相同值类型的键的接口?

如何在Vue动态类的上下文中解释错误TS2345?

TypeScript中的这些条件类型映射方法之间有什么区别?

JSX.Element';不可分配给类型';ReactNode';React功能HOC

必须从注入上下文调用Angular ResolveFn-inject()

const 使用条件类型时,通用类型参数不会推断为 const