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 });
不推断第二个参数。这是打字稿推断的错误还是仅仅是一种误解?
答案 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> 可能会出现在更复杂的示例中。
[...]