2017-01-30 2 views
0

Я хочу иметь возможность передать тип (а не экземпляр типа) в качестве параметра, но я хочу применить правило, в котором тип должен расширять определенный базовый типТип TypeScript для типа, а не для экземпляра

Пример

abstract class Shape { 
} 

class Circle extends Shape { 
} 

class Rectangle extends Shape { 
} 

class NotAShape { 
} 

class ShapeMangler { 
    public mangle(shape: Function): void { 
     var _shape = new shape(); 
     // mangle the shape 
    } 
} 

var mangler = new ShapeMangler(); 
mangler.mangle(Circle); // should be allowed. 
mangler.mangle(NotAShape); // should not be allowed. 

по существу я думаю, что нужно заменить shape: Function с чем-то ... другое?

Возможно ли это с помощью TypeScript?

Примечание: TypeScript также должен признать, что shape имеет конструктор по умолчанию. В C# я бы сделать что-то вроде этого ...

class ShapeMangler 
{ 
    public void Mangle<T>() where T : new(), Shape 
    { 
     Shape shape = Activator.CreateInstance<T>(); 
     // mangle the shape 
    } 
} 

ответ

1

Есть два варианта:

class ShapeMangler { 
    public mangle<T extends typeof Shape>(shape: T): void { 
     // mangle the shape 
    } 
} 

Или

class ShapeMangler { 
    public mangle<T extends Shape>(shape: { new(): T }): void { 
     // mangle the shape 
    } 
} 

Но оба они будут хорошо с компилятором:

mangler.mangle(Circle); 
mangler.mangle(NotAShape); 

С примером вы опубликовали, потому что ваши классы пустые, а пустой объект соответствует любому другому объекту в структуре.
Если добавить свойство, например:

abstract class Shape { 
    dummy: number; 
} 

Тогда:

mangler.mangle(NotAShape); // Error 
Смежные вопросы