Typoskript kann kein Namensfenster oder Dokument finden

72

Für jeden Fall:

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

Ich bekomme error TS2304: Cannot find name 'window'.

Fehlt mir etwas tsconfig.jsonfür eine Definitionsdatei, die ich installieren soll?

Ich bekomme die Nachricht beim Laufen tscund invscode

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

Meine Antwort: Zur Verwendung mit tsconfig.jsonIch ziele es5und benutzelib: ["es2015", "dom"]

Steven Bayer
quelle
1
Woher bekommen Sie diesen Fehler? In Ihrer IDE oder beim Ausführen tsc? Was ist Ihre aktuelle tsconfig.jsonDatei? Sie müssen relevantere Informationen bereitstellen, wenn Sie Hilfe benötigen
Nitzan Tomer
@NitzanTomer Ich habe die von Ihnen angeforderten Informationen hinzugefügt.
Steven Bayer

Antworten:

90

Es scheint, dass das Problem durch das Targeting verursacht wird ES2016.
Zielen Sie das aus einem bestimmten Grund an? Wenn Sie zielen, wird es6der Fehler wahrscheinlich verschwinden.

Eine weitere Option besteht darin, die Bibliotheken anzugeben, die der Compiler verwenden soll:

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

Welches sollte auch den Fehler verschwinden lassen.

Ich bin nicht sicher, warum die Bibliotheken nicht standardmäßig verwendet werden. In den Dokumenten für Compileroptionen wird für die --libOption Folgendes angegeben:

Hinweis: Wenn --lib nicht angegeben ist, wird eine Standardbibliothek eingefügt. Die
eingefügte Standardbibliothek lautet: ► Für --target ES5: DOM, ES5, ScriptHost
► Für --target ES6: DOM, ES6, DOM.Iterable, ScriptHost

Es wird jedoch nicht angegeben, welche Standardbibliotheken beim Targeting verwendet werden ES2016.
Es könnte ein Fehler sein, versuchen Sie ein Problem zu öffnen, wenn Sie dies tun, teilen Sie bitte den Link hier.

Nitzan Tomer
quelle
Das Targeting von ES6 hat es geschafft! Ich habe mich ursprünglich für ES2016 entschieden, weil ich vorhabe, das resultierende Javascript durch das Webpack zu bringen, damit ich nicht dachte, dass es einen großen Unterschied machen würde.
Steven Bayer
Für mich ist es sinnvoll, dass --libs anstelle einiger willkürlicher Standardeinstellungen explizit deklariert werden muss.
Mightyiam
1
Ich erhalte das gleiche Problem zur Codezeit in VSCode mit einem Angular 2-Projekt, das mit Angular CLI erstellt wurde, und der Wechsel zu "es6" in tsconfig.json und tsconfig.app.json hat es nicht behoben. Das Hinzufügen von "dom" zu tsconfig.json wurde ebenfalls nicht hinzugefügt (es befindet sich bereits in tsconfig.app.json). Es gibt keine Kompilierungs- oder Laufzeitfehler, aber das rote Schnörkel ist beim Codieren ärgerlich.
SG
@ S.Greylyn Wenn keine Kompilierungsfehler vorliegen, liegt ein Problem mit Ihrem VSCode vor. Ich habe es nie benutzt.
Nitzan Tomer
6
@ S.Greylyn verwenden "lib": ["dom"]in tsconfig.json. Das hat bei mir funktioniert.
Andrew Mairose
73

verwenden

"lib": ["dom"]

in tsconfig.json

z.B

{
  "compilerOptions": {
    "lib": ["es5", "es6", "dom"],
    "outDir": "./dist/",
    "sourceMap": true,
    "noImplicitAny": true,
    "module": "commonjs",
    "target": "es6",
    "moduleResolution": "node",
    "jsx": "react"
  },
  "include": ["./src/**/*"]
}
Damian Green
quelle
2
FWIW das hat es für mich gelöst. Sollte die akzeptierte Antwort sein, denn in einigen Situationen (Starter-Kits oder Tools, die bereits tscfür Sie ausgeführt werden, können Sie die an sie übergebenen CLI-Argumente nicht so einfach ändern, aber Sie kontrollieren sie mit ziemlicher Sicherheit tsconfig.json)
Ernesto