お題
組み込みの型ユーティリティ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>
K
がT
のプロパティであるように制約。 -
{ [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
今回の問題