Ссылка на функцию конструктора - программирование
Подтвердить что ты не робот

Ссылка на функцию конструктора

Мне интересно, как я могу получить ссылку на конструктор типов, чтобы передать функцию как значение. В принципе, я хотел бы иметь общий реестр типов, который позволит создавать экземпляры, вызывая функцию-член экземпляра реестра общего типа.

Например:

class GeometryTypeInfo
{        
    constructor (public typeId: number, public typeName: string, public fnCtor: (...args: any[]) => IGeometry) {
    }
    createInstance(...args: any[]) : IGeometry { return this.fnCtor(args); }
    }
}

Далее:

class Point implements IGeometry {
    constructor(public x: number, public y: number) { }

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point); // <- fails
    // also fails: 
    //    new GeometryTypeInfo(1, 'POINT', new Point);
    //    new GeometryTypeInfo(1, 'POINT', Point.prototype);
    //    new GeometryTypeInfo(1, 'POINT', Point.bind(this));
}

Кто-нибудь знает, можно ли ссылаться на конструктор классов?

4b9b3361

Ответ 1

Вы можете использовать литерал типа конструктора или литерал типа объекта с сигнатурой конструкции для описания типа конструктора (см., как правило, раздел 3.5 спецификации языка). Для использования вашего примера должно работать следующее:

interface IGeometry {
    x: number;
    y: number;
}

class GeometryTypeInfo
{        
    constructor (public typeId: number, public typeName: string, public fnCtor: new (...args: any[]) => IGeometry) {
    }
    createInstance(...args: any[]) : IGeometry { return new this.fnCtor(args); }
}

class Point implements IGeometry {
    constructor(public x: number, public y: number) { }

    public static type_info = new GeometryTypeInfo(1, 'POINT', Point);
}

Обратите внимание на литерал типа конструктора в списке параметров конструктора GenometryTypeInfo и новый вызов в реализации createInstance.

Ответ 2

typeof YourClass дает вам тип конструктора, который может использоваться в аннотациях типа.

YourClass и this.constructor является самим конструктором. Итак, этот код компилируется:

class A {}

const B : typeof A = A;

this.constructor не распознается как значение типа конструктора TypeScript (что смешно), поэтому в подобных ситуациях вам нужно использовать какое-то обманное литье, это не any

new (<any> this.constructor)()

Что это.