お断り
2022/5/25現在未解決です。
対処フロー
- 文字列リテラルの配列を定義する
- 配列をもとにUnion Typeを定義する
- 2.のUnion Typeをキーとするプロパティを持つTypeを定義する
- 3.のTypeを満たすオブジェクトを、1.で定義した配列をもとに作りたい
- 配列からオブジェクトにするには、Object.fromEntriesが有効
- 作ってみたが、戻り値の型が{[x: string]: any}で型一致させられなかった
コードベース
// 1.
const foo = ["a", "b", "c"] as const;
// 2.
type Foo = typeof foo[number];
// type Foo = "a" | "b" | "c"
// 3.
type Bar = {
[key in Foo]: () => void // プロパティの型は適当
}
// type Bar = { "a" | "b" | "c" : () => void }
// 4.
// 1.の配列と別の何かしらを組み合わせて、こんな感じのオブジェクトを作りたい
// const bar = {
// a: () => {console.log("hello")},
// b: () => {console.log("hello")},
// c: () => {console.log("hello")}
// }
// 5.
// Object.fromEntriesで作ること自体はできる
const greet = () => {console.log("hello")};
const bar: Bar = Object.fromEntries(foo.map(el => [el, greet]));
// 6.
// しかしObject.fromEntries()の戻り値の型は{[x: string]: any}だったので、type barと一致させられなかった
現状の結論: as
- const bar: Bar = Object.fromEntries(foo.map(el => [el, greet]));
+ const bar: Bar = Object.fromEntries(foo.map(el => [el, greet])) as Bar;
引き続き模索します。