【问题标题】:How to create a child class in TypeScript using parent static method?如何使用父静态方法在 TypeScript 中创建子类?
【发布时间】:2018-05-15 05:23:42
【问题描述】:

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

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;
  }
}

我想使用它的方式是这样的:

const currentUser = User.fromData(dataFromServer);
const message = currentUser.sayHi();

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

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

我正在计划一些具有共同点的不同实体。

我看到了this answer,但我不知道如何将参数传递给我的静态方法。

【问题讨论】:

    标签: typescript design-patterns factory-pattern


    【解决方案1】:

    由于静态方法在类本身上,我们可以在静态方法中使用this 访问类构造函数,this 就是类本身。如果我们将 this 参数约束到静态方法,使其成为返回 T (this: new ()=&gt; T) 的构造函数,我们将得到正确的返回值类型。 this 参数只是为了 typescript 编译器的好处,它实际上不会被发送到 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();
    

    游乐场link

    【讨论】:

    • 有趣。我不知道this: new () =&gt; T 的语法。某处是否有关于此功能的文档?
    • @Paleo 混合了几件事,this: 是您可以在成员函数github.com/Microsoft/TypeScript/issues/3694 上指定this 的类型。 new ()=&gt; T 只是一个构造函数签名,(类似于函数签名,但可以用new 调用)。由于参数推断的工作方式,整个事情都有效..
    • @TitianCernicova-Dragomir,非常感谢您的回复。我没有在 Typescript 手册中看到 this 的用法。您是否有链接或其他内容可以阅读有关该主题的更多信息?
    • 使用this时如何调用其他静态方法? typescriptlang.org/play?#code/…
    • 太棒了!如果我有一个构造函数,我试图弄清楚如何做到这一点。有什么建议吗? from 函数看起来像 static fromData&lt;T&gt;(this: new (id: number) =&gt; T, data: any): Treturn Object.assign(new this(id), data); 不起作用,它无法访问 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2021-04-09
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多