当前位置: 首页 > 知识库问答 >
问题:

如何抑制“错误TS2533:对象可能为“null”或“未定义”?

苏彦君
2023-03-14

我有一个类型:

type tSelectProtected = {
  handleSelector?: string,
  data?: tSelectDataItem[],

  wrapperEle?: HTMLElement,
  inputEle?: HTMLElement,
  listEle?: HTMLElement,
  resultEle?: HTMLElement,

  maxVisibleListItems?: number
}

我声明一个全局模块变量:

var $protected : tSelectProtected = {};

我在function1()范围中指定了适当的值:

$protected.listEle = document.createElement('DIV');

稍后在function2()范围中,我调用:

$protected.listEle.classList.add('visible');

我收到TypeScript错误:

error TS2533: Object is possibly 'null' or 'undefined'

我知道我可以使用if($protected.listle){$protected.listle}进行显式检查,以使编译器平静下来,但对于大多数非平凡的情况来说,这似乎是非常不容易的。

在不禁用TS编译器检查的情况下,如何处理这种情况?

共有3个答案

利俊迈
2023-03-14

如果需要,可以通过添加注释来抑制(请注意以下事项)

忽略:对象可能为“null”

不是对OP问题的直接回答,但在我的React应用程序中,使用Typescript-v3.6.2

并使用以下代码

const refToElement = useRef(null);

if (refToElement && refToElement.current) {
     refToElement.current.focus(); // Object is possibly 'null' (for refToElement.current)
}

我通过抑制该行的编译器继续前进-

const refToElement = useRef(null);

if (refToElement && refToElement.current) {
     // @ts-ignore: Object is possibly 'null'.
     refToElement.current.focus(); 
}

请注意,由于这是编译器错误而不是linter错误,//tslint: disable-next-line不起作用。此外,根据留档,这应该很少使用,只有在必要时才使用

使用Typecript 3.7以后,您可以使用可选的链接来解决上述问题,因为-

refToElement?.current?.focus();

此外,有时可能只是在使用useRef时将适当的类型传递给泛型参数器的问题。
例如:在输入元素的情况下-

const refToElement = useRef<HTMLInputElement>(null);

龙永逸
2023-03-14

此功能称为“严格空检查”,用于将其关闭,以确保未设置编译器标志。

然而,null的存在被描述为数十亿美元的错误,因此看到TypeScript等语言引入修复是令人兴奋的。我强烈建议保持开机状态。

解决此问题的一种方法是确保值永远不会为null或未定义,例如通过预先初始化它们:

interface SelectProtected {
    readonly wrapperElement: HTMLDivElement;
    readonly inputElement: HTMLInputElement;
}

const selectProtected: SelectProtected = {
    wrapperElement: document.createElement("div"),
    inputElement: document.createElement("input")
};

不过,请参见Ryan Cavanaugh的答案,以获得另一种选择!

乌鸿宝
2023-03-14

如果从外部手段知道表达式不是空的或未定义的,则可以使用非空断言运算符 强制删除这些类型:

// Error, some.expr may be null or undefined
let x = some.expr.thing;
// OK
let y = some.expr!.thing;
 类似资料:
  • 我的职能是: 我在这条线上出错了。 我们需要解决它。请帮忙做。

  • 我正在尝试重建一个使用Firebase云函数和Firestore的web应用程序示例。部署函数时,出现以下错误: 这是功能: 我只是尝试部署函数来测试它。并且已经在网上搜索过类似的问题,但是找不到任何其他与我的问题相匹配的帖子。

  • 获取错误。我尝试做多个选择,并更改第二个选择的数据与第一个选择的上更改材料表行。我正在使用Firebase。 当“store.Urunler”为null或未定义时,我会出现此错误。而且我的产品没有列在菜单项上,这意味着选择是空的,但state.products有数据 我怎样才能克服这个错误。我还想添加到Urunler,选择一个输入。我知道我应该为onChanges调用函数,但如果它起作用,我以后会

  • 我编写了两个函数,可以有效地复制JSON.stringify(),将一系列值转换为stringify版本。当我将代码移植到JSBin并在一些示例值上运行它时,它运行得很好。但是我在一个专门为测试这个而设计的规范运行程序中遇到了这个错误。 我的代码: 我从测试人员那里得到的错误消息是: 它似乎失败了:例如stringifyJSON(null)

  • 问题内容: 我的问题 我正在尝试在网页上放置地图,并使用Ajax获取数据。它适用于所有浏览器,但不适用于IE9。 我收到一个错误: SCRIPT5007:无法获取属性“ ajax”的值:对象为null或未定义 并且地图不会加载。 代码 我尝试了什么 这似乎是一个非常普遍的问题,这是该主题上最受好评的问题。所以我试着把 但它并没有解决任何问题。 我的问题 我应该怎么做才能解决这个问题? 问题答案:

  • 我正在运行一个React应用程序。 当我通过路由(单击按钮或链接)进入页面时,页面工作正常,但当我重新加载页面时,页面崩溃。我看不到错误在哪里,控制台和源代码显示为空,这是服务器消息控制台消息。 这是运行的代码。我尝试删除currentuser、addhabity和许多其他东西,只是为了了解错误的来源。没有结果。如果我通过链接进入页面,一切正常。 HabiddView.web.jsx 生活orm.