Typescriptあれこれ
初めに
rymです。今回はこちらのリポジトリを読んで勉強させていただいたことをまとめます。
注目したコード
名前の通り引数のオブジェクトxが、nameのプロパティを保持しているかをチェックするメソッドです。
export function hasProperty<K extends string>(x: unknown, ...name: K[]): x is { [M in K]: unknown } { return x instanceof Object && name.every(prop => prop in x); }
注目したポイント
unknown型 x
タイプセーフなany型のようなもの。型アサーション等用いずに使用するとコンパイルエラーになる。
TypeScript 3.0のunknown型 - タイプセーフなany
可変長仮引数 name
hasProperty({},'hoge','piyo')
などのように引数を与えると、'hoge'、'piyo'がnameに配列要素として格納される。
戻り値の is
booleanで返すと、メソッドの呼び出しもとで型推論が効かない。isを使えば、メソッドの戻り値が is で指定した型であることを呼び出し元に認識させ型推論されるようにできる。
戻り値の [M in K]
TypescriptのMapped Typeという構文。MがKの部分型であることを指定する。
prop in x
xがオブジェクトの時、オブジェクトが指定したプロパティを持っているときはtrueを返す。
結び
typescriptへの理解がまたひとつ進みました。参考にさせていただいたコードや記事の作成者様ありがとうございました。