哪个 T 应该是可变参数类而 K 应该是 T 的一个实例?,javascript,typescript"/>

首页 > 解决方案 > 如何声明地图哪个 T 应该是可变参数类而 K 应该是 T 的一个实例?

问题描述

我想声明一个Map<T, K>类型,映射中的键是类,映射的值应该是相应键的实例。例如:

class X {}

type InstanceMap = // the type that I want to declare

const map: InstanceMap = new Map();
map.set( X, new X() );

标签: javascripttypescript

解决方案


我认为这是不可能的,它需要存在量化的泛型类型。你可以做

type InstanceMap<T> = Map<{new (): T}, T>

使用构造函数类型作为键,但这只会允许您存储特定的类(可能还有子类?),但不能存储任何类。您的代码将使用 编译const map: InstanceMap<X> = new Map();,但map.set(Y, new Y())会失败。

与其尝试实例化一个Map类型,我们可以尝试提出我们自己的接口,其中存在量词被委托给各个方法:

interface InstanceMap {
    set<T>(c: new () => T, i: T): void;
    get<T>(c: new () => T): T | undefined;
}

这适用于setand get,但一旦您尝试声明forEach或迭代器就会崩溃。


推荐阅读