2015-07-15 2 views
0

У меня есть ситуация, когда существует набор типов: A, B и C. Каждый из них расширяет один и тот же общий интерфейс I. Я хотел бы иметь возможность выразить метод следующим образом:Создание метода конструктора типа

class SomeClass { 
    private somenumber = 1; 
    private someproperty; 

    addThing(cls: {new(number): I}) { 
     var instance = new cls(this.somenumber); 
     instance.someSharedOperation(this.someproperty); 
     return instance; 
    } 
} 

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

Я бы тогда называть это так:

var maker = new SomeClass(); 
instanceA = maker.addThing(A); 

выше, конечно, работает, но машинопись считает instanceA быть типа I. Я бы хотел, чтобы он отражал исходный тип A при ограничении cls на реализацию I. Но я признаю, что это может быть слишком далеко в «зависимом типе», чтобы быть выраженным в TypeScript, даже если тип может быть установлен в.

ответ

1

Конечно писать все, что из сделал сразу ясно, что было не так:

Решение было утверждать, что new возвратит расширение I:

addThing<E extends I>(cls: {new(number): E}): E { 
    var instance = new cls(this.somenumber); 
    instance.someSharedOperation(this.someproperty); 
    return instance; 
} 

Довольно прямо вперед!