打字稿错误:此表达式不可调用。类型'typeof import(“ koa-session”)'没有呼叫签名

时间:2020-05-22 22:39:28

标签: node.js typescript

部分解决:

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

2 个答案:

答案 0 :(得分:5)

TypeScript github上已经解决了类似的问题。不幸的是,我现在知道其他任何可以描述它的文档页面。

注释export {},将types.d.ts文件从模块转换为脚本。来自TypeScript handbook

在TypeScript中,就像在ECMAScript 2015中一样,任何包含顶级导入或导出的文件都被视为模块。相反,没有任何顶级导入或导出声明的文件将被视为脚本,其内容可在全局范围内使用(因此也可用于模块)。

由于没有导出语句(也没有导入语句)的文件不是模块而是脚本,因此它没有任何模块信息,并且确实会忽略“ koa-session”已有定义这一事实。 / p>

您可以在沙盒中尝试此操作-在import中添加任何顶级exporttypes.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;
    };
  }
}

只需执行此操作,即可根据需要增强界面。