What is the recommended config for typescript if I want to ue the compiled sources with node 8?
most tutorials use the following tsconig.json:
{ "compilerOptions": { "target": "es6", "module": "commonjs" } }
But now I figured out, that not all available features are supported. For example ['foo'].includes('bar')
throws the error: Property 'includes' does not exist on type 'string[]'.
I found an issue that addresses this problem. The solution is to use the lib es7
. I could overwrite the default libs: "lib": ["es7"]
But I'm not sure if this is the best config for node 8 - are there more features which are not supported by that lib? are there to much features defined?
So my question is: What are the best configurations for target
, lib
and module
if I want to use node 8?
TypeScript is well-established in the Node. js world and used by many companies, open-source projects, tools and frameworks. Some of the notable examples of open-source projects using TypeScript are: NestJS - robust and fully-featured framework that makes creating scalable and well-architected systems easy and pleasant.
"Npm", "Javascript" and "Great libraries" are the key factors why developers consider Node. js; whereas "More intuitive and type safe javascript", "Type safe" and "JavaScript superset" are the primary reasons why TypeScript is favored.
TypeScript is available as a package on the npm registry available as "typescript" . You will need a copy of Node. js as an environment to run the package. Then you use a dependency manager like npm, yarn or pnpm to download TypeScript into your project.
As of Node.js 8.10.0
, 100% of ES2017 is supported. If you know that you are targeting that version or newer, the optimal config would look like this:
"module": "commonjs"
Node.js is on it's way to add ES-Modules, but for now we'll have to stick with CommonJS.
"target": "es2017"
This tells TypeScript that it's okay to output JavaScript syntax with features from ES2017. In practice, this means that it will e.g. output async
/await
instead of embedding a polyfill (__awaiter
).
"lib": ["es2017"]
This tells TypeScript that it's okay to use functions and properties introduced in ES2017 or earlier. In practice, this means that you can use e.g. Array.prototype.includes
and String.prototype.padStart
.
The full config would thus be:
{ "compilerOptions": { "lib": ["es2017"], "module": "commonjs", "target": "es2017" } }
If you are running Node.js 16 you can see my similar answer for Node.js 16 here
If you are running Node.js 14 you can see my similar answer for Node.js 14 here
If you are running Node.js 12 you can see my similar answer for Node.js 12 here
If you are running Node.js 10 you can see my similar answer for Node.js 10 here
I'm sure you've already found this but there is Microsoft's starter template here: https://github.com/Microsoft/TypeScript-Node-Starter
Whilst you are still on Node 8.x, keep your module
set to commonjs
, target
can be es6
.
compilerOptions.lib
only defines what declarations the compiler uses for compile time checks, it does not affect the output of tsc
. In other words, you can use whatever lib
you want and not worry that your transpiled code will be any different (this is controlled entirely by compilerOptions.target
).
Using es7
as a lib
in your case will be fine and will give you type declarations for ES7 and under.
Array.includes
is ES7 (ES2016) and therefore as you've discovered is not part of ES6
. You could define your lib
as; lib: ["es6", "ES2016.Array.Include"]
to get around your issue.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With