如何为导出函数的节点模块编写打字稿定义文件?

Dou*_*oug 9 commonjs typescript

考虑一下,对于toml节点模块,我可以简单地使用:

// toml.d.ts
declare module TOML {
    export function parse(value:string):any;
}

declare module "toml" {
    export = TOML;
}
Run Code Online (Sandbox Code Playgroud)

然后:

/// <reference path="../../../../../defs/toml/toml.d.ts"/>
import toml = require('toml');
toml.parse(...);
Run Code Online (Sandbox Code Playgroud)

但是,那些只导出单个函数的节点模块呢,比如'glob'(https://github.com/isaacs/node-glob).

该模块的节点用法是:

var glob = require("glob")
glob("*.js", {}, callback(err, files) { ... });
Run Code Online (Sandbox Code Playgroud)

你天真地期望你能做到这一点:

// glob.d.ts
declare function globs(paths:string, options:any, callback:{(err:any, files:string[]):void;
Run Code Online (Sandbox Code Playgroud)

...但是因为typescripts'import'语义有点奇怪,所以你似乎只能使用'import .. = require()'语句来为别名模块.试着打电话:

/// <reference path="../../../../../defs/glob/glob.d.ts"/>
import blog = require('glob');
Run Code Online (Sandbox Code Playgroud)

结果是:

error TS2072: Module cannot be aliased to a non-module type.
Run Code Online (Sandbox Code Playgroud)

那么,你会如何为此编写定义文件?

NB.请注意,这是针对使用节点的commonjs模块,而不是 AMD模块.

...也是的,我知道你可以通过使用declare打破类型系统来做到这一点,但我试图避免这样做:

declare var require;
var glob = require('glob');
glob(...); 
Run Code Online (Sandbox Code Playgroud)

bas*_*rat 12

使用export =.

定义:

// glob.d.ts
declare module 'glob' {
    function globs(paths: string, options: any, callback: (err: any, files: string[]) => void);
    export = globs;
}
Run Code Online (Sandbox Code Playgroud)

用法:

/// <reference path="glob.d.ts"/>

import glob = require('glob');
glob("*.js", {}, (err, files) => { });
Run Code Online (Sandbox Code Playgroud)