🐱
TypeScriptでオブジェクトの生成時にプロパティ全てにBrandedTypesを付与する関数を作成する
結論
export const withBrand = <T extends { [k: string]: unknown }, B extends string>(obj: T, brand: B) => {
return obj as Record<keyof T, T[keyof T] & { __Brand: typeof brand }>;
};
解説
型パラメータ <T extends { [k:string] unknown }, B extends string>
ここでは2つの型パラメータ T と B を定義しています。T はオブジェクトの型を受け入れます。B はブランド(一意の識別子)の型を表します。
関数パラメータ (obj: T, brand: B)
関数には2つのパラメータがあります。obj はブランドを付けるオブジェクト、brand はブランドそのものです。
関数の戻り値 Record<keyof T, T[keyof T] & { __Brand: B }>
この関数は、元のオブジェクトのプロパティを保持しつつ、各プロパティにブランドプロパティ __Brand を追加した新しいオブジェクトを返します。この __Brand プロパティは元のブランド brand の型 typeof brand を持ちます。
型パラメータ T と B を使用していますが、これらは関数のパラメータ obj と brand から直接推論されます。
この関数が役立つ状況
この関数は、特定のオブジェクトが特定の役割を果たすことを型システムに通知する場合に役立ちます。例えば、ある関数が特定のブランドのオブジェクトのみを引数として受け入れるようにすることができます。
以上!
Discussion
これ便利ですね。ぼくもちょっとデモつくってみました。
定義側
使用側
簡単ですが、以上です。