Реферирование функции конструктора

голоса
14

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

Например:

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

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

Задан 08/10/2012 в 19:17
источник пользователем
На других языках...                            


2 ответов

голоса
18

Вы можете использовать тип конструктора буквальный или тип объекта буквальный с конструкцией подписью, чтобы описать тип конструктора (см, как правило, раздел 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.

Ответил 08/10/2012 в 19:27
источник пользователем

голоса
6

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

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

class A {}

const B : typeof A = A;

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

new (<any> this.constructor)()

Вот и все.

Ответил 30/06/2016 в 19:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more