为什么 TypeScript 需要在回调中进行另一个未定义的检查?

功率1

有时我会偶然发现:

if (obj.needle) { // obj = { needle?: string }
  console.log(obj.needle) // no error here

  matches((haystack) => {
    return haystack.needle === obj.needle // Error: Object is possibly 'undefined'.
  })
}

似乎 TypeScript 需要在回调函数中进行另一次检查。我想知道 a)为什么?和 b)如何优雅地解决这个问题 - 无需再次检查,因为它不是异步函数,也没有办法obj.needle突然出现'undefined'

纸箱

Typescript 不知道matches仅在obj定义时调用此回调据 TS 所知,matches可以挂在该函数上并在以后的某个随机时间调用它,obj什么时候都可以。或者matches也可以obj在调用回调之前改变自身obj据 TS 所知,在调用此回调之前,有很多方法可以更改。

有几种可能的解决方案。一行修复只是创建 TS 知道无法更改的对象的常量副本:

if (obj.needle) { // obj = { needle?: string }
  console.log(obj.needle) // no error here

  const constObj = obj
  matches((haystack) => {
    return haystack.needle === constObj.needle
  })
}

另一种选择是创建一个生成回调的函数(本质上是相同的,但代码多一点):

const createMatcher = obj => haystack => {
    return haystack.needle === obj
}

if (obj?.needle) { // obj = { needle?: string }
  console.log(obj.needle) // no error here

  matches(createMatcher(obj))
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我检查值是否在上一行中定义时,为什么Typescript抱怨一个可能的未定义值?

Typescript(类型'undefined'不能分配给类型)为什么我的数组有一个|号?未定义?

为什么此Typescript导出未定义?

为什么我的reducer返回未定义的React TypeScript

为什么要在Typescript中使用接口

为什么对另一个对象的相等检查在String.java中进行?

为什么从javascript到另一个javascript有未定义的错误?

为什么我的方法不调用另一个(未定义的变量)

为什么回调未定义?

为什么需要在Typescript中键入强制类型转换?

为什么TypeScript在IIFE中打包一个类?

为什么要在Javascript / Typescript上进行多种导入/导出

为什么TypeScript不能在检查未定义的if语句之后确定未定义变量,却从不返回

为什么此TypeScript代码无法进行类型检查?

为什么此Typescript模块先导入然后再导出另一个模块?

为什么TypeScript的方法需要一个变量作为返回类型?

为什么要在TypeScript中声明“ any”返回类型?

为什么要在Typescript / Angular中使用接口(模型)?

为什么需要在部分名称中添加另一个点

为什么ld在具有引用的函数中找到另一个函数中的未定义引用

为什么我的变量在更改另一个变量的显示后变得未定义?

当未使用react和typescript专门检查未定义的值时,为什么条件的评估结果为false?

为什么在Typescript中需要infer关键字?

为什么我需要Typescript中的泛型

为什么TypeScript在必需参数之后需要可选参数?

为什么我们在Typescript中需要任何类型?

为什么在JavaScript中使用TypeScript类需要`.default`?

为什么我的回调消息在另一个线程中执行?

为什么TypeScript类型不能检查React props?