【问题标题】:Typescript object conversion打字稿对象转换
【发布时间】:2017-03-22 20:44:03
【问题描述】:

如何键入函数,使输入对象与输出对象相同,但值不同?

//a has type { a: number;b: number }
let a = { 'a': 1, 'b': 1 };
interface IDictNumber {
   [key: string]: number;
}
interface IDictString {
   [key: string]: string;
}
function convert(f: IDictNumber) {
   return Object.keys(f)
      .reduce((p, v) => {
            p[v] = `${f[v]}`;
            return p;
         },
      {} as IDictString);
}
//b has type IDictString, but I wanted it to have { a: string;b: string }
let b= convert(a);

【问题讨论】:

    标签: typescript typescript2.0 typescript2.1


    【解决方案1】:

    这现在可以在 TypeScript 2.1 中实现:

    //a has type { a: number;b: number }
    let a = { 'a': 1, 'b': 1 };
    type Convert<T,K> = {
       [P in keyof T]: K;
    };
    function convertToString<T>(f: T) {
       let a  = <(keyof T)[]>Object.keys(f);
       return a.reduce((p, v) => {
                p[v] = `${f[v]}`;
                return p;
             },
          {} as Convert<T, string>);
    }
    let b = convertToString(a);
    

    【讨论】:

      【解决方案2】:

      您可以为此使用泛型:

      let a = { 'a': 1, 'b': 1 };
      
      interface A<T extends string|number> {
          [key: string]: T;
          a: T,
          b: T
      }
      
      function convert(f: A<number>) {
          return Object.keys(f)
              .reduce((p, v) => {
                      p[v] = `${f[v]}`;
                      return p;
                  },
              {} as A<string>);
      }
      
      let b = convert(a);
      

      【讨论】:

      • 不行,因为我会用{ 'c':23, 'd': 45} 调用convert,然后找不到正确的类型
      猜你喜欢
      • 1970-01-01
      • 2020-12-15
      • 2021-07-24
      • 2014-05-04
      • 1970-01-01
      • 2017-02-11
      • 2018-10-10
      • 2018-06-07
      • 2023-03-07
      相关资源
      最近更新 更多