【发布时间】:2016-04-20 19:32:59
【问题描述】:
我有一个被多次调用的函数。
function foo(parameter) {
parameter.a;
parameter.b;
parameter.c;
parameter.d;
}
每次调用的参数都不同,但它们都是文字并且具有相同的结构。
const first = { a: 1, b: 2, c: 3, c: 4};
const second = { a: 2, b: 4, c: 6, c: 8};
foo(first);
foo(second);
另外,这些对象有很多属性,因此手动指定参数的类型很繁琐,这导致我的问题:如何推断foo的参数类型?编译器正确推断出first 和second 的类型,但似乎无法推断出parameter 的类型。
这是我尝试过的。
-
您可以将实例放入类型位置。
foo(parameter: typeof first) { parameter.a; parameter.b; //... }它可以工作并且类型正确,但我想避免使用这种方法,因为函数和文字是在不同的文件中定义的,我不想将文字导入带有函数定义的文件中。
-
如果我将函数转换为 lambda,编译器似乎很乐意推断类型。它看起来像这样:
function wrapper<T>(parameter: T, foo: (p: T) => void) { foo(parameter); } wrapper(first, parameter => { // parameter is inferred to be `typeof first`. parameter.a; parameter.b; //... })但是,一旦我将 labmda 提取到一个变量中(我需要重用该函数),它就会被推断为 any。
function wrapper<T>(parameter: T, foo: (p: T) => void) { foo(parameter); } const lambda = parameter => { // parameter is `any` parameter.a; parameter.b; //... } wrapper(first, lambda)
【问题讨论】:
-
我遇到了同样的问题,接口是显而易见的解决方案,但是......因为我们有很多属性并且我们已经编写了一些对象文字......并且编译器推断出类型......可以我们命名该推断类型并使用它来声明其他对象和函数参数的类型?
标签: typescript