我需要创建一个类型来表示一组命名开关值。我希望这种类型是不变的,因为开关名称是固定的,但仍然允许更改开关 value 。
我当前正在使用Map<string, boolean>
。但是,这意味着我这种类型的用户可以添加其他键值,或删除现有键值,而我想避免这种情况。
我曾考虑过使用ReadonlyMap<string, boolean>
,但是虽然这可以防止添加或删除键,但也可以防止设置开关值:-)。
还有其他类型可以让我拥有一组固定的键,但是值可变吗?
编辑:我要补充说明的问题是,我在编译时不知道开关名称(Map
键)。我将加载开关名称/值,并将其传递给系统的各个部分。我要寻找的是一种可以在函数声明等中使用的类型,该类型表示数据的键/值性质,还可以表示键固定集的不变性。
答案 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
generic至string
。但是代码的用户指定了一些键,然后用具体的值实例化泛型类型...这可以让用户知道他们是否尝试使用无效的键。
这有意义吗?希望能有所帮助。祝你好运。
答案 1 :(得分:0)
是的。那就是一堂课。
class Foo {
fixedKeyName1: boolean
// ...
}