Typescript 具有属性的函数顶级导出的非类型化模块

Typescript 具有属性的函数顶级导出的非类型化模块,typescript,declaration,Typescript,Declaration,我想为你写一份打字文件。我将它保留在我自己的项目内部(这可能在以后相关)。变更集有两个用例: import * as changeset from "changeset"; changeset({}, {}); // call as function changeset.applyChanges({}, {}); // call a property on changeset changeset中的实际函数称为apply,而不是applyChanges。我在这里更改了它,以避免与Javasc

我想为你写一份打字文件。我将它保留在我自己的项目内部(这可能在以后相关)。变更集有两个用例:

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非常相似,只是缺少
export=changeset在底部。我不完全理解为什么,但是添加导出会导致
index.ts
中的导入出错:

Could not find a declaration file for module 'changeset'.
据我所知,不同之处在于其他
.d.ts
文件是从
node\u模块
导入的,而这个文件是我项目的一部分

有没有办法在单个项目中包含这样复杂的模块声明?


编辑

尝试了另一种方式:

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

与以前相同的错误:
changeset.applyChanges(…)
工作正常,
changeset(…)
不能…

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

import changeset from "changeset";

啊啊啊啊,我打开了
esModuleInterop
。你搞定了-谢谢!