rymの技術ログ

書き出す。書き残す。

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 で指定した型であることを呼び出し元に認識させ型推論されるようにできる。

TypeScript の"is"と"in"を理解する

戻り値の [M in K]

TypescriptのMapped Typeという構文。MがKの部分型であることを指定する。

【TypeScript】inを使った構文まとめ

Mapped Typesのあれこれ

prop in x

xがオブジェクトの時、オブジェクトが指定したプロパティを持っているときはtrueを返す。

MDN

結び

 typescriptへの理解がまたひとつ進みました。参考にさせていただいたコードや記事の作成者様ありがとうございました。