为第三方库创建 typescript .d.ts

Posted

技术标签:

【中文标题】为第三方库创建 typescript .d.ts【英文标题】:creating typescript .d.ts for third-party library 【发布时间】:2018-08-29 19:36:46 【问题描述】:

我正在使用来自 npm 的简单第三方库 chi-squared-test (https://www.npmjs.com/package/chi-squared-test)。它以(我相信是)commonjs 样式导出一个(匿名)函数:

module.exports = function(observations, expectations, degreesOfFreedomReduction)  ... 

该函数返回一个具有几个属性的对象,其中对我来说最有趣的是“概率”。我使用“npm i --save chi-squared-test”安装了它。我正在使用 Angular 4 的组件。我可以在我的 component.ts 文件中使用导出的函数和这个 import 语句:

import * as chiSquaredTest from 'chi-squared-test';

函数使用如下所示:

const expected: number[] = <omitted calculation>;
const actual: number[] = <omitted calculation>;
const chiSquaredResult: IChiSquaredResult = 
  chiSquaredTest(actual, expected, 1);

我一直在尝试为这个第三方库创建一个 .d.ts 文件,所以我将拥有智能感知(在 Visual Studio Code 中,如果这很重要的话)。我尝试了许多变体,但要么得到编译错误,要么没有得到智能感知,也没有迹象表明 typescript 对文件有任何关注。我最近的尝试是在 src 目录下的 @types/chi-squared-test 目录下创建一个文件 'index.d.ts'。

import  IChiSquaredResult  from './IChiSquaredResult';
export default function chiSquaredTest(
  actual: number[],
  expected: number[],
  degreesOfFreedomAdjustment: number): IChiSquaredResult;

文件 IChiSquaredResult 有一个返回类型的定义,它只是一个带有单个数字属性的接口,称为“概率”。这个 .d.ts 文件放在项目目录结构中时似乎被忽略了。

如果我将目录和文件移动到 node_modules/@types 目录,tsc 会注意它,但没有帮助。它报告,“错误 TS2349:无法调用类型缺少调用签名的表达式。类型'typeof“/home/jrv/Documents/projects/20171130 ObaCalculator/ObaCalc/node_modules/@types/chi-squar...'没有兼容的调用签名。”似乎 tsc 正在查找 .d.ts 文件,但没有将我的类型定义链接到库返回的匿名函数导出。tsc 和 intellisense 也没有描述他们认为的类型“chiSquaredTest “是,只是我的使用与签名不匹配。当我右键单击时,“转到类型定义”它会转到我的 .d.ts 文件中的导出。

我也尝试过导入为

import chiSquaredTest = require( 'chi-squared-test' );

结果相似。如何将类型定义绑定到匿名函数导出,就像我正在使用的库一样?代码本身工作正常,但我无法将@types 绑定到导入的函数。

【问题讨论】:

【参考方案1】:

我在那里有 97.44%。在我应该使用的 .d.ts 文件中:

import  IChiSquaredResult  from './IChiSquaredResult';
declare function chiSquaredTest(actual: number[], expected: number[], degreesOfFreedomAdjustment: number): IChiSquaredResult;
export = chiSquaredTest;

我将它与第二种导入样式结合使用。我怀疑我可以将 IChiSquaredResult 内部移动到 .d.ts 文件中,如下所示:Create d.ts file for existing library exporting function,我无法在本地保存 .d.ts 文件是一个小问题。

【讨论】:

这有点复杂:显然我正在以两种不同的方式构建(“ng serve”与“ng build -prod”。一种方式对新式导入感到满意,另一种方式是不是。我切换回第一种导入样式,但随后出现错误,指出我的类型缺少 package.json 文件。我添加了一个具有最少属性(名称、版本)的文件,现在两个构建都很满意。我也搬家了.d.ts 文件的接口:declare namespace chiSquaredTest export interface IChiSquaredResult probability: number;

以上是关于为第三方库创建 typescript .d.ts的主要内容,如果未能解决你的问题,请参考以下文章

vue + ts Vuex篇

TypeScript进阶开发——ThreeJs基础实例,从入坑到入门

Typescript 在本地声明第三方模块

TypeScript 接口是不是应该在 *.d.ts 文件中定义

需要将 fabricjs.d.ts 与 TypeScript 一起使用的示例

如何从现有的 JavaScript 库生成 .d.ts “类型”定义文件?