Open2
type-challengesをやりながら自分の回答と解答とかをメモする

Pick
組み込みの型ユーティリティPick<T, K>
を使用せず、T
からK
のプロパティを抽出する型を実装します。
例えば:
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = MyPick<Todo, 'title' | 'completed'>
const todo: TodoPreview = {
title: 'Clean room',
completed: false,
}
解答
type MyPick<T, K extends keyof T> = { [S in K]: T[S] }
-
generics型で、T,Kという変数を定義。
-
KはTのkeyのみという制約をつける。
-
問題のTodoであれば、Kにtitle,completedのみという制約をつける。
-
[S in K]は、[S in keyof T]と書き換えることができる
-
keyof と組み合わせることで、[title, completed]となる
-
T[S]→Todo[S]となるので、Todoと対応するキーの値に

組み込みの型ユーティリティReadonly<T>
を使用せず、T
のすべてのプロパティを読み取り専用にする型を実装します。実装された型のプロパティは再割り当てできません。
例えば:
interface Todo {
title: string
description: string
}
const todo: MyReadonly<Todo> = {
title: "Hey",
description: "foobar"
}
todo.title = "Hello" // Error: cannot reassign a readonly property
todo.description = "barFoo" // Error: cannot reassign a readonly property
解答
type MyReadonly<T> = {
readonly [P in keyof T]: T[P];
};
[P in keyof T]
- PはTのkeyのいずれか(titleかdescription)
- readonly Todo['title' | 'description']となる→Readonlyと同じに