请参阅代码here
interface IBar {
search:(any) => void;
}
class test{
search:(id:string) => void;
constructor(b:IBar){
this.search = (id) => this.searchImp(b, id);
}
private searchImp (b, id) {
b.unknownFn(id);
}
}
使用b.unknownFn(id)
不会出现任何错误。这可能是因为函数内的b
属于any
类型。仍然,为什么打字稿编译器不能推断出,我在调用中传递了b
类IBar
this.search = (id) => this.searchImp(b, id);
是否可以使用任何javascript与typescript一起工作?
我正在将一个JS应用移植到打字稿上。反正是为了让编译器检测到这些错误(在编码期间我可能不想输入注释所有函数参数,至少最初是因为我只是复制代码),所以我可以在编译期间纠正。使用noImplicitAny
检测到我使用了any
,为什么不能根据传递的类型检测到错误?
答案 0 :(得分:0)
private searchImp (b:IBar, id) {
b.unknownFn(id);
}
这应该是红线,除非你为你的函数指定参数的类型,我相信它会被视为any
。
答案 1 :(得分:0)
您的searchImp
声明没有任何参数类型注释只是
private searchImp (b : any, id : any) {
b.unknownFn(id);
}
所以你说这个方法接受b
的任何东西。没有进一步的检查适用于any
类型的任何内容。
您可能想到的是没有类型注释的函数的某种形式的类型推断。但这不是TypeScript的工作方式 - 没有推理,只有隐式类型any
。
答案 2 :(得分:0)
根据使用情况,不会发生TypeScript类型推断。它基于声明。例如。 foo
和arg
都是。但是bar接受1个参数并且返回什么都不是从声明中推断出来的。
// declaration
var foo;
// usage
foo = 123;
foo = 'asdf';
// declaration
function bar(arg){}
// usage
bar(123);
bar('asdf');
答案 3 :(得分:0)
在我看来,你没有取消选中该框"允许隐含的'任何'类型"在Typescript选项卡下的项目属性中。这甚至可以在做Andreas建议之前给你带来红色曲线(添加显式参数类型)。