我有一个与此一致的界面:
interface Example {
field_a: number | null;
field_b: readonly string[];
readonly field_c: string;
nested: {
field_d: readonly unknown[]
}
}
我想应用突变并删除所有只读,如下所示:
type Mutable<T> = {
-readonly [K in keyof T]: T[K] extends Readonly<T[K]> ? Mutable<T[K]> : T[K];
};
创建一个新类型
Mutable<Example>
,会将 Mutate 应用于所有字段,即使不需要它,所以如果我将鼠标悬停在 field_a
上,应用的类型是 Mutable<number | null>
,这不是我想要的。
对于这个特定示例,我需要最终结果如下所示(当执行
Mutable<Example>
时),但应该足够动态以处理不同的接口。
type TransformedExample = {
field_a: number | null;
field_b: string[];
field_c: string;
nested: {
field_d: unknown[]
}
}
预先感谢您的帮助!
听起来您只想迭代对象类型的键,而不是其他类型。
如果是这样,那么您只需要再进行一项条件检查,其形式为
T extends object
:
type Mutable<T> =
T extends object
? {
-readonly [K in keyof T]:
T[K] extends Readonly<T[K]>
? Mutable<T[K]>
: T[K];
}
: T
其工作原理如您所愿:
interface Example {
field_a: number | null;
field_b: readonly string[];
readonly field_c: string;
nested: {
field_d: readonly unknown[]
}
}
type TransformedExample = Mutable<Example>
并且
TransformedType
报告为:
type TransformedExample = {
field_a: number | null;
field_b: string[];
field_c: string;
nested: {
field_d: unknown[];
};
}
又漂亮又干净。