Open9

TypeScriptメモ

enpolioenpolio

ブルーベリー本にあまり書いてないことをメモしていく

enpolioenpolio

infer

「型に含まれる型」みたいなものを取り出すための宣言。取り出したい型の部分にinfer Uとすると、Uという名前で型を取り出すことができる。
Conditional TypeであるT extends ... ? ... : ...の中で使われる。

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
type ToString = (num: number) => string
type returnTypeToString = ReturnType<ToString>
// type returnTypeToString = string

https://reosablo.hatenablog.jp/entry/2020/08/25/005957

https://zenn.dev/kotamaki/articles/1bef9e8ce000e3

enpolioenpolio

overload function

関数に対して複数の型を定義できる。Juliaとかであるやつ。

JavaScriptにoverload funcitonはないので、TypeScriptのオーバーロードはちょっと特殊。

  • オーバーロードシグネチャを先に書き、その後に実装シグネチャを書く
    • オーバーロードシグネチャはより詳細な型を用いたものを先に書く
  • 実装シグネチャはオーバーロードシグネチャの型を満たすように実装しなくてはならない
function add(a: number, b: number): number; // オーバーロードシグネチャ
function add(a: string, b: string): string; // オーバーロードシグネチャ
function add(a: any, b: any): any { // 実装シグネチャ
  return a + b;
}

let result1 = add(1, 2); // number
let result2 = add("Hello, ", "world!"); // string

https://typescriptbook.jp/reference/functions/overload-functions

https://zenn.dev/tsuboi/articles/01eba135ded4aa7907d9

enpolioenpolio

Pick

Pick<T, Keys>でオブジェクト型TからKeysで指定したキーだけを含むオブジェクト型を返す

type User = {
  surname: string;
  middleName?: string;
  givenName: string;
  age: number;
  address?: string;
  nationality: string;
  createdAt: string;
  updatedAt: string;
};
type Person = Pick<User, "surname" | "middleName" | "givenName">;

// type Personは以下と同じ
type Person = {
  surname: string;
  middleName?: string;
  givenName: string;
};

https://typescriptbook.jp/reference/type-reuse/utility-types/pick

enpolioenpolio

Omit

Omit<T, Keys>でオブジェクトの型TからKeysで指定したプロパティを除いたobject型を返す

type User = {
  surname: string;
  middleName?: string;
  givenName: string;
  age: number;
  address?: string;
  nationality: string;
  createdAt: string;
  updatedAt: string;
};
type Optional = "age" | "address" | "nationality" | "createdAt" | "updatedAt";
type Person = Omit<User, Optional>;

// type Personは以下と同じ
type Person = {
  surname: string;
  middleName?: string;
  givenName: string;
};

https://typescriptbook.jp/reference/type-reuse/utility-types/omit