snippettypescriptCritical
How to configure custom global interfaces (.d.ts files) for TypeScript?
Viewed 0 times
interfacescustomtypescriptforconfigurefileshowglobal
Problem
I'm currently working on a ReactJS project which uses Webpack2 and TypeScript. Everything works perfectly apart from one thing - I can't a find a way to move interfaces that I've written myself into separate files so that they are visible to the whole application.
For prototyping purposes I initially had interfaces defined in files that use them but eventually I started adding some that were needed in multiple classes and that's when all the problems started. No matter what changes I make to my
Here's my current
As you can see, my
I tested it with TypeScript 2.1.6 and 2.2.0 and neither works.
One way of getting it all to work is to move my
For prototyping purposes I initially had interfaces defined in files that use them but eventually I started adding some that were needed in multiple classes and that's when all the problems started. No matter what changes I make to my
tsconfig.json and no matter where I put the files my IDE and Webpack both complain about not being able to find names ("Could not find name 'IMyInterface'").Here's my current
tsconfig.json file:{
"compilerOptions": {
"baseUrl": "src",
"outDir": "build/dist",
"module": "commonjs",
"target": "es5",
"lib": [
"es6",
"dom"
],
"typeRoots": [
"./node_modules/@types",
"./typings"
],
"sourceMap": true,
"allowJs": true,
"jsx": "react",
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": false,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true
},
"exclude": [
"node_modules",
"build",
"scripts",
"acceptance-tests",
"webpack",
"jest",
"src/setupTests.ts"
],
"types": [
"typePatches"
]
}
As you can see, my
tsconfig.json is in the root of the project directory, all source is in ./src, I placed my custom .d.ts files in ./typings and included it in typeRoots.I tested it with TypeScript 2.1.6 and 2.2.0 and neither works.
One way of getting it all to work is to move my
typings directory into src and then import {IMyInterface} from 'typings/blah' but that doesn't feel right to me as it's not something I need to use. I want those interfaces to just be 'magically' available throughoSolution
"Magically available interfaces" or global types is highly discouraged and should mostly be left to legacy. Also, you should not be using ambient declaration files (e.g.
For code you write you should be using plain
While global types are discouraged, the answer to your issue is that there are two types of
Anything in a
The other file type is 'module', and anything in a
What makes a
My guess is you have inadvertently used
d.ts files) for code that you are writing. These are meant to stand-in the place of external non-typescript code (essentially filling in the typescript types into js code so that you can better integrate it with javascript).For code you write you should be using plain
.ts files to define your interfaces and types. While global types are discouraged, the answer to your issue is that there are two types of
.ts files in Typescript. These are called scripts and modules. Anything in a
script will be global. So if you define your interfaces in a script it will be available globally throughout your application (as long as the script is included in the compilation through either /// tags or through files:[] or includes:[] or the default **/*.ts in your tsconfig.json.The other file type is 'module', and anything in a
module will be private to the module. If you export anything from a module it will be available to other modules if those other modules chose to import it.What makes a
.ts file a "script" or a "module"? Well.... if you use import/export anywhere in the file, that file becomes a "module". If there are no import/export statements then it is a global script.My guess is you have inadvertently used
import or export in your declarations and made it into a module, which turned all your interfaces to private within that module. If you want them to be global then you would make sure you are not using import/export statements within your file.Context
Stack Overflow Q#42233987, score: 394
Revisions (0)
No revisions yet.