我可以用固定键创建地图吗?

时间:2018-12-10 10:58:25

标签: typescript immutability

我需要创建一个类型来表示一组命名开关值。我希望这种类型是不变的,因为开关名称是固定的,但仍然允许更改开关 value

我当前正在使用Map<string, boolean>。但是,这意味着我这种类型的用户可以添加其他键值,或删除现有键值,而我想避免这种情况。

我曾考虑过使用ReadonlyMap<string, boolean>,但是虽然这可以防止添加或删除键,但也可以防止设置开关值:-)。

还有其他类型可以让我拥有一组固定的键,但是值可变吗?

编辑:我要补充说明的问题是,我在编译时不知道开关名称(Map键)。我将加载开关名称/值,并将其传递给系统的各个部分。我要寻找的是一种可以在函数声明等中使用的类型,该类型表示数据的键/值性质,还可以表示键固定集的不变性。

2 个答案:

答案 0 :(得分:1)

这取决于您所说的“我在编译时不知道键”的意思。如果甚至您的地图用户在编译时都不知道键,那么没有什么比Map<string, boolean>更好的了(尽管当您的键是字符串时,像{[k: string]: boolean}这样的普通JavaScript对象是更轻巧,并且具有相同的行为)。

但是,如果在编译时不知道键,但是地图的用户 知道它们,那么您只想使用{{ 3}}。

由于您未发布示例代码,因此我无法定位您的确切用例,因此我正在整理内容:

// your code
class MyMapHolder<K extends string> {
  map: Map<K, boolean>
  constructor(...keys: K[]) {
    this.map = new Map<K, boolean>();
    keys.forEach(k => this.map.set(k, false));
  }      
}

// user's code
const mapHolder = new MyMapHolder("ape", "bee", "cat", "dog", "elk");
mapHolder.map.set("dog", true); // okay
mapHolder.map.set("fox", false); // error, "fox" is not assignable to parameter

如您所见,您对用户将选择的键一无所知,因此只需使用K genericstring。但是代码的用户指定了一些键,然后用具体的值实例化泛型类型...这可以让用户知道他们是否尝试使用无效的键。

这有意义吗?希望能有所帮助。祝你好运。

答案 1 :(得分:0)

是的。那就是一堂课。

class Foo {
    fixedKeyName1: boolean
    // ...
}