Я не могу понять, как заставить эту фабрику createLetterMap
генерировать значения по умолчанию для своего экземпляра ...
«Как l oop over enums», на самом деле, не вопрос, насколько я понимаю это невозможно, потому что типы недоступны во время выполнения, но, может быть, я что-то упускаю из строковых эмуляторов?
enum Letter{
A = "A",
B = "B",
E = "E",
I = "I",
}
type Vowl = Letter.A | Letter.E | Letter.I
class LMAP{
test(){}
}
function createLetterMap<T extends Letter>(){
let lmapExtended = new LMAP() as LMAP & {
[key in T]?:string
};
// ?? create default values for keys somehow ??
return lmapExtended;
}
let vowlMap = createLetterMap<Vowl>()
vowlMap[Letter.E] = "Eat" // OK
// vowlMap[Letter.B] = "Bat" // Error! Good!
let defaultVal = vowlMap[Letter.A]; // undefined. Would like it to be populated.
В целом, я хотел бы использовать объединения строковых перечислений для получения объекты с ключами, в которых я могу использовать перечисления в качестве ключей для ситуаций вроде этого:
fn(v:Vowl){
...
letterMap[v].someVowlReleatedWork()
...
}
Я исследовал альтернативы, просто используя реальную Карту, которая ~ работает ~, но кажется, что есть способ сделать вещи чище, если я могу просто правильно указать типы ...
Лучшее, что я придумал, - это создание дополнительного массива перечислений, включенных в тип объединения, и использование ОБА и объединения, и массива для фабрики. ; что-то вроде ниже, что кажется глупым:
...
let Vowls = [Letter.A,... ]
createLetterMap<Vowl>(Vowls)