TL;DR
TypeScript が標準で用意している、よくある型の変換を行う型。グローバルに使えるので、import せずに使える。
なぜ必要か
既存の型から、全プロパティを省略可能にした型や、一部のプロパティだけを選んだ型を作りたいことは多い。ユーティリティ型を使えば、同じような型を何度も書かずに、元の型から変換して作れる。
仕組み
ユーティリティ型は、型を引数に取るジェネリックな型である。主なものに次がある。
Partial<Type>: すべてのプロパティを省略可能にするRequired<Type>: すべてのプロパティを必須にするReadonly<Type>: すべてのプロパティを読み取り専用にするRecord<Keys, Type>: キーがKeys、値がTypeのオブジェクト型を作るPick<Type, Keys>とOmit<Type, Keys>: 指定したプロパティを選ぶ、または取り除くExclude<UnionType, ExcludedMembers>とExtract<Type, Union>: ユニオン型のメンバーを取り除く、または残すNonNullable<Type>:nullとundefinedを取り除くParameters<Type>とReturnType<Type>: 関数型の引数の型をタプルで、または戻り値の型を取り出すAwaited<Type>:Promiseを再帰的に剥がす
例
interface Todo {
title: string
description: string
completed: boolean
}
type TodoPreview = Pick<Todo, "title" | "completed">