Odwoływanie się do funkcji konstruktora

głosy
14

Im zastanawiasz się w jaki sposób można uzyskać odniesienie do konstruktora typy przekazać funkcję jako wartość. Zasadniczo chciałbym mieć ogólny rejestr typu, który pozwoliłby przypadki mają być tworzone poprzez wywołanie funkcji składowej rodzajowe przykład typ rejestru.

Na przykład:

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

Później:

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

Ktoś wie, czy jest możliwe, aby odwoływać się do funkcji konstruktora klasy?

Utwórz 08/10/2012 o 19:17
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
18

Można użyć typu dosłownego konstruktora lub typ obiektu dosłowne z podpisem konstruktu opisać rodzaj konstruktora (patrz, na ogół sekcja 3.5 spec językowej). Aby użyć przykładu, następujące powinny działać:

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

Zwróć uwagę na rodzaj konstruktora dosłowne w liście parametrów konstruktora GenometryTypeInfo, a nowe połączenie w realizacji createInstance.

Odpowiedział 08/10/2012 o 19:27
źródło użytkownik

głosy
6

typeof YourClassdaje wam konstruktora typu , który może być używany w typie adnotacji.

YourClassi this.constructorjest konstruktora siebie. Tak, ten kod kompiluje:

class A {}

const B : typeof A = A;

this.constructor nie jest rozpoznawana jako wartość typu konstruktora przez maszynopis (co jest śmieszne), więc w takich sytuacjach, że trzeba użyć trochę oszukiwania rzucając go nie any

new (<any> this.constructor)()

to jest to!

Odpowiedział 30/06/2016 o 19:40
źródło użytkownik

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