带有属性的函数顶层导出的无类型模块

Untyped module for function top-level export with properties

我正在尝试为 changeset 编写类型文件。我将它保留在我自己的项目内部(稍后可能会相关)。变更集有两个用例:

import * as changeset from "changeset";

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

the actual function in changeset is called apply, not applyChanges. I've changed it here to avoid confusion with Javascript's built in apply method.

为此,我设置了上述文件 (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(...) 不...

我认为你的类型没问题,但如果 changeset 模块有一个默认的导出(主函数,其上的属性也是函数),你可能想像这样导入它:

import changeset from "changeset";