【问题标题】:Typescript cannot find name window or document打字稿找不到名称窗口或文档
【发布时间】:2017-05-11 05:12:23
【问题描述】:

对于任何一种情况:

document.getElementById('body');
// or
window.document.getElementById('body');

我收到error TS2304: Cannot find name 'window'.

我是否在 tsconfig.json 中遗漏了我应该安装的定义文件?

我在运行tscvscode 时收到消息

tsconfig.json:

{
    "compilerOptions": {
        "allowJs": true,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "jsx": "react",
        "module": "commonjs",
        "moduleResolution": "node",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "sourceMap": true,
        "suppressImplicitAnyIndexErrors": true,
        "target": "ES2016",
        "typeRoots": [
            "node_modules/@types/",
            "typings/index.d.ts"
        ]
    },
    "exclude": [
        "node_modules",
        "**/*-aot.ts"
    ]
}

我的回答: 为了与tsconfig.json 一起使用,我以es5 为目标并使用lib: ["es2015", "dom"]

【问题讨论】:

  • 你从哪里得到这个错误?在您的 IDE 中,还是在运行 tsc 时?您当前的tsconfig.json 文件是什么?如果您需要帮助,您需要提供更多相关信息
  • @NitzanTomer 我添加了您要求的信息。

标签: javascript typescript typescript2.0


【解决方案1】:

使用

"lib": ["dom"]

在 tsconfig.json 中

例如

{
  "compilerOptions": {
    "lib": ["es5", "es6", "dom"],
    "outDir": "./dist/",
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "commonjs",
    "target": "es6",
    "moduleResolution": "node",
    "jsx": "react"
  },
  "include": ["./src/**/*"]
}

【讨论】:

  • FWIW 这就是为我解决的问题。应该是公认的答案,因为在某些情况下(已经为您运行 tsc 的入门工具包或工具,您不太容易更改传递给它的 CLI 参数,但您几乎可以肯定控制 @987654325 @)
  • 我已将此添加到我的库中,但它仍然无法正常工作。 “lib”:[“es5”,“es6”,“dom”,“dom.iterable”,“esnext”],
  • 相同的@AdharshM...我想知道最近有没有问题?
  • 我也遇到了一个问题,我的代码工作正常,但后来却没有,但我没有更改任何与 TS 相关的内容,并且已经在使用 dom。我会尝试使用旧版本的 TS,我昨天更新了(但后来没有注意到这个问题)
  • @AdharshM 这很可能是由于github.com/lquixada/cross-fetch/issues/104,至少对我来说是这样。
【解决方案2】:

看来问题是针对ES2016引起的。
你瞄准那个是有原因的吗?如果您以es6 为目标,则错误可能会消失。

另一个选项是指定编译器使用的库:

tsc -t ES2016 --lib "ES2016","DOM" ./your_file.ts

这也应该使错误消失。

我不确定为什么默认情况下不使用这些库,在 docs for compiler options 中它声明了 --lib 选项:

注意:如果未指定 --lib,则会注入默认库。这 注入的默认库是:
► 对于 --target ES5:DOM,ES5,ScriptHost
► 对于 --target ES6:DOM,ES6,DOM.Iterable,ScriptHost

但它没有说明定位 ES2016 时的默认库是什么。
这可能是一个错误,尝试打开一个问题,如果你这样做,请在此处分享链接。

【讨论】:

  • 针对 ES6 成功了!我最初的目标是 ES2016,因为我打算将生成的 javascript 放到 webpack 中,所以我认为它不会有太大的不同。
  • 对我来说,--libs 必须被显式声明而不是一些任意的默认值。
  • 我在使用 Angular CLI 构建的 Angular 2 项目的 VSCode 代码时遇到了同样的问题,并且在 tsconfig.json 和 tsconfig.app.json 中都切换到“es6”解决不了;也没有将“dom”添加到 tsconfig.json(它已经在 tsconfig.app.json 中)。没有编译时或运行时错误,但红色波浪线在编码时很烦人。
  • @S.Greylyn 如果没有编译错误,那么这是您的 VSCode 的问题。我从来没用过。
  • @S.Greylyn 在tsconfig.json 中使用"lib": ["dom"]。这对我有用。
【解决方案3】:

为我解决的问题是将 tsconfig.json"target" 更改为 "es6"。之前是"es2015"

【讨论】:

    猜你喜欢
    • 2020-06-25
    • 2018-01-25
    • 2016-09-15
    • 2019-02-25
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2016-01-28
    • 2017-06-18
    相关资源
    最近更新 更多