3 回答

TA贡献1796条经验 获得超7个赞
因为已编译的JavaScript删除了所有类型信息,所以您不能使用它T来创建对象。
您可以通过将类型传递给构造函数来以非泛型方式进行操作。
class TestOne {
hi() {
alert('Hi');
}
}
class TestTwo {
constructor(private testType) {
}
getNew() {
return new this.testType();
}
}
var test = new TestTwo(TestOne);
var example = test.getNew();
example.hi();
您可以使用泛型来扩展此示例以加强类型:
class TestBase {
hi() {
alert('Hi from base');
}
}
class TestSub extends TestBase {
hi() {
alert('Hi from sub');
}
}
class TestTwo<T extends TestBase> {
constructor(private testType: new () => T) {
}
getNew() : T {
return new this.testType();
}
}
//var test = new TestTwo<TestBase>(TestBase);
var test = new TestTwo<TestSub>(TestSub);
var example = test.getNew();
example.hi();

TA贡献1831条经验 获得超10个赞
要在通用代码中创建新对象,您需要通过其构造函数来引用类型。所以不用写这个:
function activatorNotWorking<T extends IActivatable>(type: T): T {
return new T(); // compile error could not find symbol T
}
您需要编写以下代码:
function activator<T extends IActivatable>(type: { new(): T ;} ): T {
return new type();
}
var classA: ClassA = activator(ClassA);

TA贡献1876条经验 获得超7个赞
所有类型信息都在JavaScript端被擦除,因此您不能像@Sohnee状态那样更新T,但是我更喜欢将类型化参数传递给构造函数:
class A {
}
class B<T> {
Prop: T;
constructor(TCreator: { new (): T; }) {
this.Prop = new TCreator();
}
}
var test = new B<A>(A);
添加回答
举报