为外部 js nodejs 包编写一个 typescript 声明文件,没有类型信息
Writing a typescript declaration file for an external js nodejs package, without type info
我正在编写一个节点 js typescript 库(用于 cli 应用程序上下文),它依赖于 js 库 jinxed,它没有 typescript 类型声明。我一直在关注 Typescript declaration files
上的信息
jinxed 是一个简单的库,目前通过 module.exports { ... } 导出单个函数,它不打算成为库的唯一导出,(因为以后会扩充)。所以导出的函数是导出对象的成员。
问题是我如何在打字稿库中使用它。阅读了所有 typescript 声明文档后,我仍然不清楚如何执行此操作。
要解决的第一个问题是从Typescript declaration file templates中选择哪个声明模板。
我决定使用适当的模板来启用从 typescript 中消耗的 jinxed 是 module.d.ts(不过我有待更正)。
所以我的客户端打字稿库(小部件)如下所示:
widget/
lib/
externalTypes/
jinxed/
index.d.ts
index.ts
所以上面显示了我根据模板文件中的说明为jinxed的外部依赖定义了一个类型文件;即创建一个名称与外部依赖项名称匹配的文件夹,并在其中放置一个 index.d.ts 文件。
widget/lib/externalTypes/jinxed/index.d.ts:
export function functify(obj: any): string;
在消费端;即在我的 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 = require('./externalTypes/jinxed');
( ... but this just results in an error about using the require statment)
]
但编译时出现以下错误信息:
ERROR in /Users/User/dev/github/js/widget/lib/index.ts
./lib/index.ts [tsl] ERROR in
/Users/User/dev/github/js/widget/lib/index.ts(4,25)
TS7016: Could not find a declaration file for module 'jinxed'.
'/Users/User/dev/github/js/widget/node_modules/jinxed/index.js'
implicitly has an 'any' type.
(对于错误信息看起来有点难看,格式问题表示歉意)
[
为了完整起见,jinxed的内容如下:
'use strict';
function functify (obj) {
return JSON.stringify(obj, (key, val) => {
return (typeof val === 'function') ? '_function_' : val;
});
}
module.exports = {
functify: functify
}
]
报错是找不到jinxed的声明文件,不过我用的是
/// <reference...
指定要使用的类型文件,不知道是什么问题
widgetpackaage.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" 条目是:
"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' 的声明文件)。到目前为止,我还没有找到对应的正确打字稿模板,所以我无法很好地解释它为什么有效。
您似乎找到了原始问题的答案,但我想我会分享一些关于您的第二个问题的资源。来自打字稿文档:Ambient Modules
In Node.js, most tasks are accomplished by loading one or more modules. We could define each module in its own .d.ts file with top-level export declarations, but it’s more convenient to write them as one larger .d.ts file. To do so, we use a construct similar to ambient namespaces, but we use the module keyword and the quoted name of the module which will be available to a later import.
declare module
是语言关键字,字符串是您要导入的模块的名称。
我正在编写一个节点 js typescript 库(用于 cli 应用程序上下文),它依赖于 js 库 jinxed,它没有 typescript 类型声明。我一直在关注 Typescript declaration files
上的信息jinxed 是一个简单的库,目前通过 module.exports { ... } 导出单个函数,它不打算成为库的唯一导出,(因为以后会扩充)。所以导出的函数是导出对象的成员。
问题是我如何在打字稿库中使用它。阅读了所有 typescript 声明文档后,我仍然不清楚如何执行此操作。
要解决的第一个问题是从Typescript declaration file templates中选择哪个声明模板。
我决定使用适当的模板来启用从 typescript 中消耗的 jinxed 是 module.d.ts(不过我有待更正)。
所以我的客户端打字稿库(小部件)如下所示:
widget/
lib/
externalTypes/
jinxed/
index.d.ts
index.ts
所以上面显示了我根据模板文件中的说明为jinxed的外部依赖定义了一个类型文件;即创建一个名称与外部依赖项名称匹配的文件夹,并在其中放置一个 index.d.ts 文件。
widget/lib/externalTypes/jinxed/index.d.ts:
export function functify(obj: any): string;
在消费端;即在我的 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 = require('./externalTypes/jinxed'); ( ... but this just results in an error about using the require statment)
]
但编译时出现以下错误信息:
ERROR in /Users/User/dev/github/js/widget/lib/index.ts ./lib/index.ts [tsl] ERROR in
/Users/User/dev/github/js/widget/lib/index.ts(4,25) TS7016: Could not find a declaration file for module 'jinxed'. '/Users/User/dev/github/js/widget/node_modules/jinxed/index.js' implicitly has an 'any' type.
(对于错误信息看起来有点难看,格式问题表示歉意)
[
为了完整起见,jinxed的内容如下:
'use strict';
function functify (obj) {
return JSON.stringify(obj, (key, val) => {
return (typeof val === 'function') ? '_function_' : val;
});
}
module.exports = {
functify: functify
}
]
报错是找不到jinxed的声明文件,不过我用的是
/// <reference...
指定要使用的类型文件,不知道是什么问题
widgetpackaage.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" 条目是:
"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' 的声明文件)。到目前为止,我还没有找到对应的正确打字稿模板,所以我无法很好地解释它为什么有效。
您似乎找到了原始问题的答案,但我想我会分享一些关于您的第二个问题的资源。来自打字稿文档:Ambient Modules
In Node.js, most tasks are accomplished by loading one or more modules. We could define each module in its own .d.ts file with top-level export declarations, but it’s more convenient to write them as one larger .d.ts file. To do so, we use a construct similar to ambient namespaces, but we use the module keyword and the quoted name of the module which will be available to a later import.
declare module
是语言关键字,字符串是您要导入的模块的名称。