为外部js-nodejs包编写一个typescript声明文件,没有类型信息



我正在编写一个节点js类型脚本库(用于cli应用程序上下文(,它依赖于一个没有类型脚本类型声明的js库jinxed。我一直在跟踪Typescript声明文件的信息

jinxed是一个简单的库,目前通过module.exports{…}导出单个函数,它不打算成为该库的唯一导出(因为它将来会扩展(。因此导出的函数是导出对象的一个成员。

问题是如何在typescript库中使用它。在阅读了所有的typescript声明文档之后,我仍然不清楚如何做到这一点。

要解决的第一个问题是从Typescript声明文件模板中选择哪个声明模板。

我决定使用module.dts来启用从typescript中消费jinxed的合适模板(不过我还需要更正(。

所以我的客户端字体库(小部件(看起来是这样的:

widget/
lib/
externalTypes/
jinxed/
index.d.ts
index.ts

因此,上面显示了我根据模板文件中的说明为外部依赖项jinxed定义一个类型文件;即创建一个名称与外部依赖项名称匹配的文件夹,并在其中放置一个index.d.ts文件。

widget/lib/externalTypes/jinxed/index.d.ts:

导出函数funtify(obj:any(:字符串;

在消费端;即在我的index.ts文件(widget/lib/index.ts(中:

/// <reference types="./externalTypes/jinxed" />
import jinxed = require('jinxed');
const TestObject:any = {
name: 'dvorak',
occ: 'watchman'
};
jinxed.functify(TestObject);

[PS:我也试过:

let jinxed=required('./externalTypes/jinxed'(;(…但这只会导致使用require语句时出错(

]

但编译后会出现以下错误消息:

/Users/User/dev/github/js/widget/lib/index.ts中的错误./lib/index.ts[tsl]错误

/Users/User/dev/github/js/widget/lib/index.ts(4,25(TS7016:找不到模块"jinxed"的声明文件。'/Users/User/dev/github/js/widget/nod_module/jinxed/index.js'隐式具有"any"类型。

(对错误消息看起来有点难看、格式问题表示歉意(

[

为了完整起见,jinxed的内容如下:

'use strict';
function functify (obj) {
return JSON.stringify(obj, (key, val) => {
return (typeof val === 'function') ? '_function_' : val;
});
}
module.exports = {
functify: functify
}

]

错误消息表明它找不到jinxed的声明文件,但我已经使用了

/// <reference...

指定要使用的类型文件,所以我不知道问题出在哪里。

widget-package.json中的依赖项如下:

"dependencies": {
"@types/ramda": "^0.26.19",
"jinxed": "0.0.1",
"ramda": "^0.26.1",
"xpath": "0.0.27"   },

tsconfig文件为:

{
"compilerOptions": {
"allowJs": true,
"alwaysStrict": true,
"module": "commonjs",
"moduleResolution": "Node",
"noImplicitAny": true,
"sourceMap": true,
"strictNullChecks": true,
"target": "es5",
"types": [],
"lib": [
"es5",
"es2015",
"es6",
"dom"
]
},
"include": [
"lib/**/*"
],
"exclude": [
"node_modules",
"**/*.spec.ts"
]
}

package.json中的"主要"条目是:

"main":"./lib/index.ts",

此外,我想知道我构建外部类型依赖关系的方式是否合理。IE,比方说,我正试图以类似于上面为jinxed所示的方式使用另一个外部js库;我假设,我会在externalTypes下创建另一个与该依赖项名称匹配的文件夹,并用它自己的index.d.ts填充它。这是正确的还是我弄错了树?

编辑:(我通过这个问题找到了这个问题的解决方案,但我并不是真正的用户

在index.d.ts中,我将其更新如下:

declare module 'jinxed' {
export function functify(obj: any): string;
}

这确实有效。

但是,我不理解declare module语句,特别是为什么名称jinxed位于引号内(删除引号后会出现错误:TS7016:找不到模块"jinxed"的声明文件(。到目前为止,我还没有找到正确的打字模板,所以我无法很好地解释为什么这是有效的。

看起来你找到了最初问题的答案,但我想分享一些关于第二个问题的资源。来自typescript文档:环境模块

在Node.js中,大多数任务都是通过加载一个或多个模块来完成的。我们可以用顶级导出声明在每个模块自己的.d.ts文件中定义每个模块,但将它们写为一个更大的.d.ts文件更方便。为此,我们使用了一个类似于环境名称空间的构造,但我们使用了module关键字和引用的模块名称,这将在以后的导入中可用。

declare module是语言关键字,字符串是要导入的模块的名称。

最新更新