为什么';t TypeScript是否在回调中强制执行泛型参数?
考虑以下使用2.6.1编译的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
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(…)
Tryfoo(string,(num:string)=>num.parseInt())代码>@zerkms已修复,谢谢查看@zerkms评论。如果您尝试foo(“a”,x=>console.log(x.toFixed()),编译器会告诉您类型stringrelated上不存在toFixed属性,这也解决了我的问题!