Open9
TypeScriptメモ
ブルーベリー本にあまり書いてないことをメモしていく
Awaited
Promiseの中身の型を抜き出すUtility Type
type A = Awaited<Promise<string>>;
// type A = string
type B = Awaited<Promise<Promise<number>>>;
// type B = number
type C = Awaited<boolean | Promise<number>>;
// type C = number | boolean
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
ReturnType
関数の返り値の型を取得するUtility Type
外部ライブラリからimportした関数を用いた型付けとかするときに便利
type T0 = ReturnType<() => string>;
// type T0 = string
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
カリー化(currying)
TypeScriptに限った技術ではないが、一応メモ
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;
};
Discriminated Union(タグ付きユニオン)
変数の直交性を保つために作る型変数で使えそうなやつ。
TypeScriptのバージョンによって挙動が異なるので注意。
バージョンが低い場合、分割代入した際に型情報(型の関連性)が失われてしまう。
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;
};