オブジェクトの特定のプロパティの値をアップデートをする関数を作成していました
interface Todo { name: string; description: string; } const todo: Todo = { name: "", description: "" }; const update = (arg: {name?: string; description?: string}): Todo => { return { ...todo, ...arg }; };
update 関数の引数の型を interface を使っていい感じにしたい…
NG: [key: union 型] ではエラーになる
{ [key: 'name' | 'description']?: string } という型を作ればいいと思ったのですが、これはエラーになってしまいます
type ArgType = { [key: 'name' | 'description']?: string };
=> An index signature parameter type cannot be a literal type or generic type. Consider using a mapped object type instead
OK: [key in union 型] を使えばOK
[key in 'name' | 'description'] という形であればOK
type ArgType = { [key in 'name' | 'description']?: string }; /* 👇 type ArgType = { name?: string | undefined; description?: string | undefined; } /*
interface から union型を作る
interface Todo の key の集合は keyof Todo で取得できるので、[key in keyof Todo] とすれば良い
Mapped types って言うらしい
interface Todo { name: string; description: string; } const todo: Todo = { name: "", description: "" }; const update = (arg: [key in keyof Todo]?: string}): Todo => { return { ...todo, ...arg }; };
₍ ᐢ. ̫ .ᐢ ₎ できた。
やったことある気がする…って思ってたら案の定同じような記事を過去に書いてたぬ…
[参考]
カラマリ・ユニオン良いよね…

![カラマリ・ユニオン [DVD] カラマリ・ユニオン [DVD]](https://m.media-amazon.com/images/I/5118G2HBDHL._SL500_.jpg)