'string | 类型的参数 未定义的'不可分配给'字符串'类型的参数 - TypeScript错误

gro*_*oot 2 javascript api types typescript

TS 错误“对象未定义”

尝试从我的标头访问“userid”。
它不断抛出错误“‘字符串|未定义’类型的参数不可分配给‘字符串’类型的参数。‘未定义’类型不可分配给‘字符串’类型。”

在此输入图像描述

不明确的

当我已经将 userid 定义为字符串或未定义时,为什么会弹出此错误?
有人有什么想法吗????

更新:
在访问 apiGateway 事件之前添加检查

if (apiGateway.event !== undefined) {
   const { userid } = req.apiGateway.event.headers;
} else {
   throw new badRequestException() 
}

return......
Run Code Online (Sandbox Code Playgroud)

Vil*_*lx- 6

根据您的定义判断MyRequest

  • apiGateway 可以是未定义的
  • event不能是未定义的
  • headers不能是未定义的
  • userid 可以是未定义的

因此,写入req.apiGateway.event.headers将立即失败,因为 ifapiGateway未定义,则.event对其进行访问将崩溃。所以 Typescript 不允许这样做。

有三种方法可以解决这个问题:

  1. 明确地检查它。就像是if (req.apiGateway === undefined) { throw new badRequestException(); }
  2. 如果您确定不可能undefined,您可以强制 TypeScript 接受它。写req.apiGateway!.event。请注意,如果apiGateway确实在运行时未定义,您将收到异常。因此,仅当您绝对 100% 确定它在任何情况下都不会是未定义时才使用它。
  3. 接受它可以是未定义的,并强制其他所有内容也为未定义。Write req.apiGateway?.event- 在这种情况下.event也将被视为不可定义。如果req.apiGateway在运行时恰好是未定义的,那么req.apiGateway?.event也将是未定义的。等等等等。这意味着您还必须添加?.到该行的其余部分:req.apiGateway?.event?.headers。整个表达式的结果也是不可定义的,因此稍后您可能需要使用更多未定义检查。

现在,解决你的第二个问题。当前您的userid局部变量的类型为string|undefined。我们因为req.apiGateway.event.headers.useridstring|undefined。这意味着在运行时它可以是字符串,也可以是未定义的。然而该方法updateNotification()需要一个简单的string参数。它无法处理未定义的值。如果您将其传递为未定义,谁知道会发生什么(可能是例外)。因此 Typescript 不允许这样做。同样,您可以使用上述方法来处理它。