例如,我有以下形式的功能:
function wrap<T>(item: T): W<T> {
}
interface W<T> {
item: T;
}
是否可以编写函数(mapValues
),它将通过应用此wrap
函数并返回正确键入的对象来转换给定的对象值?我理解如何编写实际函数(lodash&#39; s _.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);
答案 0 :(得分: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
答案 1 :(得分:0)
是的,您在OP中的类型是正确的。只需要标记mapValues
即可返回After
的类型。
以下TS playground显示,如果mapValues
返回After
类型,则示例工作正常。
映射对象的属性属于Wrap<T>
。