2016-11-09 90 views
0

如何键入一个函数,以便输入对象与输出对象相同,但具有不同的值?打字稿对象转换

//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); 

回答

2

现在这是可能的打字稿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); 
0

你可以使用泛型这个:

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); 
+0

没有这不会工作,因为我会叫用'{“C转换':23,'d':45}'然后不能恢复正确的类型 – Cine