部分解决:
github上有一个旧问题,对此问题进行了一些描述。在全局范围内声明模块时,它将重写整个导出模块的类型。在模块内部声明模块时,它会合并。为什么?我不知道
https://github.com/microsoft/TypeScript/issues/17736#issuecomment-344353174
我想通过接口合并来扩展第三方模块的类型。一切正常,但是当我发表评论时
在{strong> types.d.ts 中的export {};
遇到以下错误:
该表达式不可调用。输入'typeof import(“ koa-session”)' 没有通话签名
您能解释一下为什么会发生吗?
您可以在此处查看工作代码: https://codesandbox.io/s/typescript-node-nocfq?file=/src/types.d.ts
答案 0 :(得分:5)
TypeScript github上已经解决了类似的问题。不幸的是,我现在知道其他任何可以描述它的文档页面。
注释export {}
,将types.d.ts
文件从模块转换为脚本。来自TypeScript handbook:
在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件将被视为脚本,其内容可在全局范围内使用(因此也可用于模块)。
由于没有导出语句(也没有导入语句)的文件不是模块而是脚本,因此它没有任何模块信息,并且确实会忽略“ koa-session”已有定义这一事实。 / p>
您可以在沙盒中尝试此操作-在import
中添加任何顶级export
或types.d.ts
(可以完全不使用)将解决This expression is not callable
错误。
答案 1 :(得分:1)
如果要增强接口并进行接口合并,则需要导入接口。您正在做的是完全重写它。
import Session from "koa-session";
declare module "koa-session" {
interface Session {
user: {
id: number;
username: string;
};
}
}
只需执行此操作,即可根据需要增强界面。