gpt4 book ai didi

typescript - 如何为导出函数的节点模块编写 typescript 定义文件?

转载 作者:搜寻专家 更新时间:2023-10-30 20:34:36 25 4
gpt4 key购买 nike

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

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

declare module "toml" {
export = TOML;
}

然后:

/// <reference path="../../../../../defs/toml/toml.d.ts"/>
import toml = require('toml');
toml.parse(...);

但是,仅导出单个函数的节点模块会怎样,例如“glob”(https://github.com/isaacs/node-glob)。

这个模块的节点用法是:

var glob = require("glob")
glob("*.js", {}, callback(err, files) { ... });

你会天真地认为你可以这样做:

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

...但是因为 typescript 的“导入”语义有点奇怪,看来您只能使用“导入 .. = require()”语句来别名 模块。尝试调用:

/// <reference path="../../../../../defs/glob/glob.d.ts"/>
import blog = require('glob');

结果:

error TS2072: Module cannot be aliased to a non-module type.

那么,您将如何为此编写定义文件?

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

...也是的,我知道您可以通过使用 declare 破坏类型系统来做到这一点,但我正在努力避免这种情况:

declare var require;
var glob = require('glob');
glob(...);

最佳答案

使用export =

定义:

declare module 'glob' {
function globs(paths: string, options: any, callback: (err: any, files: string[]) => void): any;
export = globs;
}

用法(使用 esModuleInterop enabled ):

import glob from 'glob';
glob("*.js", {}, (err, files) => { });

关于typescript - 如何为导出函数的节点模块编写 typescript 定义文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24029462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com