Open5

type-challengesをやってみる

ikkitangikkitang

【初級】 Pick

https://github.com/type-challenges/type-challenges/blob/master/questions/4-easy-pick/README.ja.md

お題

組み込みの型ユーティリティPick<T, K>を使用せず、TからKのプロパティを抽出する型を実装します。

回答

type MyPick<T, K extends keyof T> = {
  [key in K]: T[key] 
}

調べた事

Lookup Types T[K]

https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a#lookup-types-tk

Kがプロパティ名の型であるとき、T[K]はTのそのプロパティの型となる

この問題でいうと、 KがTのプロパティ である事が重要で 指定しない・・例えば以下のように書くとエラーになる

type MyPick<T, K> = {
  [key in K]: T[key] 
}

Type 'key' cannot be used to index type 'T'

ikkitangikkitang

【初級】 ReadOnly

https://github.com/type-challenges/type-challenges/blob/master/questions/7-easy-readonly/README.md

お題

組み込みの型ユーティリティReadonly<T>を使用せず、T のすべてのプロパティを読み取り専用にする型を実装します。実装された型のプロパティは再割り当てできません。

回答

type MyReadonly<T> = {
  readonly [key in keyof T]: T[key];
}

やったぜ、一発正解

補足とか

Readonly

https://typescript-jp.gitbook.io/deep-dive/type-system/readonly#readonly-1

型T を取って、そのプロパティをすべて readonly としてマークする