2016-11-09 2 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

Нет, что не будет работать, так как я назвал бы конвертировать с '{«с ': 23,' d ': 45} ', а затем не получить правильный тип назад – Cine