By default, when editing a JavaScript file in VSCode, it will assume that the fetch
function and related types exist in the current context. This makes sense for JavaScript designed to run in the browser, but when running on node.js the fetch
function does not exist unless it is installed via node-fetch
. I find that in this context, VSCode is misleading, as it will not highlight an error when you trying calling the fetch
function, or access other types such as Request
and Response
, even though they do not exist unless you have node-fetch
installed.
How can I configure vscode to assume a node.js context, and therefore assume that fetch
does not exist unless I explicitly import it from node-fetch
?
CodePudding user response:
Why web types are there by default
From the docs for tsconfig.json compilerOptions.lib
:
TypeScript includes a default set of type definitions for built-in JS APIs (like
Math
), as well as type definitions for things found in browser environments (likedocument
).
How to change the defaults
Create a tsconfig.json or jsconfig.json, and set the compilerOptions.lib
array to not contain "DOM", which means that lib.dom.d.ts (the "DOM standard library" type definitions file that comes with TypeScript) will not be assumed. You should specify which ECMA Script standard you want to write your source code in.
The config file also has fields to control what files it takes effect on: files
, include
, and exclude
. If you specify none of them, include
will default to **
, which matches everything beside and recursively under subdirectories beside the config file.
Having to create this file could be seen as annoying if you just want to write a single JS file (ie. now you have a whole config file just for one source file!). I don't know if there are alternatives that are more convenient for such a use case. If anyone knows, please edit this answer.
- I looked briefly into TypeScript triple-slash directives, which allow specifying things on a per-file basis, but I think you can only add things (ie. I don't think you can use them to remove a
lib
). - At the time of this writing, there are VS Code settings that can be applied at the user-settings scope that affect settings for implicit projects (JS/TS files which don't have a project config file) (
js/ts.implicitProjectConfig.*
), but none of them are for setting thecompileOptions.lib
field, and my gut says it's probably not going to happen (but don't quote me on that).
You probably also want types for the Node API
Use npm to install a version of @types/node
. Make sure the major version number of the version you install matches the major version number of the version of Node JS you want to script to be runnable on.
Fun irrelevant facts to this question
Continuing on the point about VS Code's user-settings for implicit projects, VS Code puts some defaults in effect (on top of those that TypeScript itself does) if no project is detected. You can poke through the code at github.dev/microsoft/vscode by doing "Find in Files", using extensions/typescript-language-features/**/*
as the "files to include" field, and compilerOptions
as the find query. compilerOptions.lib
seems to not be something that VS Code touches in such a scenario.