打字稿找不到名称窗口或文档


72

无论哪种情况:

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

我懂了 error TS2304: Cannot find name 'window'.

我是否缺少tsconfig.json应安装的定义文件?

我在跑步tsc和跑步时收到消息vscode

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"]


1
您从哪里得到该错误?在您的IDE中,还是在运行时tsc?您当前的tsconfig.json文件是什么?如果需要帮助,您需要提供更多相关信息
Nitzan Tomer

@NitzanTomer我添加了您要求的信息。
史蒂文·拜耳

Answers:


90

看来问题是由定位引起的ES2016
您是否有针对性地定位?如果您es6以错误为目标,则错误可能会消失。

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

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

这也应该使错误消失。

我不确定为什么默认情况下不使用这些库,在文档的编译器选项中它指出了该--lib选项:

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

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


以ES6为目标就成功了!我最初的目标是ES2016,因为我计划将生成的javascript通过webpack放置,所以我认为这不会有太大的不同。
史蒂文·拜耳

对我来说,--lib必须显式声明s而不是某些任意默认值。
mayyiam '17

1
我在VSCode中使用Angular CLI构建的Angular 2项目在代码时遇到了相同的问题,并且在tsconfig.json和tsconfig.app.json中都切换到“ es6”无法解决该问题;都没有在tsconfig.json中添加“ dom”(它已经在tsconfig.app.json中)。没有编译时或运行时错误,但是在编码时红色的波浪状令人讨厌。
SG

@ S.Greylyn如果没有编译错误,那么这是您的VSCode的问题。我没用过
Nitzan Tomer

6
@ S.Greylyn"lib": ["dom"]在中使用tsconfig.json。那对我有用。
安德鲁·迈罗斯

73

采用

"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/**/*"]
}

2
FWIW这就是为我解决的问题。应该是一个可以接受的答案,因为在某些情况下(已经tsc为您运行的入门工具包或工具,您不太容易更改传递给它的CLI arg,但是您几乎可以控制tsconfig.json
Ernesto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.