3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Tips: TypeScriptでオブジェクト型から関数プロパティを抜いた型を生成する

Posted at

この記事は何

最近TypeScriptでクラスなどとして定義したオブジェクト型から、関数のプロパティのみを除外した型を生成したいシーンがあったので、その方法についてまとめた記事です。

TL;DR

以下の型の定義で実現できます。

type OmitFunctionNames<T> = {
  [K in keyof T]: T[K] extends (...args: never[]) => unknown ? never : K;
}[keyof T];

type OmitFunctions<T> = Pick<T, OmitFunctionNames<T>>;

//これを使う
type RecursiveOmitFunctions<T> = {
  [K in keyof OmitFunctions<T>]: OmitFunctions<T>[K] extends object
    ? RecursiveOmitFunctions<OmitFunctions<T>[K]>
    : OmitFunctions<T>[K];
};

解説

ただコード紹介をしただけで終えてしまうのも味気ないので、少しだけ解説を書きます。

OmitFunctionNames<T>

type OmitFunctionNames<T> = {
  [K in keyof T]: T[K] extends (...args: never[]) => unknown ? never : K;
}[keyof T];

OmitFunctionNamesは、型Tのプロパティ名のうち、関数でないものを抽出する型です。
この型を用いて、除外するプロパティを抽出します。

OmitFunctions<T>

type OmitFunctions<T> = Pick<T, OmitFunctionNames<T>>;

OmitFunctionsは、型Tから関数プロパティを除外した型を作成します。
Pick<T, OmitFunctionNames<T>>は、型Tのうち、OmitFunctionNames<T>で得られたプロパティ名だけを持つ新しい型を生成するという定義を行なっています。

RecursiveOmitFunctions<T>

export type RecursiveOmitFunctions<T> = {
  [K in keyof OmitFunctions<T>]: OmitFunctions<T>[K] extends object
    ? RecursiveOmitFunctions<OmitFunctions<T>[K]>
    : OmitFunctions<T>[K];
};

RecursiveOmitFunctionsは、型Tから関数プロパティを再帰的に除外した型を作成します。
プロパティにオブジェクトである場合は再帰的にRecursiveOmitFunctions<OmitFunctions<T>[K]>を適用し、そうでない場合はそのままの型を返します。

3
0
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
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?