gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:23:32 25 4
gpt4 key购买 nike

我正在编写一个节点 js typescript 库(用于 cli 应用程序上下文),它依赖于一个 js 库 jinxed,它没有 typescript 类型声明。我一直在关注 Typescript declaration files 的信息

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

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

第一个要解决的问题是从Typescript declaration file templates 中选择哪个声明模板。 .

我决定用于启用从 typescript 消费 jinxed 的适当模板是 module.d.ts (虽然我会得到纠正)。

所以我的客户端 typescript 库(小部件)看起来像这样:

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

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

小部件/lib/externalTypes/jinxed/index.d.ts:

export function functify(obj: any): string;



在消费方面;即在我的 index.ts 文件中(小部件/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...

指定要使用的类型文件,所以我不知道问题是什么。

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 填充它。这是正确的还是我在吠叫错误的树?

编辑:(我通过 this issue 找到了解决此问题的方法,但我并不真正理解这一点。

在 index.d.ts 中,我已将其更新为:
declare module 'jinxed' {
export function functify(obj: any): string;
}

...这确实有效。

但是,我不明白 declare module 语句,特别是为什么 jinxed 的名称在引号内(删除引号会出现错误:TS7016:找不到模块'jinxed'的声明文件)。到目前为止,我还没有找到与之对应的正确 typescript 模板,因此我无法很好地解释为什么会这样。

最佳答案

看起来您找到了原始问题的答案,但我想我会分享一些关于您的第二个问题的资源。来自 typescript 文档: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是语言关键字,字符串是您要导入的模块的名称。

关于typescript - 为外部 js nodejs 包编写 typescript 声明文件,没有类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58525877/

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