我可以用固定键创建地图吗?
Can I create a Map with fixed keys?
我需要创建一个类型来表示一组命名的开关值。我希望这种类型是不可变的,因为开关 names 是固定的,但仍然允许开关 value 被改变。
我目前正在使用 Map<string, boolean>
。但是,这意味着像我这样的用户可以添加额外的键值,或删除现有的键值,我想防止这种情况发生。
我考虑过使用 ReadonlyMap<string, boolean>
,但是虽然这会阻止添加或删除密钥,但它也会阻止设置开关值:-)。
是否有另一种类型允许我拥有一组固定的键,但值是可变的?
编辑:我想添加到问题中的是我在编译时不知道开关名称(Map
键)。我将加载开关 names/values 并将它们传递到系统的各个部分;我正在寻找的是一种我可以在函数声明等中使用的类型,它表达了数据的 key/value 性质,但也表达了固定键集的不变性。
是的。这就是 class 所做的。
class Foo {
fixedKeyName1: boolean
// ...
}
这取决于您"I don't know the keys at compile time" 的意思。如果甚至你的地图的用户在编译时都不知道键,那么没有什么比 Map<string, boolean>
更好的了(尽管当你的键是字符串时,一个普通的旧-JavaScript-object like {[k: string]: boolean}
更轻量级并且具有相同的行为)。
但是,如果 您 在编译时不知道键,但是您的地图的用户 知道它们,那么您只想使用 generic 作为密钥类型。
由于你没有发布示例代码,我无法针对你的确切用例,所以我正在编造:
// 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
constrained 至 string
。但是代码的用户指定了一些键,此时泛型类型被实例化为具体的值......这让用户知道他们是否尝试使用无效的键。
这有意义吗?希望有所帮助。祝你好运。
我需要创建一个类型来表示一组命名的开关值。我希望这种类型是不可变的,因为开关 names 是固定的,但仍然允许开关 value 被改变。
我目前正在使用 Map<string, boolean>
。但是,这意味着像我这样的用户可以添加额外的键值,或删除现有的键值,我想防止这种情况发生。
我考虑过使用 ReadonlyMap<string, boolean>
,但是虽然这会阻止添加或删除密钥,但它也会阻止设置开关值:-)。
是否有另一种类型允许我拥有一组固定的键,但值是可变的?
编辑:我想添加到问题中的是我在编译时不知道开关名称(Map
键)。我将加载开关 names/values 并将它们传递到系统的各个部分;我正在寻找的是一种我可以在函数声明等中使用的类型,它表达了数据的 key/value 性质,但也表达了固定键集的不变性。
是的。这就是 class 所做的。
class Foo {
fixedKeyName1: boolean
// ...
}
这取决于您"I don't know the keys at compile time" 的意思。如果甚至你的地图的用户在编译时都不知道键,那么没有什么比 Map<string, boolean>
更好的了(尽管当你的键是字符串时,一个普通的旧-JavaScript-object like {[k: string]: boolean}
更轻量级并且具有相同的行为)。
但是,如果 您 在编译时不知道键,但是您的地图的用户 知道它们,那么您只想使用 generic 作为密钥类型。
由于你没有发布示例代码,我无法针对你的确切用例,所以我正在编造:
// 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
constrained 至 string
。但是代码的用户指定了一些键,此时泛型类型被实例化为具体的值......这让用户知道他们是否尝试使用无效的键。
这有意义吗?希望有所帮助。祝你好运。