当前位置:  开发笔记 > 编程语言 > 正文

如何在TypeScript中使用类类型作为映射键?

如何解决《如何在TypeScript中使用类类型作为映射键?》经验,为你挑选了1个好方法。

我想在反映类类型的键下的TypeScript(JavaScript)映射中存储一些信息。这是因为存储的数据实际上是静态的,并且按类型而不是按实例应用。

这是我声明Map atm的方法:

private static followSetsByATN: Map = new Map();

但是,number应改为类类型。如何做到这一点?



1> Nitzan Tomer..:

如果您有一个对象({})作为映射,则键必须是字符串(或数字会自动转换为字符串)。
在这种情况下,可以使用以下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");

(操场上的代码)

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有