2016-10-31 58 views
25

我有一个类型:如何禁止TypeScript“错误TS2533:对象可能是'null'或'undefined'”?

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

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

    maxVisibleListItems?: number 
} 

我宣布一个全球性的 - 模块明智 - 变量:

var $protected : tSelectProtected = {}; 

我指定的功能1范围适当的值:

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

我m函数,稍后在函数2范围内:

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

我得到打字稿错误:

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

我知道我可以使用if ($protected.listEle) {$protected.listEle}冷静下来编译器做明确的检查,但这似乎是最不平凡的情况非常不方便。

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

回答

8

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

但是,null的存在been describedThe Billion Dollar Mistake,因此看到TypeScript等语言引入修复程序令人兴奋。我强烈建议保持打开状态。解决这个问题

的一种方法是,以确保值是从来没有nullundefined,例如通过初始化它们前面:

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

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

我个人使用“vanilla”JavaScript中的'null'来初始化变量或属性值。这给了我直接的答案,如果给定var或prop存在,但它“没有可用值”或“在某个执行点清除了值”。这只是惯例。这可能不是TypeScript中的最佳方法,正如我在这里可以看到的答案。谢谢你的想法。 – grasnal

5

如果您知道类型永远不会是nullundefined,您应该声明它为foo: Bar而不是?。使用? Bar语法声明类型意味着它可能未定义,这是您需要检查的内容。

换句话说,编译器正在按照您的要求进行操作。如果你希望它是可选的,你将需要稍后检查。

+0

“编译器做你的要求正是它的” 所以我的想法是错了,谢谢。我需要改变一点。 – grasnal

104

如果从外部手段知道表达式的值不是nullundefined ,您可以使用非空断言运营商!强迫离开这些类型:

// Error, some.expr may be null or undefined 
let x = some.expr.thing; 
// OK 
let y = some.expr!.thing; 
+0

谢谢你让我知道'! - 非空断言运算符运算符。它似乎还没有很好的文档([https://github.com/Microsoft/TypeScript/issues/11494](https://github.com/Microsoft/TypeScript/issues/11494)),所以任何寻找答案的人阅读本文[http://stackoverflow.com/questions/38874928/operator-in-typescript-after-object-method](http://stackoverflow.com/questions/38874928/operator-in-typescript-after-object-方法) – grasnal

+0

谢谢你的回答。 – skiabox

+0

谢谢你 - 这应该是我接受的答案 – user1859022

2

该解决方案为我工作:

  • 转至tsconfig。JSON并添加“strictNullChecks”:假

enter image description here

+0

这也适用于我。 虽然它仍然给出错误,例如在订阅语句中,它不会识别结果变量,打字稿要它声明 .subscribe(result => this.result = result.json()); – Aarchie

+0

您是否尝试过使用“地图”运算符? Google'rxjs/map'。我基本上是这样做的。 Http.get(...)。map(result => result.json())。subscribe(result => {do your stuff here}) –

1

我用:

if(object !== undefined){ // continue - error supressed when used in this way. }

相关问题