【问题标题】:Dynamic return Type based on string基于字符串的动态返回类型
【发布时间】:2017-10-24 19:20:25
【问题描述】:

是否可以将字符串传递给函数并分配返回的动态类型?

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)

【问题讨论】:

  • 什么是Container,它支持泛型吗? Container.get<MyService>('my_service'),例如。您必须具体说明 somewhere 的类型。
  • 不是Container.get<MyService>('my_service')(Container.get('my_service') as MyService) 完全相同
  • 效果一样。 TS 不是魔术。同样,您必须指定某处

标签: typescript


【解决方案1】:

您可以通过字符串常量扩展容器类型以添加​​方法特化:

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

这利用了一个类型(接口或类)可以通过在相同的命名空间中声明一个具有相同名称的接口来扩展的事实。

【讨论】:

  • hmm .. 看起来我想要的实际上是不可能的。我的愿望是,get 方法根据 register 函数的输入返回正确的类型。
  • 您需要添加额外的声明才能发生这种情况,它不会自动发生。但是如果你经常使用这个,为你注册的每个类型添加方法并不是什么大问题
猜你喜欢
  • 2017-02-03
  • 2020-05-02
  • 1970-01-01
  • 2012-07-24
  • 2019-12-19
  • 1970-01-01
  • 2021-10-16
  • 2015-03-05
  • 2012-06-23
相关资源
最近更新 更多