例如,我有一个以下形式的函数:
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);
mapValues
成为通用的,因此它将在任何其他接口上以这种方式工作(不仅仅是Before和After - 它们只是一个示例)。 - RogachmapValues
的类型声明是mapValues<T>(obj: any): T
,那么这样不就可以了吗? - ShanemapValues<{ prop1: T1, etc...}>()
(编译器无法推断T)。这个想法是返回类型自动取决于参数类型,类型检查器可以提供指导(从而帮助我作为程序员避免错误)。 - Rogach