【问题标题】:Typescript error: This expression is not callable. Type 'typeof import("koa-session")' has no call signatures打字稿错误:此表达式不可调用。类型 'typeof import("koa-session")' 没有调用签名
【发布时间】:2020-09-09 21:06:57
【问题描述】:

部分解决:

github上有一个老问题,这里稍微描述一下这个问题。当您在全局范围内声明一个模块时,它会重写整个导出模块的类型。当您在模块中声明模块时,它会合并。为什么?我不知道

https://github.com/microsoft/TypeScript/issues/17736#issuecomment-344353174

我想通过接口合并来扩展第三方模块的类型。一切正常,但是当我发表评论时 export {};types.d.ts 我遇到以下错误:

此表达式不可调用。输入'typeof import("koa-session")' 没有呼叫签名

你能解释一下为什么会这样吗?

您可以在此处查看工作代码: https://codesandbox.io/s/typescript-node-nocfq?file=/src/types.d.ts

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

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

    注释掉export {} 会将types.d.ts 文件从模块 变成脚本。来自TypeScript handbook

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

    由于没有 export 语句(也没有 import 语句)的文件不是一个模块,而是一个脚本,它没有关于任何模块的信息,并且确实会忽略存在“koa-session”定义的事实。

    您可以在您的沙盒中尝试此操作 - 在 types.d.ts 中添加任何顶级 importexport(它可以完全未使用)将修复 This expression is not callable 错误。

    【讨论】:

    • 感谢您的回答。但这并没有描述我的问题。我使用声明模块“koa-session”,从逻辑上讲,它应该在模块和全局范围内工作。但它的行为不同。我已经发现,在全局范围内使用模块“koa-session”会重写任何模块的导出类型。为什么?我不知道,它没有在任何地方描述
    • 因为没有 export 语句(也没有 import 语句)的文件不是一个模块,而是一个脚本,它没有关于任何模块的信息,并且确实会忽略“koa”的现有定义这一事实-会议”。除了这个 github 线程之外,我不知道任何文档(抱歉,那里发生了很多事情,请选择相关的部分)github.com/microsoft/TypeScript/issues/…
    • 感谢您的链接。这似乎是我所期望的。它甚至解释了为什么应该省略命名空间。您能否附加此链接并相应地格式化您的问题?我会接受它并奖励你的赏金
    【解决方案2】:

    如果要增强接口并进行接口合并,则需要导入接口。你正在做的是完全重写它。

    import Session from "koa-session";
    declare module "koa-session" {
      interface Session {
        user: {
          id: number;
          username: string;
        };
      }
    }
    

    只要这样做,您就会随心所欲地增强界面。

    【讨论】:

    • 根据文档,由于声明合并,我无法重写它。此外,当我只添加“export {}”时,它会正确合并。我假设当您导入任何内容时也会发生同样的情况,而不仅仅是会话
    • 能否提供一个文档链接,上面说 Typescript 允许重写而不是合并?
    • 我也不需要解决方案。我需要解释
    猜你喜欢
    • 2021-10-30
    • 2021-02-21
    • 2020-07-10
    • 2021-05-14
    • 1970-01-01
    • 2020-08-08
    • 2020-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多