Built-in Utility Types

ある型がほとんどのコードベースで有効性があると感じられた場合、 その型はTypeScriptに追加され、他の誰もが使えるようになります。 TypeScriptに追加されたら、いつでもその型が使えることが 保証されます。 Partial オブジェクト型を型引数として受け取り、そのプロパティを すべて任意プロパティへと変換します。

interface Sticker {
  id: number;
  name: string;
  createdAt: string;
  updatedAt: string;
  submitter: undefined | string;
}

type StickerUpdateParam = Partial;

// Readonly

// オブジェクト型を型引数として受け取り、そのプロパティを読み取り専用にします。

type StickerFromAPI = Readonly;

// Record

// KeysFromからプロパティの一覧を受け取り、 各プロパティの値をType型にした型を作成します。 型キーの一覧:
type NavigationPages = "home" | "stickers" | "about" | "contact";

// 上記キーに対応するデータの型:
interface PageInfo {
  title: string;
  url: string;
  axTitle?: string;
}

const navigationInfo: Record = {
  home: { title: "Home", url: "/" },
  about: { title: "About", url: "/about" },
  contact: { title: "Contact", url: "/contact" },
  stickers: { title: "Stickers", url: "/stickers/all" },
};

// Pick

// 型の第一引数に受け取ったオブジェクトから、第二引数に任意のプロパティ名を定義して そのプロパティと対応する値の型を持つ型を作成します。 型のホワイトリストのようなものです。
type StickerSortPreview = Pick;

// Omit

// 型の第一引数に受け取ったオブジェクトから、第二引数に任意のプロパティ名を定義して そのプロパティを除外した型を作成します。 型のブラックリストのようなものです。
type StickerTimeMetadata = Omit;

// Exclude

// 型の第一引数に受け取った共用体型から、第二引数に受け取った共用体型を 除外した型を作成します。
type HomeNavigationPages = Exclude;

// Extract

// 型の第一引数に受け取った共用体型から、第二引数に受け取った共用体型に 当てはまる型を作成します。
type DynamicPages = Extract;

// NonNullable

// 型引数に受け取った共用体型から、nullとundefinedを除外した型を返します。 値のバリデーションに使えるでしょう。
type StickerLookupResult = Sticker | undefined | null;
type ValidatedResult = NonNullable;

// ReturnType

// 型引数に受け取った関数型から、その返り値の型を作成します。

declare function getStickerByID(id: number): Promise;
type StickerResponse = ReturnType;

// InstanceType

// クラスインスタンス、またはコンストラクタ関数を持つオブジェクトから、 そのインスタンスの型を作成します。
class StickerCollection {
  stickers: Sticker[];
}

type CollectionItem = InstanceType;

// Required

// 型引数に受け取ったオブジェクト型からオプショナルのプロパティをすべて 必須に変換した型を作成します。
type AccessiblePageInfo = Required;

// ThisType

// 他の型とは違い、ThisTypeは新しい型を返しません。 関数で使われるthisの型を型引数に受け取った型に変換します。 ThisTypeはTSConfigのnoImplicitThisがtrue の場合にしか使えません。 https://www.typescriptlang.org/docs/handbook/utility-types.html