typescript - Dynamisk returtyp baserad på sträng


Är det möjligt att skicka en sträng till en funktion och tilldela en dynamisk typ som returneras?

class MyService {
  aMethod(arg) {
    console.log(arg)
  }
}

Container.register('my_service', MyService);

// Internally Container holds a Object 
export interface IServiceInstance {
    name: string;
    type: Function;
    instance: Object;
}

const myServiceInstance = Container.get('my_service')

// myServiceInstance should be detected as type of MyService class
myServiceInstance.aMethod('Hello World') 

// Currently I use it like this. But if it is possible I want to get rid of that
const myServiceInstance = (Container.get('my_service') as MyService)

Svar #1

Du kan utöka typen av behållare för att lägga till metodspecialiseringar med strängkonstant:

// In a library for example
declare class ContainerClass {
    register<T>(name: string, ctor: new ()=> T): void;
    get (name: string) : any;
}
let Container: ContainerClass ;


// In your app
class MyService {
    aMethod(arg) {
      console.log(arg)
    }
  }

Container.register('my_service', MyService);
interface ContainerClass {
    get (name: 'my_service') : MyService;
}
Container.get('my_service').aMethod("");

Detta utnyttjar det faktum att en typ (gränssnitt eller klass) kan utökas genom att deklarera ett gränssnitt i samma namnrymd och med samma namn.