如何在打字稿中的generics类中的types参数中创build一个新的对象?

我试图在我的generics类中创build一个types参数的新对象。 在我的类“查看”我有2genericstypes的对象作为typesparameter passing的列表,但是当我尝试使“新T()”打字稿说“找不到符号'T'”…

这是代码:

我可以从generics创build对象吗?

因为编译的JavaScript已经清除了所有的types信息,所以不能用T来创build一个对象。

您可以通过将types传递给构造函数以非generics方式执行此操作。

 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(); 

你可以使用generics来扩展这个例子来加强types:

 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(); 

要在generics代码中创build一个新的对象,您需要通过其构造函数来引用该types。 所以,而不是写这个:

 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); 

看到这个问题: 带类参数的genericstypes推断

所有的types信息都在JavaScript端擦除,因此你不能像@Sohnee所说的那样新buildT,但是我更喜欢把typesparameter passing给构造函数:

 class A { } class B<T> { Prop: T; constructor(TCreator: { new (): T; }) { this.Prop = new TCreator(); } } var test = new B<A>(A); 
 export abstract class formBase<T> extends baseClass { protected item : T = {} as T; } 

它的对象将能够接收任何参数,但是,typesT只是一个打字引用,不能通过构造函数创build。 也就是说,它不会创build任何子类对象。

我使用这个: let instance = <T>{}; 它通常工作编辑1:

 export class EntityCollection<T extends { id: number }>{ mutable: EditableEntity<T>[] = []; immutable: T[] = []; edit(index: number) { this.mutable[index].entity = Object.assign(<T>{}, this.immutable[index]); } } 

我试图从基类内实例化generics。 上面的例子都不适合我,因为他们需要一个具体的types来调用工厂方法。

经过一段时间的研究,无法在网上find解决scheme,我发现这似乎工作。

  protected activeRow: T = {} as T; 

碎片:

  activeRow: T = {} <-- activeRow now equals a new object... 

  as T; <-- As the type I specified. 

全部一起

  export abstract class GridRowEditDialogBase<T extends DataRow> extends DialogBase{ protected activeRow: T = {} as T; }