我想在反映类类型的键下的TypeScript(JavaScript)映射中存储一些信息。这是因为存储的数据实际上是静态的,并且按类型而不是按实例应用。
这是我声明Map atm的方法:
private static followSetsByATN: Map= new Map();
但是,number
应改为类类型。如何做到这一点?
如果您有一个对象({}
)作为映射,则键必须是字符串(或数字会自动转换为字符串)。
在这种情况下,可以使用以下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";
如果您使用的是a,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
属性来自,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(); let a = new A(); let b = new B(); m.set(a.constructor as BaseContructor, "value"); m.set(b.constructor as BaseContructor, "value");
(操场上的代码)