Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get constructor/instance from generic type in TypeScript

I am trying to create instance from generic type T for example,

class Factory {
    public static generate<T>(): T { 
      return new T();
  }
}

But since T is just a type not constructor, we can't do that.

Is it impossible to create an instance from a generic type in TypeScript?

I'v also read these articles but could not found a solution.

  • TypeScript #2037
  • How to create a new object from type parameter in generic class in typescript?
  • How can I create a new instance of the generic type of my Typescript class?
like image 765
1ambda Avatar asked Dec 31 '15 06:12

1ambda


1 Answers

The type information used in TypeScript is erased before runtime, so the information about T is not available when you make the call to new T().

That's why all of the alternate solutions depend upon the constructor being passed, such as with this example of creating a class dynamically:

interface ParameterlessConstructor<T> {
    new (): T;
}

class ExampleOne {
    hi() {
        alert('Hi');
    }
}

class Creator<T> {
    constructor(private ctor: ParameterlessConstructor<T>) {

    }
    getNew() {
        return new this.ctor();
    }
}

var creator = new Creator(ExampleOne);

var example = creator.getNew();
example.hi();
like image 61
Fenton Avatar answered Sep 22 '22 07:09

Fenton