gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:14:54 25 4
gpt4 key购买 nike

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

这是我声明 Map atm 的方式:

private static followSetsByATN: Map<number, FollowSetsPerState> = 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";

如果您使用的是 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 )

关于javascript - 如何在 TypeScript 中使用类类型作为映射键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41853497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com