是否可以在TypeScript中映射对象值类型?

问题描述 投票:5回答:2

例如,我有以下形式的功能:

function wrap<T>(item: T): W<T> {
}
interface W<T> {
  item: T;
}

是否可以编写函数(mapValues),通过应用此wrap函数并返回正确类型的对象来转换给定的对象值?我理解如何编写实际函数(lodash的_.mapValues将正常工作),但我不知道是否可以应用适当的类型。

是否可以编写mapValues函数,以便编译?

interface Before {
  a: number;
  b: string;
}

interface After {
  a: W<number>;
  b: W<string>;
}

let obj1: Before = { a: 1, b: "2" };
let obj2: After = mapValues(obj1);

function typecheck_number(arg: number) {}
function typecheck_string(arg: string) {}
typecheck_number(obj2.a.item);
typecheck_string(obj2.b.item);
typescript
2个回答
1
投票

这是一个可能的解决方案:

interface W<T> {
  item: T;
}
function mapValues<T>(obj: T): {[K in keyof T]: W<T[K]>} {
  // implementation
}

不幸的是,类似的递归方法似乎不可能,但希望有可能使用this proposal的类型约束。

这个链接非常有助于达到这个解决方案:https://blog.mariusschulz.com/2016/05/31/type-queries-and-typeof-in-typescript


0
投票

是的,您在OP中的类型是正确的。 mapValues只需要标记为返回After的类型。

这是一个TS playground,显示你的例子工作正常,如果mapValues返回一种类型的After

映射对象的属性是Wrap<T>类型。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.