如果您有一个对象 ({}) 作为映射,则键必须是字符串(或自动转换为字符串的数字)。
在这种情况下,您可以使用toString() 方法:
class A { }
console.log(A.toString());
将打印:
function A() {
}
您也可以使用name 属性:
console.log(A.name); // "A"
您还可以覆盖 toString() 方法以返回您自己的内容:
class A {
static toString() {
return "class A";
}
}
console.log(A.toString()); // "class A"
然后:
let m = {} as { [name: string]: string };
m[A.toString()] = "something";
// or
m[A.name] = "something";
如果您使用的是Map,那么以上所有方法仍然有效,但您不限于拥有字符串键,因此您可以使用类本身:
let m = new Map<{ new (): A }, string>();
m.set(A, A.toString());
console.log(m.get(A)); // "class A"
编辑
如果您有一个类的实例,您可以使用constructor 属性获取该类:
let a = new A();
...
m.set(a.constructor, SOME_VALUE);
constructor property 来自 object,看起来像这样:
interface Object {
/** The initial value of Object.prototype.constructor is the standard built-in Object constructor. */
constructor: Function;
...
}
所以你总是得到一个Function,你需要投:
m.set(a.constructor as typeof A, SOME_VALUE);
由于您可能不知道课程的类型,因此您需要做一些其他事情。
你可以投到any,但这不是很漂亮。
这是一个适合您的有效解决方案:
interface Base { }
type BaseContructor = { new (): Base };
class A implements Base { }
class B implements Base { }
let m = new Map<BaseContructor, string>();
let a = new A();
let b = new B();
m.set(a.constructor as BaseContructor, "value");
m.set(b.constructor as BaseContructor, "value");
(code in playground)