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

【TypeScript】type-challenges 中級編 3・Omit 解説

Posted at

お題

組み込みの型ユーティリティOmit<T, K>を使用せず、TのプロパティからKを削除する型MyOmitを実装する。

やりたいこと

interface Todo {
  title: string
  description: string
  completed: boolean
};

type Result = MyOmit<Todo, 'description'>;

// Expected
interface Expected {
  title: string
  completed: boolean
};

解答

type MyOmit<T, K extends keyof T> = {
  [P in keyof T as P extends K ? never : P]: T[P]
};

解説

処理の流れ

  • <T, K extends keyof T>
    KTのプロパティであるように制約。
  • { [P in ...]: T[P] }
    Mapped Typesを使用し、オブジェクトを作成。
  • [P in keyof T as P extends K ? never : P]
    asを使用し、as以降の条件分岐をもとに、Pの値を再割り当て(リマップ)する。

そもそもOmit<T, K>とは...

オブジェクトの型TからKで指定したプロパティを除いたオブジェクト型を返すユーティリティ型である。

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 = {
  surname: string
  middleName?: string
  givenName: string
};

Mapped Typesにおけるasとは...

キーをリマップ(再割り当て)する機能を持つ。
Mapped Types内で、キーを条件に基づいて変更することができる。

型アサーションのasとは異なる機能です

keyofとは...

Mapped Typesとは...

参考記事

ユーティリティ型Omit<T, keys>

Mapped Typesにおけるas

型アサーションas

今回の問題

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