Open2

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

mashimomashimo

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と対応するキーの値に

mashimomashimo

組み込みの型ユーティリティ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と同じに