Это зависит от того, что вы подразумеваете под «я не знаю ключей во время компиляции».Если даже пользователи вашей карты не будут знать ключи во время компиляции, то нет ничего лучше, чем 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
.Но пользователь кода указывает некоторые ключи, и в этот момент универсальный тип создается с конкретными значениями ... что позволяет пользователю узнать, пытаются ли они использовать недопустимый ключ.
Имеет ли это смысл?Надеюсь, это поможет.Удачи.