如何使用父静态方法在TypeScript中创建子类?

zoo*_*man 4 design-patterns factory-pattern typescript

我有两个类:模型和用户.用户扩展了模型.

export Model {
  id: number;
  static fromData<T>(data: any): T {
    return Object.assign(new Model(), data);
  }
}

export User extends Model {
  name: string;
  sayHi(): string {
    return 'Hi, ' + this.name;
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用它的方式如下:

const currentUser = User.fromData(dataFromServer);
const message = currentUser.sayHi();
Run Code Online (Sandbox Code Playgroud)

方法hi()不起作用,因为我已经创建了Model类的实例.

如何使用TypeScript泛型使用基类静态方法获取派生类的实例?

我正在计划一些共同的不同实体.

我看到了这个答案,但我不知道在我的情况下如何将参数传递给静态方法.

Tit*_*mir 13

由于静态方法在类本身上,我们可以this在静态方法内部使用类构造函数,this类是iself.如果我们this将static方法的参数约束为构造函数returns T(this: new ()=> T),我们将获得返回值的正确输入.该this参数只是为了打字稿编译器的好处,它实际上不会发送给JS,你不必显式传递它:

export class Model {
    id: number;
    static fromData<T>(this: new () => T, data: any): T {
        return Object.assign(new this(), data);
    }
}

export class User extends Model {
    name: string;
    sayHi(): string {
        return 'Hi, ' + this.name;
    }
}

const currentUser = User.fromData({ id: 10, name: ""});
const message = currentUser.sayHi();
Run Code Online (Sandbox Code Playgroud)

游乐场链接

  • @Paleo它是几个东西的混合,`this:`是你可以在成员函数https://github.com/Microsoft/TypeScript/issues/3694上指定`this`的类型.`new()=> T`只是一个构造函数签名,(类似于函数签名但可以用`new`调用).由于参数推理的工作方式,整个过程都有效. (4认同)