2017-11-22 12 views
0

にマッピングされたオブジェクトの種類を保存することができます(たとえばここでは、文字列と数値)の種類を変えて、内部プロパティがありどのように私のような辞書オブジェクトを持っている場合は活字体

const x = { 
    foo: {inner: 3}, 
    bar: {inner: 'hi'}, 
}; 

。私はあらゆる種類の情報を失うことなく、これを自動的に行うことができるようにしたいのですがしかし

const y = { 
    foo: 3, 
    bar: 'hi', 
}; 

それから私は、のように見える構造にこれをマッピングしたいと思います。これはTypescriptで可能ですか?むしろ

const y: { 
    foo: string | number; 
    bar: string | number; 
} 

import { mapValues } from 'lodash'; 
const y: Y = mapValues(x, (z) => z.inner); 

しかし、このタイプの署名で、辞書にすべてのタイプの和集合を取って終わる:私ははほとんど lodashでそこに着くことができ

希望:

const y: { 
    foo: number; 
    bar: string; 
}; 
+2

https://www.typescriptlang.org/docs/handbook/advanced-types.html(非常に最後の段落){:インナー3、 :インナー を 'HI'、 };';それは本当にあなたが意味するものですか? – jcalz

+0

あなたは正しいはずです: 'const y = {foo:3、bar: 'hi'、};' – peterjwest

答えて

2

このようなもの動作するはずです:

type Wrapped<T> = {[K in keyof T]: {inner: T[K]}}; 

function unwrap<T>(x: Wrapped<T>): T { 
    // (the implementation here is not the point) 
    return _.mapValues(x as any, z => z.inner) as T; 
} 

const y = unwrap(x); 

参考:あなたは `のconst Y =書い

+0

これはどういう仕組みか理解しようとしていますが、動作します!あなたは輝く神様です! – peterjwest

+0

これは、 'as any 'なしで' as T'なしで動作するようにも見えます。 – peterjwest

関連する問題