javascript - 泛型获取类名

标签 javascript generics typescript

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

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”。但目前我收到一条错误消息:

Cannot find name '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>);

( code in playground )

关于javascript - 泛型获取类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38861177/

相关文章:

javascript - 取消隐藏 css 元素以选择元素值太慢

c++ - 在 C++ 方法中将泛型类型作为参数传递

angular - 我应该将什么样的对象传递给 `FormBuilder.group()` 才能正确实例化字段?

angular - 当我使用属性 ngModel 更改输入中的值时,我所有插入对象的数组都会发生变化

javascript - 访问另一个网站时在后台调用网站

javascript - 进入css属性,刷新后改,还是修复不了

.net - .NET JIT 编译器是否为使用不同枚举参数化的泛型生成不同的代码?

c# - 通用异步查询类

javascript - TypeScript Disallow 不必要的可选链表达式

javascript - 我可以在 css 或 javascript 中从一个元素画一条线到另一个元素吗?