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);
添加回答
舉報