繁体   English   中英

TypeScript 给我一个属性在类型响应上不存在的错误

[英]TypeScript gives me an error of Property Does Not Exist on Type Response

所以,我有一个自定义的高级结果页面 - 它允许/articles?name=""等等。

第一次使用TypeScript,所以我正在迁移我的代码。

但是,我到了最后一部分,它给了我一个 typescript 错误。

// eslint-disable-next-line no-unused-vars
import {Request, Response, NextFunction} from 'express';

// eslint-disable-next-line max-len
const advancedResults: any = (model: any, populate: string) => async (req: Request, res: Response, next: NextFunction) => {
  let query: any;

  // Copy req.query
  const reqQuery = {...req.query};

  // Fields to exclude
  const removeFields = ['select', 'sort', 'page', 'limit'];

  // Loop over removeFields and delete them from reqQuery
  removeFields.forEach((param) => delete reqQuery[param]);

  // Create query string
  let queryStr = JSON.stringify(reqQuery);

  // Create operators ($gt, $gte, etc)
  // eslint-disable-next-line max-len
  queryStr = queryStr.replace(/\b(gt|gte|lt|lte|in)\b/g, (match) => `$${match}`);

  // Finding resource
  query = model.find(JSON.parse(queryStr));

  // Select Fields
  if (req.query.select) {
    const fields = (<string>req.query.select).split(',').join(' ');
    query = query.select(fields);
  }

  // Sort
  if (req.query.sort) {
    const sortBy = (<string>req.query.sort).split(',').join(' ');
    query = query.sort(sortBy);
  } else {
    query = query.sort('-createdDate');
  }

  // Pagination
  const page = parseInt(<string>req.query.page, 10) || 1;
  const limit = parseInt(<string>req.query.limit, 10) || 25;
  const startIndex = (page - 1) * limit;
  const endIndex = page * limit;
  const total = await model.countDocuments();

  query = query.skip(startIndex).limit(limit);

  if (populate) {
    query = query.populate(populate);
  }

  // Executing query
  const results = await query;

  // Pagination result
  const pagination: any = {};

  if (endIndex < total) {
    pagination.next = {
      page: <any>page + 1,
      limit,
    };
  }

  if (startIndex > 0) {
    pagination.prev = {
      page: <any>page - 1,
      limit,
    };
  }

  res.advancedResults = { // Error here, Property 'advancedResults' does not exist on type 'Response<any>'
    success: true,
    count: results.length,
    pagination,
    data: results,
  };

  next();
};

export default advancedResults;

我已经添加了任何类型......等等。 我在以前的代码中做错了什么吗? 我需要重做整个 function 吗? 让我知道这是否正确。 我搜索了具有相同行的其他问题,在我看来,它没有回答我的问题。 我认为这是一个特例。 谢谢!

正如亚历克斯·韦恩(Alex Wayne)在上面的评论中所发布的,以及任何遇到此线程的人。 答案在于他提供的链接: 这里

第 1 步: Go 进入您的root folder/node_modules/@types/express/index.d.ts文件。

第 2 步:export = e;之后添加以下代码

declare global{
    namespace Express {
        interface Response {
            yourCustomResponse: yourType
        }
    }
}

第 3 步:完成后,保存该文件并导航到您的tsconfig.json

第 4 步:将此"./node_modules/@types ./node_modules/@types”添加到"typeRoots"以确保 TypeScript 正在读取全局响应。

希望这能回答您的问题,再次感谢所有向我发表评论并帮助我度过难关的人。 @jcalz @亚历克斯·韦恩

可以在此处的 Typescript 文档中的声明合并下找到更多信息

为什么我不能在 global.d.ts 中写入?

declare module 'express' {
   export interface Response<T = any> {
      customCb: (data: T) => void;
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM