LoginSignup
21
22

More than 5 years have passed since last update.

TypeScript の小ネタ集

Last updated at Posted at 2018-09-19

型のプロパティをすべて非必須にする

Partial<T>

利用例

既存の必須項目がある型を流用する際などに利用できます。

型のプロパティをすべて必須にする

Required<T>

利用例

とある型から mapped type で型を生成している際に、元の型のシェイプの変更への追従が容易になります。

interface O1 {
    p1: any;
    p2?: any;
}
type O2 = Required<O1>;
type F<T> = { [K in keyof T]: () => void };
type F1 = F<O1>; // = { p1: () => void; p2?: () => void; }
type F2 = F<O2>; // = { p1: () => void; p2: () => void; }
const f1: F1 = {
    p1: () => {},
    // p2 がないがエラーにはならない
};
const f2: F2 = {
    p1: () => {},
    p2: () => {}, // p2 がないとエラーになる
};

型のプロパティをすべて読み取り専用にする

Readonly<T>

利用例

ある型のプロパティの変更を明示的に防ぐことができます。

interface O1 {
    p1: any;
    p2?: any;
}
type O2 = Readonly<O1>;
const o2: O2 = {
    p1: 'v1',
    p2: 'v2',
}
o2.p2 = 'v3'; // エラー

とある型のプロパティの一部を切り出した型を生成する

Pick<T, K extends keyof T>

利用例

既存の型の一部を流用する際に利用できます。

interface O1 {
    p1: any;
    p2: any;
}

interface O2 extends Pick<O1, 'p2'> {
    p3: any;
    p4: any;
}

const o2: O2 = {
    p2: '',
    p3: '',
    p4: '',
}

また、ある部分で一部の項目だけしか取り扱えないようにするといったことにも利用できます。

interface O {
    p1?: any;
    p2?: any;
}
function setToP2(o: Pick<O, 'p2'>): void {
    o.p1 = 'value'; // エラー
    o.p2 = 'value';
}
const o: O = {};
setToP2(o);
console.log(o); // = { p2: 'value' }

キーのセットから型を生成する

Record<K extends keyof any, T>

利用例

type Alignment = 'left' | 'center' | 'right';

type AlignmentFuncs = Record<Alignment, () => void>;

const alignmentFuncs: AlignmentFuncs = {
    left: () => { /* do left */  },
    center: () => { /* do center */  },
    right: () => { /* do right */  },
};

代入可能なものを除外した型を生成する

Exclude<T, U>

利用例

PickExclude を組み合わせることで、ある型から一部の項目を除外した型を作ることができます。抜き出したい項目が多い場合は、こっちを使った方が簡単になります。

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;

interface O1 {
    p1: any;
    p2: any;
}

type O2 = Omit<O1, 'p2'>; // = { p1: any }

型から null と undefined を取り除く

NonNullable<T>

利用例

Required<T> と同じような使い方になります。

関数の戻り値の型を取得する

ReturnType<T extends (...args: any[]) => any>

利用例

標準で用意されているものですが、使い道がまだ見つかっていません...どなたかいい使い道があったらご教授ください。

コンストラクタ関数の戻り値を取得する

InstanceType<T extends new (...args: any[]) => any>

利用例

標準で用意されているものですが、使い道がまだ見つかっていません...どなたかいい使い道があったらご教授ください。

配列の要素の型を取り出す

T[number]

利用例

配列自体ではなく配列の型に対して何らかの処理を行いたい時に利用できます。

type ElementType<T> = T extends any[] ? T[number] : never;

以下のやり方もあります。

type ElementType<T> = T extends (infer U)[] ? U : never;
21
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
22