具有属性的函数顶层导出的未类型化模块

时间:2019-09-05 19:57:30

标签: typescript declaration

我正在尝试为changeset编写打字文件。我将其保留在我自己的项目内部(稍后可能与此有关)。变更集有两个用例:

import * as changeset from "changeset";

changeset({}, {}); // call as function
changeset.applyChanges({}, {}); // call a property on changeset
  

changeset中的实际功能称为apply,而不是applyChanges。为了避免与Javascript内置的apply方法混淆,我在这里进行了更改。

为此,我已经设置了上面的文件(index.ts)和changeset.d.ts

declare function changeset(objA: any, objB: any): any;
declare module "changeset" {
    export function applyChanges(changes: any, obj: any): any;
}

changeset.applyChanges(...)正常工作,changeset(...)不能正常工作

This expression is not callable.
  Type 'typeof import("changeset")' has no call signatures.

我的.d.ts与TypeScript的suggestion非常相似,只在底部缺少export = changeset;。我不完全理解为什么,但是添加导出会导致index.ts中的导入错误:

Could not find a declaration file for module 'changeset'.

据我所知,区别在于其他.d.ts文件是从node_modules导入的,而这是我项目的隐含部分。

是否可以在单个项目中包含这样的复杂模块声明?


编辑

尝试了另一种方式:

declare module "changeset" {
    const changeset: {
        (objA: any, objB: any): any;
        applyChanges: (changes: any, obj: any) => any;
    };
    export = changeset;
}

与以前相同的错误:changeset.applyChanges(...)正常工作,changeset(...)无法...

1 个答案:

答案 0 :(得分:1)

我认为您的类型不错,但是如果changeset模块具有默认导出(主函数,其上的属性也是函数),您可能希望这样导入它:

import changeset from "changeset";