TypeScript中对象文字表示法中的函数。为什么`this`上下文是'any`类型?

时间:2017-05-28 17:34:48

标签: typescript typescript-typings

也许这个问题已被提出,但我找不到任何问题。而且看起来很天真。 TypeScript可以很好地使用对象文字表示法,但是在定义其中的方法时,它不能正确处理该函数中的this上下文,似乎this接收any类型,所以有没有自动完成。

var foo = {
    log(str) {
        console.log(str);
    },
    print(str) {
        this. /* No autocompletion */
    }
};    
foo. /* Normal autocompletion */

Playground

当然,我希望自动完成在方法中正常工作,就像使用foo变量时一样。我可以先声明一个类,然后实例化该对象,但如果没有声明中间classinterface,它为什么不起作用,在这个简单的例子中它似乎是一个样板?

2 个答案:

答案 0 :(得分:1)

官方TypeScript Documentation关于职能:

  

[...]仍然是any。那是因为this来自对象文字内的函数表达式。

GitHub上的TypeScript Wikithis关键字及其上下文也有很好的解释。

答案 1 :(得分:0)

供以后参考: 从TS@2.3开始,此行为会稍微复杂一些:

  • 如果该方法具有显式声明的此参数,则该参数具有该参数的类型。

  • 否则,如果该方法由带有 此参数,具有该参数的类型。

  • 否则,如果启用了--noImplicit,则包含对象 文字的上下文类型包含ThisType, 输入T。
  • 否则,如果启用了--noImplicit,则包含对象 文字的上下文类型不包含ThisType, 具有上下文类型。
  • 否则,如果启用--noImplicitThis,则具有 包含对象文字。
  • 否则,它的类型为any。

reference