问题
I have an external javascript library that creates a global object in window. To use this object in typescript code, I have created an ambient module file (d.ts) that is imported inside other typescript file.
The problem I am facing is that the compiler says that the module file is not a module
src/App.ts(6,22): error TS2306: File '/Users/user/ts-problems/src/abc.d.ts' is not a module.
I'm also using webpack with ts-loader but compiling it alone with (tsc) gives me the same result.
This is the abc.d.ts ambient module file
declare module "abc" {
export interface Greeter {
sayHello(): void;
}
export var abc: Greeter;
}
And this is the App.ts file:
import * as abc from "./abc";
class App {
static sayGoodbye() {
console.log("goodbye from App.ts");
}
}
abc.abc.sayHello();
App.sayGoodbye();
The test project is available at https://github.com/daneilsan/ts-module-problem
Any help would be very appreciated because I don't know what else to do
回答1:
The file abc.d.ts does not have any export or imprort statement at the top level, so it is not a module and can't be used with relative import. That is,
import ...some stuff... from "./abc";
fails.
However, there is no files, include or exclude present in your tsconfig.json, so by default, any file with *.ts or *.d.ts extension is included in the compilation.
That means abc.d.ts is included, so there is no need to ///reference it, and all declarations within it are seen by the compiler, in particular this one:
declare module "abc" {
... stuff exported here
}
That means you can use this import
import * as abc from "abc";
to get stuff imported. It will be available as abc.Greeter and abc.abc.
This form
import {Greeter, abc} from "abc";
also works, making Greeter and abc available directly and not as properties of abc scope.
In short: to get things working, the module name in import statement must be spelled precisely in the same way as in the declare module statement ("abc"), and the file that contains declare module must be included in the compilation (it's already done by default with your tscontig).
来源:https://stackoverflow.com/questions/44476133/how-can-self-made-ambient-modules-be-created-and-imported-in-typescript