【问题标题】:Why does typescript not complain about certain undefined variables为什么打字稿不抱怨某些未定义的变量
【发布时间】:2016-12-19 13:08:10
【问题描述】:

我有以下例子:

class Uncle {
  constructor(public name : string) { }

  talk() {
    return "Hello my name is " + name;
  }
}

let p : Uncle = new Uncle("Jo");
console.log(p.talk());

对于某些变量名称,typescript(现在 2.1.4 版)将不会抱怨它们没有在您的程序中定义(在方法讨论中,名称是在没有这个的情况下使用。)。 name 就是其中之一。

如果我将变量重命名为 firstName,编译器会正确地抱怨...

错误 TS2663:找不到名称“firstName”。您是指实例成员“this.firstName”吗?

同样适用于例如窗口,显然假定存在。

我的问题是:

  • 假定存在哪些变量名,为什么?
  • 是否可以更改该行为(例如,在某些 linter 中,您可以说明您希望哪些变量全局可用)?

【问题讨论】:

    标签: javascript typescript tsc


    【解决方案1】:

    它不会抱怨name 的原因是在全局命名空间中有一个名为 name 的变量。
    在开发者工具中打开控制台,输入name,回车,你会收到:""

    更多资源:

    所有全局变量都可以不用定义就可以使用。

    为了删除所有全局定义,您可以,例如在您的tsconfig.json 中,将"libs" 选项设置为一个空数组。这将删除 所有 全局变量。

    【讨论】:

    • 你知道有没有办法关闭它?
    • 关闭什么?变量name存在,你想让编译器做什么?
    • 不一定,例如当您为 node.js 应用程序编写代码时,窗口和朋友将不存在。在这种情况下,如果编译器不假定存在这些全局变量,那就太好了。
    • 好吧,我想您可以使用--lib 编译器选项并获得不包含name(或其他声明)的配置,这是list of libs,我没有没试过,也没有搜索到它包含在哪个lib中,但理论上它可能会完成。但这对我来说似乎太过分了。
    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 2018-10-14
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多