【问题标题】:Rename key of typescript object type重命名打字稿对象类型的键
【发布时间】:2019-03-13 03:15:59
【问题描述】:

我有这个:

type Two = {
  one: number,
  two: string,
  three: boolean
}

我希望它创建一个看起来像这样的类型:

type RenamedTwo = {
  one: number,
  two: string,
  four: boolean // difference
}

试图以这种方式创建它:

type Rename<T, K extends keyof T, N> = Pick<T, Exclude<keyof T, K>> & { [N]: T[K] }

尝试使用这种方式:

type Renamed = Rename<Two, 'three', 'four'>

但 TSlint 将 [N] 标记为错误并给出以下错误消息:

[ts] 类型文字中的计算属性名称必须引用其类型为文字类型或“唯一符号”类型的表达式。 [ts] 'N' 仅指类型,但在这里用作值。

【问题讨论】:

  • 如果有人想重命名多个属性,这里是类型定义:type Rename&lt;T, K extends keyof T, N extends string&gt; = Pick&lt;T, Exclude&lt;keyof T, K&gt;&gt; &amp; Record&lt;N, valueof&lt;Pick&lt;T, K&gt;&gt;&gt;

标签: typescript


【解决方案1】:

您还需要为重命名的属性使用映射类型:

type Two = {
    one: number,
    two: string,
    three: boolean
}


type Rename<T, K extends keyof T, N extends string> = Pick<T, Exclude<keyof T, K>> & { [P in N]: T[K] }

type Renamed = Rename<Two, 'three', 'four'>

请注意,如果您提供更多属性,这将无法按预期工作:

type Renamed = Rename<Two, 'two'  |'three' , 'four' | 'five'> // will be Pick<Two, "one"> & {
//    four: string | boolean;
//    five: string | boolean;
// }

【讨论】:

  • 谢谢!特别是对于笔记。我根据您的反馈调整了类型定义:type Rename&lt;T, K extends keyof T, N extends string&gt; = Pick&lt;T, Exclude&lt;keyof T, K&gt;&gt; &amp; Record&lt;N, valueof&lt;Pick&lt;T, K&gt;&gt;&gt;
猜你喜欢
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2021-04-02
  • 2020-03-03
  • 2018-09-15
  • 2020-06-10
  • 1970-01-01
相关资源
最近更新 更多