泛型获取类名

从我的草坪上离开

我有一个通用函数,我想获取传入的类的名称。

public addComponent<T extends Component>(): Component {
    comp = new Component() as T;
    comp.name = T.constructor.name;
    console.log(comp.name);
    return comp;
}

然后说我这样称呼它:

obj.addComponent<MyClass>();

然后,我希望日志显示“ MyClass”。但是目前我收到一个错误消息:

找不到名称“ T”。

尼桑·托默尔

无法做到这一点。

T在运行时不存在的,它只是编译,编译器将删除(连同类型),所以这种情况的造成的javascript:

class MyFactory {
    public addComponent<T extends Component>(): Component {
        let comp = new Component() as T;
        comp.name = T.constructor.name;
        console.log(comp.name);
        return comp;
    }
}

是:

var MyFactory = (function () {
    function MyClass() {
    }
    MyFactory.prototype.addComponent = function () {
        var comp = new Component();
        comp.name = T.constructor.name;
        console.log(comp.name);
        return comp;
    };
    return MyFactory;
}());

如您所见,js代码没有泛型签名,因此没有的定义T,因此会T.constructor导致您收到错误。

如果希望方法通过传递方法来创建类的实例,则它应类似于:

interface ComponentConstructor<T extends Component> {
    new(): T;
    name: string;
}

class Component {
    name: string;
}

class MyComponent extends Component {}

class MyFactory {
    public addComponent<T extends Component>(ctor: ComponentConstructor<T>): Component {
        let comp = new ctor();
        comp.name = ctor.name;
        console.log(comp.name);
        return comp;
    }
}

let factory = new MyFactory();
let obj = factory.addComponent(MyComponent as ComponentConstructor<MyComponent>);

操场上的代码

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档