我可以使用固定密钥创建 Map 吗?

loading...


0

我需要创建一个类型来表示一组命名的开关值 . 我希望这种类型在交换机名称固定的意义上是不可变的,但仍然允许更改开关值 .

我目前正在使用 Map<string, boolean> . 但是,这意味着我的类型的用户可以添加其他键值,或删除现有键值,我想阻止它 .

我想过使用 ReadonlyMap<string, boolean> 但是虽然这可以防止添加或删除密钥,但它也会阻止设置开关值:-) .

是否有另一种类型可以让我拥有一组固定的键,但可变值?

EDIT :我想在问题中添加的是我在编译时不知道开关名称( Map 键) . 我在寻找的类型是我可以在函数声明等中使用的类型,它表示数据的键/值性质,但也表示固定的键集不变性 .

loading...

2回答

  • 1

    就在这里 . 这就是 class 的作用 .

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

  • 0

    这取决于你的意思"I don't know the keys at compile time" . 如果你的 Map 用户甚至比 Map<string, boolean> 更胜一筹(尽管当你的键是字符串时,像 {[k: string]: boolean} 这样的普通的JavaScript对象更轻量级且具有相同的行为) .

    但是,如果您在编译时不知道键,但 Map 的用户确实知道它们,那么您只想使用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 constrainedstring . 但是代码的用户指定了一些键,此时泛型类型使用具体值进行实例化...这样可以让用户知道他们是否尝试使用无效键 .

    这有道理吗?希望有所帮助 . 祝好运 .

评论

暂时没有评论!