重命名打字稿对象类型的键

时间:2018-10-08 12:36:25

标签: typescript

我有这个:

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'仅指类型,但在此处被用作值。

1 个答案:

答案 0 :(得分:3)

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

{
  "main": "index.js",
  "scripts": {
    "start": "micro"
  },
  "dependencies": {
    "micro": "^9.3.3",
    "si7021-sensor": "0.0.7"
  }
}

请注意,如果您提供更多属性,则此操作将无法正常工作:

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'>