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.
