Могу ли я создать карту с фиксированными ключами? - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно создать тип для представления набора именованных значений переключателя.Я бы хотел, чтобы этот тип был неизменным в том смысле, что переключатель имен фиксирован, но все же позволяет изменять значение значения переключателя.

Я в настоящее время нахожусьиспользуя Map<string, boolean>.Однако это означает, что пользователь моего типа может добавить дополнительные значения ключа или удалить существующие значения ключа, и я хотел бы предотвратить это.

Я думал об использовании ReadonlyMap<string, boolean>, но пока это мешаетключи, добавляемые или удаляемые, также не позволяют установить значение переключателя: -).

Есть ли другой тип, который позволил бы мне иметь фиксированный набор ключей, но изменяемые значения?

РЕДАКТИРОВАТЬ : то, что я хотел добавить к вопросу, - это то, что я не знаю имен переключателей (Map ключей) во время компиляции.Я загружу имена / значения переключателей и передам их различным частям системы;то, что я ищу, - это тип, который я могу использовать в объявлениях функций и т. д., который выражает природу данных ключ / значение, но также неизменность фиксированного набора ключей.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Это зависит от того, что вы подразумеваете под «я не знаю ключей во время компиляции».Если даже пользователи вашей карты не будут знать ключи во время компиляции, то нет ничего лучше, чем Map<string, boolean> (хотя, когда ваши ключи являются строками, простой старый объект JavaScript, такой как {[k: string]: boolean}, является более легким и имееттакое же поведение).

Если, однако, вы не знаете ключи во время компиляции, но пользователи вашей карты делают их знают, то вы просто хотите использовать универсальный для типа ключа.

Поскольку вы не опубликовали пример кода, я не могу указать точный вариант использования, поэтому я придумываю:

// 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 с ограничениями до string.Но пользователь кода указывает некоторые ключи, и в этот момент универсальный тип создается с конкретными значениями ... что позволяет пользователю узнать, пытаются ли они использовать недопустимый ключ.

Имеет ли это смысл?Надеюсь, это поможет.Удачи.

0 голосов
/ 10 декабря 2018

Да, есть.Это то, что делает класс.

class Foo {
    fixedKeyName1: boolean
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...