为什么';t TypeScript是否在回调中强制执行泛型参数?

为什么';t TypeScript是否在回调中强制执行泛型参数?,typescript,generics,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(bar:T,baz:T)=>void){ 常数测试:T=bar; baz(试验); } 常量字符串:s

考虑以下使用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(bar:T,baz:T)=>void){ 常数测试:T=bar; baz(试验); } 常量字符串:string=“a”; foo(字符串,num=>num.parseInt()); 我预计编译会失败,因为函数
foo
是用
字符串调用的,但传递的回调函数使用的方法在
字符串中不可用,而函数签名指示回调函数中的参数类型应与第一个参数的类型相同

但是,代码会编译,然后在运行时失败


我遗漏了什么?

嗯,因为
baz:(T)=>void
中的
T
不是类型名,而是参数名

当您将语法修改为您希望它的意思时,您会得到预期的错误:

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'.
函数foo(bar:T,baz:T)=>void){ 常数测试:T=bar; baz(试验); } 常数s:string=“a”; foo(s,num=>num.parseInt()); //类型“string”上不存在属性“parseInt”。

诚然,很难发现像这样的错误-我只是在将代码粘贴到中并打开
--noImplicitAny
时才看到它
(T)
立即突出显示,参数“T”隐式具有“any”类型。甚至那个错误也让人困惑了片刻——等等——
T
不是一个参数,它是一种类型——

“正在使用数字方法”-在
number.prototype
中没有
parseInt
。请尝试
foo(…)
Try
foo(string,(num:string)=>num.parseInt())@zerkms已修复,谢谢查看@zerkms评论。如果您尝试foo(“a”,x=>console.log(x.toFixed()),编译器会告诉您类型stringrelated上不存在toFixed属性,这也解决了我的问题!