就像在问题中一样,有没有办法创建递归的Readonly <T>
实用程序类型,它:
- 判断类型
T
是基元类型还是扩展类型{}
- 如果类型
T
递归地扩展{}
,则将RecursiveReadonly <T>
应用于其属性
伪代码:
type RecursiveReadonly <T> = {
readonly [P in keyof T]:
T === object ?
RecursiveReadonly <T[P]> :
T[P]
};
PS.正常情况下,这应该是可行的
type RecursiveReadonly <T> = {
readonly [P in keyof T]: RecursiveReadonly <T[P]>
};
然而...type FOO = RecursiveReadonly <{ foo: boolean }>;
创建类型:type FOO = { readonly foo: RecursiveReadonly <boolean>
,在某些模糊的情况下(我现在无法提供),tsc
抛出错误RecursiveReadonly <boolean> is not assignable to boolean
.我认为这只适用于基元类型,因此本例中使用的boolean
类型是所有基元类型的占位符.