请教一下,怎么用ts语法实现ioc容器,并可使用接口获取对象

class IOCContainer {
    private mInstances: Map<string, any> = new Map<string, any>()
    Register<T extends {}>(instance: T) {
        let name = instance.constructor.name
        if (!this.mInstances.has(name)) {
            this.mInstances.set(name, instance)
        } else {
            this.mInstances.set(name, instance)
        }
    }
    Get<T extends {}>(type: { new(): T }): T {
        let name = type.name
        if (this.mInstances.has(name)) {
            return this.mInstances.get(name)
        } else {
            return null;
        }
    }
}
interface IA { }
class ClassA implements IA { }

let mContainer = new IOCContainer()
mContainer.Register(new ClassA())
mContainer.Get(ClassA)//这个已经可以了

mContainer.Get(IA)//语法编译不通过

如题,想根据类获取对象,这点(抄了cocos的type: { new(): T })实现了,但是不知道怎么实现根据接口获取对象。或者说不知道怎么用接口拿到一个值。
希望达成的效果是,如果一个类继承了接口,可以用这个类拿到对象,也可以根据接口拿到对象。现在我是用类名作为key存在map里,是不是要用其他方式。

js没有接口的概念,ts编译后无法判断是否继承了某个接口

那有点遗憾了,我是看到C#有这样的工具所以想用ts实现一个的。

有办法的,不过真没必要
可以拿到原型链的,然后逐个向上判断就行了

拿原型链只能用字段判断,每个接口都要有个判断方法,太麻烦了

我没太懂你的意思

static IsGObject(type) : boolean {
if(type == GObject) {
return true;
}

    if(type.__proto__ && type.__proto__.name) {
        return SkinHelper.IsGObject(type.__proto__);
    }

    return false;
}

而且判断还不一定准确,如果两个接口有相同字段,就无法区分了

这是判断是否继承某个类吧

当然啊。js又没有接口。用基类判断呀

为啥不用更优雅的ts 类装饰器?

有示例可以看一下么

:thinking:那如果两个类都继承同一个接口你怎么通过接口名来获取?

先不考虑进一步的问题,当前问题还没解决。
照理来说注册模块的时候就要有个规则防止这种情况,比如第二次注册要把第一次的顶掉。