TypeScript.Enum
string型のEnumにmemberのstringを代入できないんじゃ
code:.ts
enum Soleil {
Ichigo = 'Ichigo_Hoshimiya',
Aoi = 'Aoi_Kiriya',
Ran = 'Ran_Shibuki',
}
let member: Soleil;
// これはOK
member = Soleil.Aoi;
// これはダメ
member = 'Aoi_Kiriya';
// Type "Aoi_Kiriya" is not assignable to Type "Soleil"
// これはOKだが・・・
member = 'Aoi_Kiriya' as Soleil;
// これもコンパイル通るので、実質Enumの意味を為していない
member = 'Yurika_Todo' as Soleil;
stringでもEnumでもいい感じに代入する方法はないの?
簡単にはいかない。
こういうUtil関数を作ってEnumでもStringでも代入できるようにする感じっぽい。
code:.ts
/** Utility function to create a K:V from a list of strings */
function strEnum<T extends string>(o: Array<T>): {K in T: K} { return o.reduce((res, key) => {
return res;
}, Object.create(null));
}
/** Create a K:V */
// keyof typeof で member = 'a' | 'b' | 'c'; なユニオンタイプを作る
type Soleil = keyof typeof Soleil;
let member: Soleil;
member = Soleil.Ichigo_Hoshimiya; // ok
member = 'Ichigo_Hoshimiya'; // ok
あと、上記方法だとkey === valueなEnumしか作れない。
こっちの方法だとkey, valueを自由に出来るが常に asEnum が必要。