这个错误说明了啥?类型“ParsedQs”不可分配给类型“字符串”

Posted

技术标签:

【中文标题】这个错误说明了啥?类型“ParsedQs”不可分配给类型“字符串”【英文标题】:What does this error say? Type 'ParsedQs' is not assignable to type 'string'这个错误说明了什么?类型“ParsedQs”不可分配给类型“字符串” 【发布时间】:2020-12-14 04:55:30 【问题描述】:

你好我的问题是我想使用猫鼬的搜索查询。但我想使用查询发出获取请求。为什么这是不可能的?我不明白这个错误。我正在使用 5.10.0 版的猫鼬。 我不想将其作为发布请求进行,也不想使用 req.body。谁能帮帮我?

这是我的代码:

export const searching = (req: Request, res: Response) => 
  Company.find( $text:  $search: req.query  ).exec((err, docs) => 
    if (docs) 
      res.status(200).json(docs)
     else 
      console.log(err)
    
  )

我的错误信息:

(property) $search: string
No overload matches this call.
The last overload gave the following error.
Type 'ParsedQs' is not assignable to type 'string'.ts(2769)

【问题讨论】:

【参考方案1】:

req.query是一个包含请求查询的对象

所以如果你像/?foo=bar&a=123这样向端点发送请求

您可以从

访问查询值
req.query.foo // bar
req.query.a // 123

您正在将查询对象传递给$search,同时您应该传递一个字符串,所以应该是

Company.find( $text:  $search: req.query.yourQueryKey as string  ).exec((err, docs) => 

【讨论】:

是的,但问题是即使我输入 req.query.foo 或类似的东西,我也会得到同样的错误。这个:No overload matches this call. The last overload gave the following error. Type 'string | ParsedQs | string[] | ParsedQs[] | undefined' is not assignable to type 'string'. 检查我的编辑。您需要使用 as 将类型转换为字符串【参考方案2】:

req.query一个对象,其中包含您在查询中指定的所有查询参数。

如果你的请求是这样的

test.com/search/?s=something

something 将存储在 req.query.s 中。

第二个选项是使用named route parameters。 所以你可以设置这样做:

请求网址

test.com/search/something

路线

app.get('/search/:search', (req, res) => 
   console.log(req.params.search); // "something". NB use req.params, not req.query
)

【讨论】:

【参考方案3】:

像下面这样添加 as any 可能会对您有所帮助 -

Company.find( $text:  $search: req.query as any ).exec((err, docs) => 
-------------
-------------
-------------

【讨论】:

【参考方案4】:

您正在将 req.query 传递给您的搜索,并且 req.query 的默认 Typescript 类型是

Request<unknown, unknown, unknown, QueryString.ParsedQs, Record<string, any>>.query: QueryString.ParsedQs 

如果你传入 req.query.searchText 的类型将是

string | QueryString.ParsedQs | string[] | QueryString.ParsedQs[] | undefined

这里已经回答了简单的方法,只是做

export const searching = (req: Request, res: Response) =>  
const searchText = req.query. searchText as string
  Company.find( $text:  $search: searchText  ).exec((err, docs) => 
    if (docs) 
      res.status(200).json(docs)
     else 
      console.log(err)
    
  )

这可行,但当您的查询参数中有很多变量时会变得草率。快速试用您的端点的 RequestHandler。

import  RequestHandler  from 'express'

interface QueryTypes 
  searchText: string
  moreSearchText: string

export const searching:RequestHandler<unknown, unknown, unknown, QueryTypes > = (req, res) => 
  Company.find( $text:  $search: req.query  ).exec((err, docs) => 
    if (docs) 
      res.status(200).json(docs)
     else 
      console.log(err)
    
  )

您可以看到使用 RequestHandler 我可以传入一些未知类型,而第四个我可以传入查询类型。我还可以将 Request 和 Response 类型删除为 (req, res),因为 RequestHandler 已经为我们键入了处理程序。

您可能想知道前 3 个未知数是什么,以及 RequestHandler 的 typescript 文档中的未知数。这是文档。

interface RequestHandler<P = core.ParamsDictionary, ResBody = any, ReqBody = any, ReqQuery = qs.ParsedQs, Locals extends Record<string, any> = Record<string, any>>

现在使用 RequestHandler。我可以输入参数、正文、reqbody 或查询。使用组合或使用未知的方式跳过它们,就像我在示例中所做的那样。

这还有一个额外的好处,那就是为您提供类型安全性

const test = req.query.test

会为我突出显示 vscode 中的打字错误,因为“测试”是在我的 QueryTypes 接口中定义的。

【讨论】:

以上是关于这个错误说明了啥?类型“ParsedQs”不可分配给类型“字符串”的主要内容,如果未能解决你的问题,请参考以下文章

颤振“参数类型不可分配”两种相同类型的错误

类型“”不可分配给类型“JwtConfig”

反应类型错误“不可分配给'从不'类型的参数”

类型“JSX.Element”不可分配给类型“元素”

打字稿:类型'null'不可分配给类型错误

类型“URLSearchParams”不可分配给类型“URLSearchParams”