How to write a definition file for commonjs module

2019-02-13 20:45发布

I want to use simple commonjs module in typescript, and here are 3 files

original lib:

//commonjs-export-function.js
module.exports = function() {
    return 'func';
};

definition file:

//commonjs-export-function.d.ts
declare function func(): string;
export = func;

typescript program which use it:

//main.ts
import { func } from './commonjs-function';

console.log(func());

When I run tsc I get this error:

tsc main.ts && node main.js
main.ts(1,22): error TS2497: Module '"/Users/aleksandar/projects/typescript-playground/commonjs-function"' resolves to a non-module entity and cannot be imported using this construct.

here is also already answered question but it doesn't work with typescript 2.0

How to write a typescript definition file for a node module that exports a function?

2条回答
对你真心纯属浪费
2楼-- · 2019-02-13 21:09

I've recently had trouble finding examples of CommonJS module definitions compatible with TypeScript 2.8.x. Here's an attempt to demonstrate the approach using map-promise-limit, a package with a single CommonJS export:

declare module 'promise-map-limit' {

  type IIteratee<T, R> = (value: T) => Promise<R> | R;

  function mapLimit<T, R>(
    iterable: Iterable<T>,
    concurrency: number,
    iteratee: IIteratee<T, R>
  ): Promise<R[]>;

  export = mapLimit;

}

In summary, to create a type definition for a CommonJS module with a single function-type export:

  • Use the same declare module syntax as you'd use for any other ambient module
  • Declare a named function (without using the declare keyword) within the module body
  • Export the function with export = instead of export default

[Edit] Realized this is similar to basarat's answer here. Good deal!

查看更多
我欲成王,谁敢阻挡
3楼-- · 2019-02-13 21:28

I found the solution in typescript docs here: http://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-function-d-ts.html

*~ Note that ES6 modules cannot directly export callable functions.
*~ This file should be imported using the CommonJS-style:
*~   import x = require('someLibrary');
...
export = MyFunction;
declare function MyFunction(): string;

so mu definition file should be:

//commonjs-export-function.d.ts
declare function func(): string;
export = func;

and import with require:

//main.ts
import func = require('./commonjs-export-function');
查看更多
登录 后发表回答