お題
オブジェクトのすべてのパラメーター(およびそのサブオブジェクトを再帰的に)読み取り専用にする型DeepReadonly
を実装する。
やりたいこと
type Example = {
x: {
a: 1
b: 'hi'
}
y: 'hey'
}
type Result = DeepReadonly<Example>;
// Result
type Result = {
readonly x: {
readonly a: 1
readonly b: 'hi'
}
readonly y: 'hey'
}
解答
type DeepReadonly<T> = keyof T extends never
? T
: { readonly [K in keyof T]: DeepReadonly<T[K]> };
解説
処理の流れ
-
keyof T extends never ? T : ...
keyof T
がnever
であればT
をそのまま返す条件分岐 -
{ readonly [K in keyof T]: DeepReadonly<T[K]> }
Mapped Typesを使用し、keyof T
がnever
になるまで再帰的に処理を行う
keyof Tがneverを返すタイミングはいつ?
T
がプリミティブ型・リテラル型の場合にnever
が返される。
Readonlyとは...
keyofとは...
Mapped Typesとは...
参考記事
今回の問題