フォームのエラーを作っていて、schema からエラー用のオブジェクトの型を作りたかった。
例えば
interface UserInterface { 'name': string; 'age': number; 'image'?: string; }
こんな interface や type から下記のようなエラー用のオブジェクトの型を作りたい。
type ErrorType = { 'name?': string; 'age?': string; 'image?': string; }
schema になる interface は変わるかも知れないので {[key]: string}
で定義したい
key in keyof interface を使えばOK
keyof interface
で interface, type の key (プロパティ) の集合が取れる。
それが key in keys
なので key の集合の中に含まれる値となる。
なので、先のエラー用のオブジェクトの型は次のように定義すればOK
type ErrorType = { [key in keyof UserInterface]: string; } /* => type ErrorType = { 'name': string; 'age': string; 'image?': string; } /*
必ずしもエラーがあるわけではないので、プロパティを省略可能にする
interface を Partial
にすればOK
type ErrorType = { [key in keyof Partial<UserInterface>]: string; } /* => type ErrorType = { 'name?': string; 'age?': string; 'image?': string; } /*
₍ ᐢ. ̫ .ᐢ ₎ できた
TypeScript ちょっとずつ解ってる感がある今日このごろです。
[参考]
アタシ☆再生産