我有一个类型:

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. listele) {$protected. listele进行显式检查。listEle}使编译器平静下来,但这似乎对于大多数非平凡的情况非常不方便。

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


当前回答

注意:这可能不是一个推荐的操作-也许解决方案是实际解决错误。所有的检查都是有原因的,所以禁用它们并不总是正确的做法,但是……

与上面的一些问题的答案相似,但最后有一点不同。我在多次不同的检查中遇到了问题,帮助我的是在tsconfig.json中设置一个严格的属性为false。似乎是上述特定检查的一种更通用的变体。

  "compilerOptions": {
    "strict": false
  },

其他回答

在typescript中,您可以执行以下操作来抑制错误:

let subString?: string;

subString > !—注意在null前增加了感叹号。

作为一个选项,您可以使用类型强制转换。如果你从typescript中得到这个错误,这意味着某些变量有类型或未定义:

let a: string[] | undefined;

let b: number = a.length; // [ts] Object is possibly 'undefined'
let c: number = (a as string[]).length; // ok

确保代码中确实存在a。

当我在tsconfig中将“strict:true”更改为“strict:false”时。Json文件比代码没有显示错误。 添加添加!使用添加的obj like进行签名 模板! .getAttriute(“src”);

代码没有显示错误。

很惊讶没有人回答这个问题,你所要做的就是在访问它之前检查对象是否存在,这很直接。否则,请确保在访问对象之前初始化了您的值。

if($protected.listEle.classList) {
   $protected.listEle.classList.add('visible');
}

注意:这可能不是一个推荐的操作-也许解决方案是实际解决错误。所有的检查都是有原因的,所以禁用它们并不总是正确的做法,但是……

与上面的一些问题的答案相似,但最后有一点不同。我在多次不同的检查中遇到了问题,帮助我的是在tsconfig.json中设置一个严格的属性为false。似乎是上述特定检查的一种更通用的变体。

  "compilerOptions": {
    "strict": false
  },