为什么在函数内将this键入为any?

时间:2019-01-20 18:11:54

标签: typescript

如果我在模块中具有函数,则M['A'] = pd.DataFrame(X1[' Time (ms) ']) M['B'] = pd.DataFrame(X2[' Time (ms) ']) M['C'] = pd.DataFrame(X3[' Time (ms) ']) M['D'] = pd.DataFrame(X4[' Time (ms) ']) 允许我执行类似TypeScript的操作(其中this.unexistingFunction();不存在)。发生这种情况是因为unexistingFunction在函数内部具有类型this

那是为什么?在这种情况下,没有理由将anỳ键入为any,这很容易出错。例如,如果我不小心键入this而不是仅仅this.myFunction();来调用局部函数,即使显然myFunction();不存在,编译器也会允许我这样做。

2 个答案:

答案 0 :(得分:1)

您可以启用--noImplicitThis true选项来限制this类型的any(不允许使用this:any

示例:

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

进行编译

Check this from Typescript Playground

答案 1 :(得分:0)

这可能是因为您没有bind您的功能。 在JS和TypeScript中,this的值由调用者而不是声明者确定。
意思是,如果您在对象之间传递了回调,例如:

const a = {
  a: function() {console.log(this)}
}

const b = {
  b: a.a
}

b.b(); // `this` inside the function will be the instance of `b`, not `a` where it was declared.

这将导致TypeScript编译器无法知道在编译时将在何处调用该函数,因此它无法提供类型信息。 要解决此问题,您应该bind函数:

class a {
  constructor() {
    a = a.bind(this);
  }

  /* rest of class */
}

或使用箭头功能:

class a {
  const a = () => {};
}

会自动绑定到正确的上下文。