【问题标题】:Object is possibly 'undefined'对象可能是“未定义”
【发布时间】:2017-11-16 18:05:27
【问题描述】:

所以我在 typescript 2.5.3 上的 vscode 和以下代码:

export function isHttpHeaders ( headers: HttpHeaders | undefined ):
headers is HttpHeaders {
    return !!headers && !!headers.get && !!headers.set
}

function headersToHeadersSpec ( options?: RequestOptionsArgs ):
 Headers | undefined {

  const { headers } = options as RequestOptionsArgs

  if ( isHttpHeaders( headers ) ) {
    const reqHeaders = new Headers()
    headers.forEach( reqHeaders.set.bind( reqHeaders ) )
    return reqHeaders
  } else {
    return undefined
  }
}

当我尝试编译时,由于某种原因,headers.forEach( reqHeaders.set.bind( reqHeaders ) ) 行抱怨标题值可能未定义。类型保护不应该保证值不是未定义的吗?

【问题讨论】:

  • 你确定HttpHeaders 定义中没有undefined,类似于type HttpHeaders = Array<...> | undefined
  • @julesRandolph HttpHeaders 是一个接口,具有许多可选属性。
  • 我无法使用稍微修改的版本进行复制,在该版本中我在本地定义了您使用的接口和类。
  • 我发现了你的问题:原因是forEach 属性在接口HttpHeaders 中是可选的(给定后挂的?)。作为旁注,您的保护函数会检查可选属性以断言传递的对象是HttpHeaders 类型,这很奇怪。

标签: javascript typescript casting


【解决方案1】:

错误来自您对HttpHeaders 的定义,它将forEach 设置为可选成员。

要修复错误,只需通过删除? 将其标记为非可选:

interface HttpHeaders {
  get?: string
  set?: string
  forEach (Function): void
}

【讨论】:

    【解决方案2】:

    考虑到您有option?,这意味着参数是可选的,这将允许未定义options。即使您在检查值的其他函数中有代码,打字稿也不够聪明,无法查看该代码并弄清楚它的作用。您的代码不是编译时安全的,但可能是运行时安全的。

    【讨论】:

    • 明白,但类型保护应该在 if 语句中返回一个布尔值,从而转换标题的值。哪个应该告诉 ts 在该块内部,此值保证为预期的非未定义值,对吗?
    • 是的,这就是运行时检查,作为一名优秀的编码人员,您应该始终这样做,因为您永远不知道其他人是否做了一些事情来破坏它。但是它不是编译时安全的,也就是说,编译器不知道代码做了什么,所以它认为它可能是未定义的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2021-11-29
    • 2021-01-24
    • 1970-01-01
    • 2021-10-14
    • 2022-01-05
    • 2019-07-30
    • 2019-11-06
    相关资源
    最近更新 更多