多个通用参数类型推断不起作用

时间:2018-04-04 17:30:07

标签: javascript typescript generics

export class OneParam {
    static bar<P1>(q:any, params: { p1: P1 }) {}
}

OneParam.bar('foo', { p1: 12 });

在上面的代码块中,P1被正确推断,不需要显式传入,如下所示:

export class TwoParams {
    static bar<T, P1>(q:T ,params: { p1: P1 }) {}
}

TwoParams.bar<string>('foo', { p1: 12 });

不推断第二个参数。这是打字稿推断的错误还是仅仅是一种误解?

1 个答案:

答案 0 :(得分:1)

这可能是故意的,你可以在这里阅读:

https://www.typescriptlang.org/docs/handbook/generics.html

我提取了有趣的部分:

[...]

一旦我们编写了通用标识功能,我们就可以通过两种方式之一来调用它。第一种方法是将所有参数(包括type参数)传递给函数:

let output = identity<string>("myString");  // type of output will be 'string'

这里我们明确地将T设置为函数调用的参数之一,使用&lt;&gt;表示。围绕参数而不是()。

第二种方式也许是最常见的方式。这里我们使用类型参数推断 - 也就是说,我们希望编译器根据我们传入的参数类型自动为我们设置T的值:

let output = identity("myString");  // type of output will be 'string'

请注意,我们不必在尖括号中显式传递类型(&lt;&gt;);编译器只查看了值&#34; myString&#34;,并将T设置为其类型。

虽然类型参数推断可以是保持代码更短且更易读的有用工具,但是当编译器无法推断类型时,您可能需要显式传入类型参数,就像我们在上一个示例中所做的那样, / em> 可能会出现在更复杂的示例中。

[...]