代码之家  ›  专栏  ›  技术社区  ›  Eduard

重命名typescript对象类型的键

  •  1
  • Eduard  · 技术社区  · 7 年前

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

    [N] 作为错误并给出此错误消息:

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

    1 回复  |  直到 7 年前
        1
  •  10
  •   Titian Cernicova-Dragomir    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'>
    

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

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