如果我有一个字典对象,例如:
const x = {
foo: {inner: 3},
bar: {inner: 'hi'},
};
如果内部属性具有不同的类型(例如,字符串和数字)。
然后我想把它映射到一个看似如下的结构:
const y = {
foo: 3,
bar: 'hi',
};
但是我希望能够在不丢失任何类型信息的情况下自动执行此操作。这可以在打字稿中实现吗?
我几乎用lodash到达那里:
import { mapValues } from 'lodash';
const y: Y = mapValues(x, (z) => z.inner);
然而,这最终取得了字典中所有类型的联合,并带有类型签名:
const y: {
foo: string | number;
bar: string | number;
}
而不是期望的:
const y: {
foo: number;
bar: string;
};
答案 0 :(得分: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);
参考:https://www.typescriptlang.org/docs/handbook/advanced-types.html(最后一段)