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

时间:2018-03-20 20:26:33

标签: typescript

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

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

该函数返回一个具有几个属性的对象,其中最有趣的是名为" probability"。我使用" npm i --save chi-squared-test安装它。"我在角度4的组件中工作。我能够在component.ts文件中使用导出的函数和导入语句:

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文件,所以我将使用intellisense(在Visual Studio Code中,如果这很重要)。我已经尝试了许多变体,但要么得到编译错误,要么没有智能感知,也没有迹象表明打字稿正在关注文件。我最近的一次尝试是创建一个文件&quot; index.d.ts&#39;在src目录下的@ types / chi-squared-test目录下。

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

文件IChiSquaredResult有一个返回类型的定义,它只是一个带有一个名为&#34; probability&#34;的数字属性的接口。将此.d.ts文件放在项目目录结构中时,似乎会被忽略。

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

我也尝试过导入

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

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

1 个答案:

答案 0 :(得分: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文件是一个小问题。