Typescript 为什么函数中的'this'类型为'any'?

Typescript 为什么函数中的'this'类型为'any'?,typescript,Typescript,如果我在模块中有一个函数,TypeScript允许我执行类似于this.unexistingFunction()的操作(其中不存在unexistingFunction)。发生这种情况是因为此的类型为anỳ在函数内部 为什么呢?在这种情况下,没有理由将此键入为任何类型,而且它非常容易出错。例如,如果我不小心键入了this.myFunction()而不仅仅是myFunction()要调用本地函数,编译器将允许我这样做,即使this.myFunction()显然不存在。您可以启用--noimplici

如果我在模块中有一个函数,
TypeScript
允许我执行类似于
this.unexistingFunction()的操作(其中
不存在unexistingFunction
)。发生这种情况是因为
的类型为
anỳ在函数内部

为什么呢?在这种情况下,没有理由将
键入为任何类型,而且它非常容易出错。例如,如果我不小心键入了
this.myFunction()而不仅仅是
myFunction()
要调用本地函数,编译器将允许我这样做,即使
this.myFunction()显然不存在。

您可以启用
--noimplicit此true
选项将
限制为
任何
类型(
此:不允许任何

例如:

class Rectangle {
    //private w: number; //uncomment this line
    //private h: number; //uncomment this line

    constructor(w, h) {
        this.w = w;
        this.h = h;
    }
    getAreaFunction() {
        return () =>  {
            return this.w * this.h;
        };
    }
}
let rectangle = new Rectangle(2, 5);
let areaFunction = rectangle.getAreaFunction();
let area = areaFunction();
console.log(area);
注意:使用
tsc编译--noImplicitThis


发生这种情况可能是因为您没有绑定函数。 在JS和TypeScript中,
this
的值由调用方而不是声明方确定。
也就是说,如果在对象之间传递回调,如下所示:

const a={
a:function(){console.log(this)}
}
常数b={
b:a.a
}
b、 b();//`函数中的这个`将是'b'的实例,而不是声明它的'a'。
导致TypeScript编译器无法知道在编译时在何处调用函数,因此无法提供类型信息。 要解决此问题,您应该绑定函数:

a类{
构造函数(){
a=a.bind(这个);
}
/*其他同学*/
}
或使用箭头功能:

a类{
常数a=()=>{};
}
自动绑定到正确的上下文