为什么TypeScript在回调中强制执行通用参数?

时间:2017-11-22 20:11:20

标签: typescript generics

考虑使用2.6.1编译的TypeScript代码:

function foo<T> (bar: T, baz: (T) => void) {
    const test: T = bar;
    baz(test);
}

const string: string = "a";
foo(string, num => num.parseInt());

我希望编译失败,因为函数foo是用string调用的,但传递的回调函数使用string中没有的方法 - 而函数签名表明回调函数中的参数类型应该与第一个参数的类型相同。

然而,代码编译然后在运行时失败。

我错过了什么?

1 个答案:

答案 0 :(得分:4)

好吧,因为T中的baz: (T) => void不是类型名称,所以它是参数名称。

当您修改语法以表示您想要它的含义时,您会得到预期的错误:

function foo<T> (bar: T, baz: (t: T) => void) {
    const test: T = bar;
    baz(test);
}

const s: string = "a";
foo(s, num => num.parseInt()); 
// Property 'parseInt' does not exist on type 'string'.

当然,很难发现像这样的错误 - 只有当我将代码粘贴到typescript playground并打开--noImplicitAny时才会看到它。 (T)立即突出显示Parameter 'T' implicitly has an 'any' type。即使这个错误让人感到困惑 - 等等 - T不是参数,它是一种类型 - ......!