Reputation: 3086
I am using TypeScript v1.4.1 and would like to require an external module (in this case "chai") and have it be type checked.
However, I am running into some sort of naming conflict with this code:
/// <reference path="../typings/node/node.d.ts" />
/// <reference path="../typings/chai/chai.d.ts" />
/// <reference path="../typings/mocha/mocha.d.ts" />
var chai = require("chai");
var expect = chai.expect;
var assert = chai.assert;
describe("TEST", () =>
{
it("true should be true", (done)=>
{
expect(true).to.be.true;
done();
});
});
With this definition file:
declare module chai {
...
}
declare module "chai" {
export = chai;
}
Compiling gives these errors:
test/test.ts(5,5): error TS2300: Duplicate identifier 'chai'.
typings/chai/chai.d.ts(6,16): error TS2300: Duplicate identifier 'chai'.
It seems my only option is rename my chai
variable name in test.ts. That seems clunky AND won't type check the use of the renamed chai
variable.
Any advice?
Upvotes: 14
Views: 24288
Reputation: 5228
Since TypeScript 3.9 Beta was released it's possible to use require
with typing
Example:
const {someValue} = require('fs')
"TypeScript now automatically detects the types of imports you’re using to keep your file’s style clean and consistent."
ref. https://devblogs.microsoft.com/typescript/announcing-typescript-3-9-beta/
Upvotes: 0
Reputation: 2400
Use the import
keyword with require
instead of var
import chai = require('chai');
And compile with --module commonjs
if you're not already
Or, if for some reason you don't want the test code to be an external module, adding a type annotation will preserve type checking.
var c: typeof chai = require("chai");
Upvotes: 17