JSFiddle - React, Tailwind, and code Playground

by David Kyle

TypeScript

class Mapper<TItem> {
	private ctor: {new(): TItem};
  private instance: TItem;
  
	constructor(arg: { new(): TItem }) {
  	this.ctor = arg;
    this.instance = new this.ctor();
  }
  
  public getTypeInfo(): void {
  	console.log('--constructor--', this.ctor);
    console.log('--instance--', this.instance);
  }

  public getInstance(): TItem {
      return this.instance;
  }
}

class SomeClass {
	public id: number;
  public name: string;
  
  constructor() {
  	this.id = 1;
    this.name = 'Dave';
  }
}

var instance = new Mapper<SomeClass>(SomeClass);
var instanceTwo = new Mapper(SomeClass); // Same thing

instance.getTypeInfo();
instanceTwo.getTypeInfo();

// Doesn't work
public class OtherClass<TWrapped> {
	public wrapped: TWrapped;
  
  constructor(type: { new(): TWrapped }) {
  	this.wrapped = new Mapper(type).getInstance();
  }
}

public class WrappedOtherClass extends OtherClass<SomeClass> {
	constructor() {
  	super(SomeClass);
  }
}

var wrappedInstance = new Mapper(WrappedOtherClass);

wrappedInstance.getTypeInfo();



var nextInstance = new Mapper(OtherClass<SomeClass>);

nextInstance.getTypeInfo();