TypeScript
TypeScript copied to clipboard
typeRoots and types not working
TypeScript Version: 3.8.3
Code
This is my tsconfig.json
{
"compilerOptions": {
"typeRoots": [
"./typings"
],
"types": ["Phaser"]
}
}
In my project root, I got package.json, package-lock.json, main.ts(empty one), tsconfig.json
.
tsconfig.json
contains the above code.
typings
folder which I wrote in typeRoots
is empty.
After that, I run the following command in terminal:tsc --traceResolution
The idea is I am trying to use Phaser
as a global variable in my main.ts
file.
Bug 1)
Expected behavior:
What should happen is Phaser
shouldn't get resolved because compiler should start looking into my custom folder typings
.
Actual behavior:
Somehow it still gets resolved. And this is what it prints: Type reference directive 'Phaser' was successfully resolved to '/Applications/XAMPP/xamppfiles/htdocs/phaser-test/node_modules/Phaser/types/phaser.d.ts' with Pac kage ID 'phaser/types/[email protected]', primary: false.
.
I don't know how it finds it since in my typeRoots
, I don't have node_modules
specified.
What I have tried:
I tried to exclude node_modules
folder, I thought maybe they still get compiled and that's why this happens, but I couldn't make exclude
work.
"exclude": ["node_modules/*"]
"exclude": ["./node_modules/*"]
"exclude": ["./node_modules"]
but none of these worked. , but i don't think that will help because i created one file test.ts
and put something like this in there, but compilation is successful, So I guess the bug is related to typeRoots
.
let a:number = 10;
a="gio";
Bug 2)
Let's change the above tsconfig.json
to the following:
"compilerOptions": {
"typeRoots": [
"./node_modules/phaser/types",
],
"types": ["Phaser"]
},
What should happen now is Phaser
should be resolved from ./node_modules/phaser/types
and not take care of anything else such as trying to find package.json
in node_modules/phaser
and looking at types
property in that package.json
. But what actually happens is this doesn't get resolved at all on Ubuntu
versions, since ubuntu is 'case-sensitive. This config works fine on
OS x and windowsbecause
Phasergets resolved from
node_modules/phaser/package.json's types propertywhich shouldn't be happening because of my
typeRoots`.
Basically both things are so much related to each other.
This will probably be breaking change and will be part of broader work to improve type reference directive resolution
I have @types/node
installed in top level dir, and a tsconfig.json
for a sub-component in a subdir with "types": []
and "typeRoots": []
but node types are still loaded in my browser app (__dirname etc). This seems to contradict what the docs say:
By default all visible ”@types” packages are included in your compilation. Packages in node_modules/@types of any enclosing folder are considered visible. For example, that means packages within ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/, and so on. If typeRoots is specified, only packages under typeRoots will be included.
https://www.typescriptlang.org/tsconfig#typeRoots
I assume this is the same issue?
I'm working on a web app and have @types/node installed from a transient dependency. I have types set to an empty array in compiler options and it still uses the node types.
I'm working on a web app and have @types/node installed from a transient dependency. I have types set to an empty array in compiler options and it still uses the node types.
I'm also experiencing the same problem.
same problem with @types/node, I can use process.env in a client app