2015-10-28 3 views
3

Я думаю, что я могу сделать что-то вроде этого, чтобы создать новый экземпляр Generic в машинописном:Могу ли я сказать TypeScript, что тип Generic имеет конструктор?

class Tree<T extends SomeInterface> { 

    constructor(private elementType: {new(): T}) { 
    } 

    public Grow() { 
     var newElement: T = new this.elementType(); 
     // ... 
    } 
} 

Но есть ли способ, чтобы машинопись знать, что Generic имеет new()? Другими словами, есть ли способ заставить что-то подобное работать?

class Tree<T extends SomeInterface> { // <-- Modify the constraint? 
    public Grow() { 
     var newElement: T = new T(); 
     // ... 
    } 
} 
+0

Вы можете использовать тип подписи конструкции в ограничении. Но является ли 'T' предназначенным для типа функции конструктора или типом результата' new'ing some value? Вы используете его в двух вариантах в опубликованных примерах. –

+0

Я преследовал это. Надеюсь, вы найдете решение. Как я получил из документации (http://www.typescriptlang.org/Handbook#generics-generic-constraints), вы не можете использовать параметр типа в таком ограничении: «function find > (n: T, s: U) {... ". Так что мне кажется, что ответ на вопрос «Нет» на какое-то время. – TSV

+0

@RyanCavanaugh T предназначен для того, чтобы быть типом результата ... Полагаю, теперь я понимаю, что ваш вопрос о том, что 'new' вызывается на конструкторе, а не на« типе ». Поэтому, я думаю, чтобы получить свой предполагаемый результат, мне пришлось бы создать какой-то интерфейс «Createable» и дать ему функцию «Create()»? – Eric

ответ

3

Но есть ли способ, чтобы машинопись знать, что Generic имеет новый()? Другими словами, есть ли способ заставить что-то подобное работать?

Не верно. Причина в том, что вам по-прежнему необходимо передать в сущности, которая будет новее объекта для вас. Вы не можете просто использовать ограничение времени компиляции <T> как время выполнения new T.

interface SomeInterface{  
} 

interface SomeInterfaceConstructor<T extends SomeInterface>{ 
    new(): T; 
} 


class Tree<T extends SomeInterface> { 
    constructor(private elementType: SomeInterfaceConstructor<T>) { 
    } 
    public Grow() { 
     var newElement = new this.elementType(); 
     // ... 
    } 
} 
Смежные вопросы