部分解决:
在github上有一个老问题,这里对这个问题做了一些描述。在全局范围中声明模块时,它会重写整个导出模块的类型。当您在模块中声明一个模块时,它会合并。为什么?我不知道
https://github.com/microsoft/TypeScript/issues/17736#issuecomment-344353174
我想通过接口合并扩展第三方模块的类型。所有操作都很好,但是当我在types.d.ts中注释types.d.ts时,会遇到以下错误:
此表达式不可调用。类型‘Type no import("koa-session")’没有调用签名。
你能解释一下为什么会这样吗?
您可以在这里查看工作代码:https://codesandbox.io/s/typescript-node-nocfq?file=/src/types.d.ts
发布于 2020-05-26 21:06:28
在TypeScript github上也有一个类似的问题。不幸的是,我现在知道任何其他描述它的文档页。
注释掉后,export {}将types.d.ts文件从模块转换为脚本。来自TypeScript手册
在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件被视为一个脚本,其内容在全局范围内可用(因此也适用于模块)。
由于没有导出语句(和没有导入语句)的文件不是一个模块,而是一个脚本,因此它没有任何模块的信息,而且实际上将忽略“koa”的现有定义。
您可以在沙箱中尝试这一点--在import中添加任何顶级的types.d.ts或export (可以完全不使用)将修复This expression is not callable错误。
发布于 2020-05-25 09:21:17
如果要增强接口并进行接口合并,则需要导入该接口。你正在做的是重写它。
import Session from "koa-session";
declare module "koa-session" {
interface Session {
user: {
id: number;
username: string;
};
}
}只需这样做,您将增强接口,正如您想要的。
https://stackoverflow.com/questions/61964943
复制相似问题