将具有 ReadonlyArray 属性的对象接口转换为 Array

问题描述 投票:0回答:1

我有一个与此一致的界面:

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[]
  }
} 

预先感谢您的帮助!

typescript frontend typescript-typings
1个回答
0
投票

听起来您只想迭代对象类型的键,而不是其他类型。

如果是这样,那么您只需要再进行一项条件检查,其形式为

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[];
    };
}

又漂亮又干净。

看游乐场

© www.soinside.com 2019 - 2024. All rights reserved.