我正在编写一个节点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
是语言关键字,字符串是要导入的模块的名称。