繁体   English   中英

TypeScript Generics: Function 返回作为参数指定的实例的构造函数

[英]TypeScript Generics: Function that returns constructor of instance specified as parameter

我正在学习 TypeScript。 我一直在思考 generics,但遇到了一个小问题,我正在努力寻找答案。

我用谷歌搜索了很多很多搜索查询,但是由于搜索词的模糊性,以及对某些语言结构的技术名称缺乏了解,我得到了很多噪音。

我在 TypeScript 的网站上阅读了三个相关的文档页面,但找不到我需要的信息。 也许我忽略了一些东西,如果是这样的话,一个好的解释的链接将不胜感激。

我想编写一个 function ,它返回指定为保留类型的参数的实例的构造函数,因为 TypeScript 中的 this.constructor 不是 ZA2F2ED4F8EBC2CBB4C21A29DZ40AB6 的类型

非常清楚,我知道我可以做到这一点:

const aa2 = (a.constructor as typeof A).make();

这是一个精简的案例:

class A {
    prop1: string;
    prop2: number;

    constructor(prop1: string, prop2: number) {
        this.prop1 = prop1;
        this.prop2 = prop2;
    }

    method() {

    }

    static make() {
        return new this('test', 42);
    }
}

function constructor<T>(instance: T): { new(...args): T } {
    return instance.constructor as { new(...args): T };
}

const a = A.make();

// Property 'make' does not exist on type 'new(...args: any[]) => A'
const aa = constructor(a).make();


// This works, but is not pretty
const aa2 = (a.constructor as typeof A).make();

它需要在任何 class 上工作,无论是否带有构造函数参数。

我可以做相反的事情:

export function make<T>(type: { new(...args): T }, ...args): T {
    return new type(...args);
}

make(A, 'test', 42).method();

似乎我没有得到一些关键因素。 如果您能准确地发现我的想法出错的地方,我欢迎对我的误解做出很好的解释。

无法从实例类型移动到 class 类型。 这只有在constructor被键入为 class 类型时才有可能(它不是)有一个开放的票可以实现这一点,但它已经开放并讨论了很长时间。

如果您控制客户端类,则可以将成员添加到 class 以使该方法正常工作:

class TraceableClass<TThis> {
  private typedConstructor!: TThis
}
class A<TThisClas = typeof A> extends TraceableClass<TThisClas>{
    prop1: string;
    prop2: number;

    constructor(prop1: string, prop2: number) {
        super();
        this.prop1 = prop1;
        this.prop2 = prop2;
    }

    method() {

    }

    static make() {
        return new this('test', 42);
    }
}

function constructor<T>(instance: TraceableClass<T>): T {
    return instance.constructor as  any as T;
}

const a = A.make();

// Ok now
const aa = constructor(a).make();


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM