为外部 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 是语言关键字,字符串是您要导入的模块的名称。