【问题标题】:Augmenting external TypeScript modules增强外部 TypeScript 模块
【发布时间】:2020-02-05 03:57:13
【问题描述】:

我目前正在研究如何在 TypeScript 中增强外部模块,阅读官方文档和肯定类型指南,检查示例等等。我现在的目标是向express.Request 接口添加自定义属性(例如,实现给定User 接口的user

像下面这样:

// types/express/index.d.ts

declare namespace Express {
  export interface Request {
    user: types.User;
  }
}

用户界面在单独的声明文件中声明:

// types/core.d.ts

declare namespace types {
  interface User {
    name: string;
  }
}

消费代码是一个控制器,有两种方法:

// controller.ts

import { Request, Response, NextFunction } from "express";

const user = { name: "Hiago" };
class UserController {
  getUser(req: Request, res: Response, next: NextFunction) {
    req.user = user;
    return next();
  }

  returnUser(req: Request, res: Response) {
    const { user } = req;

    return res.status(200).json(user);
  }
}

这工作得很好。问题是因为我只有命名空间声明,我不能在我的代码中导入这些接口。将来我想自动生成像上面显示的User 这样的界面,并能够在我的应用程序的其他部分使用它们。

所以我发现像下面这样声明 module 可以帮助我实现这一目标:

// types/core.d.ts

declare module "core" {
  export namespace types {
    export interface User {
      name: string;
    }
  }
}

现在我可以在任何需要的地方使用import { types } from "core" 导入User 接口。但奇怪的是,尽管从未抱怨过 types/express/index.d.ts 文件上的任何内容,但在我的 controller.ts 上,编译器却给了我一个 error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary>

我已经把所有的代码都放在了这个repo,这样任何愿意帮助的人都可以重现这个错误。

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    将你的 // types/express/index.d.ts 更改为:

    import { types } from "core";
    
    declare module 'express' {
      interface Request {
        user: types.User;
      }
    }
    

    在您的 controller.ts 中,您使用的是模块 express 中的类型,而不是命名空间。 (在某些情况下,他们只是将其重新导出,但似乎 express 并非如此)。通过此更改,它应该可以工作。

    【讨论】:

    • 更改此设置会使之前的错误消失。但它提出了其他几个。这是带有错误消息的gist 和正在引发它的routes.ts 文件。
    • 关于controller.ts 上缺少的类型,这是因为我无法使用之前的设置导入接口,所以没有完成。
    • routes.ts 文件中的错误究竟是什么?
    • 我忘记将链接添加到要点。但我已经编辑了评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2012-11-30
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多