如何在 Typescript 中检查未定义

Posted

技术标签:

【中文标题】如何在 Typescript 中检查未定义【英文标题】:How to check undefined in Typescript 【发布时间】:2017-09-28 16:49:09 【问题描述】:

我正在使用此代码检查未定义的变量,但它不起作用。

var  uemail = localStorage.getItem("useremail");

if (typeof uemail === "undefined")

    alert('undefined');

else

    alert('defined');

【问题讨论】:

哪一个是您接受的答案? 【参考方案1】:

你可以只检查这个是否真实:

if(uemail) 
    console.log("I have something");
 else 
    console.log("Nothing here...");

去这里看看答案:Is there a standard function to check for null, undefined, or blank variables in javascript?

希望这会有所帮助!

【讨论】:

如果 uemail 等于 0,那将等于 false,它会错误地评估。 正确但是在问题中操作正在使用 localStorage.getItem("useremail");这将返回 null。 可能会误导帖子的标题。我在那上面做第二个托德。 如果你真的期望,数字 0 是假的;那么一定要使用它。 托德是对的。简单的“if”不包括 value = 0 的情况。【参考方案2】:

它确实有效,但nullundefined 之间存在差异。您实际上是在分配给 uemail,如果它不存在,它将返回一个值或 null。根据documentation。

有关两者区别的更多信息,请参阅this answer。

对于此 Garfty 的答案的解决方案可能有效,具体取决于您的要求。您可能还想看看here。

【讨论】:

【参考方案3】:

在 Typescript 2 中,您可以使用未定义类型来检查未定义的值。 因此,如果您将变量声明为:

let uemail : string | undefined;

然后你可以检查变量z是否未定义为:

if(uemail === undefined)



【讨论】:

这没有帮助。原始发布者想检查localStorage 中是否存在特定值。 localStorage.getItem() 返回 null 如果之前没有设置该项目。这不能分配给string | undefined,因为null 是不同的类型。 它回答了标题中的问题,这对大多数人来说更有帮助。但是,是的,如果您的目标是检查 localStorage,那么检查 undefined 是错误的方法。【参考方案4】:

添加这个迟到的答案来检查在某些情况下可以提供帮助的 object.propertie:

使用杂耍检查,您可以一次测试 null 和 undefined:

if (object.property == null) 

如果您使用严格检查,它只会对设置为 null 的值为 true,并且不会对未定义的变量评估为 true:

if (object.property === null) 

Typescript 没有检查变量是否已定义的功能。

2020 年 10 月更新

您现在还可以使用 Typescript 中引入的nullish coallesing operator。

let neverNullOrUndefined = someValue ?? anotherValue;

这里,anotherValue 只会在 someValue 为 null 或未定义时返回。

【讨论】:

【参考方案5】:

这是因为它已经为空或未定义。 Null 或 undefined 没有任何类型。您可以先检查它是否未定义。在打字稿中(null == undefined) 是真的。

  if (uemail == undefined) 
      alert('undefined');
   else 
      alert('defined');
  

  if (uemail == null) 
      alert('undefined');
   else 
      alert('defined');
  

【讨论】:

这只是对了一半:1) nullundefined 在 TypeScript 中有类型。 2)虽然在这种情况下使用==比较有一个工作逻辑,但localStorage.getItem()的返回值永远不会是undefined 是的,我同意 bcoz null === undefined 是假的。但是,大多数情况都是通过使用 == 运算符解决的。【参考方案6】:

使用“this”关键字访问变量。这对我有用

var  uemail = localStorage.getItem("useremail");

if (typeof this.uemail === "undefined")

    alert('undefined');

else

    alert('defined');

【讨论】:

虽然这看起来好像可行,但实际上并没有。 this.uemail 始终是 undefined,因为它指的是一个不存在的、不同于 var uemail 的变量。 您将undefined 转换为字符串,然后比较字符串。你在浪费资源,因为你可以简单地说this.uemail == undefined【参考方案7】:

与打字稿没有严格关系

除了以上所有答案,我们还可以使用简写语法

var result = uemail || '';

如果uemail 变量有一些值,这将给你电子邮件,如果uemail 变量未定义,它将简单地返回一个空字符串。

这为处理未定义的变量提供了一种很好的语法,并且还提供了一种在变量未定义的情况下使用默认值的方法。

【讨论】:

【参考方案8】:

故事晚了,但我认为有些细节被忽略了?

如果你使用

if (uemail !== undefined) 
  //some function

从技术上讲,您将变量uemail 与变量undefined 进行比较,并且由于后者未实例化,因此默认情况下它将提供类型和值均为“未定义”,因此比较返回true。 但它忽略了名为undefined 的变量可能实际存在的可能性——尽管不太可能——因此不会属于undefined 类型。 在这种情况下,比较将返回 false。

为了正确,必须声明一个 undefined 类型的常量 例如:

const _undefined: undefined

然后测试:

if (uemail === _undefined) 
  //some function

此测试将返回 true,因为 uemail 现在等于 _undefined 的值和类型,因为 _undefined 现在已正确声明为 undefined 类型。

另一种方法是

if (typeof(uemail) === 'undefined') 
  //some function

在这种情况下,布尔返回基于在比较两端的两个字符串的比较。从技术的角度来看,这是测试未定义的,尽管它达到了相同的结果。

编辑:07/2021 正如许多人所指出的,在 TypeScript 中不再可能重新定义 undefined,因此您不太可能有这种风险。但在较旧的浏览器中,如果使用 ECMA 5 之前的 JS,那么仍然存在这种风险。

【讨论】:

你不能重新定义undefined @mtholen 你试过重新定义 undefined 吗?我试过了,这是不可能的。 如果你使用的是 JavaScript,而不是 TypeScript,你可以绝对重新定义 undefined。但请不要。 undefined 在 Typescript 中是它自己的类型,它不是一个未实例化的变量。您最初的示例之后的所有内容都不准确,您也没有列出任何来源。参见typescriptlang.org/docs/handbook/…,undefined 也是 javascript 中的原始类型:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… '但是,全局变量undefined不是保留字,因此可以重新定义。幸运的是,从 ECMA 5 开始,不允许重新定义 undefined,但在以前的版本和较旧的浏览器中,它是可能的......' davidshariff.com/blog/javascripts-undefined-explored 所以虽然你是对的,但在现代浏览器中,使用 ecma5 是不允许的。然而在过去这当然是可能的......这篇文章也是为了说明这在 JS 中是如何工作的。但是,是的,严格来说,如果 ecma5 是标准,那么没有 undefined 不能重新定义【参考方案9】:

从 Typescript 3.7 开始,您还可以使用无效合并:

let x = foo ?? bar();

这相当于检查 null 或 undefined:

let x = (foo !== null && foo !== undefined) ?
    foo :
    bar();

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#nullish-coalescing

虽然不完全相同,但您可以将代码编写为:

var uemail = localStorage.getItem("useremail") ?? alert('Undefined');

【讨论】:

好答案。我最近也发现了这个??操作员。它简化了代码。但是使新人的理解以及 ... 操作员变得复杂。【参考方案10】:

我知道这不是最佳且奇怪的示例,但很高兴知道还有另一种方法可以检查是否使用 JSON.stringify 定义了某个值

const foo = '';
const buzz = null;
const fooBuzz = 0;
const array = [];
let declared;
const asUndefined = undefined;

if (JSON.stringify(foo)) 
  console.log(foo); // empty string
 else 
  console.log('undefined');


if (JSON.stringify(buzz)) 
  console.log(buzz); // null
 else 
  console.log('undefined');


if (JSON.stringify(fooBuzz)) 
  console.log(fooBuzz); // 0
 else 
  console.log('undefined');


if (JSON.stringify(array)) 
  console.log(array); // []
 else 
  console.log('undefined');


if (JSON.stringify(asUndefined)) 
  console.log(asUndefined);
 else 
  console.log('undefined'); // undefined


if (JSON.stringify(declared)) 
  console.log(declared);
 else 
  console.log('undefined'); // undefined

【讨论】:

【参考方案11】:

"typescript": "^3.7"

    const uemail = undefined;
    if (uemail ?? false)
    
        alert('defined');
    
    else
    
        alert('undefined');
    

防止 null & undefined

    const uemail = null;
    if (uemail && (uemail ?? false))
    
        alert('defined or not null');
    
    else
    
        alert('undefined or null');
    

【讨论】:

【参考方案12】:

我有以下一段代码(状态是一个 json 对象):

const value: string = state[identifier].description; // undefined
const severity: string = state[identifier].level; // undefined

这给出了以下错误:

Uncaught TypeError: (intermediate value)[identifier] is undefined

我通过结合使用Nullish Coalescing Operator 和Optional chaining 解决了这个问题。

const value: string = state[identifier]?.description ?? "Undefined"; // "Undefined"
const severity: string = state[identifier]?.level ?? "Undefined"; // "Undefined"

不需要 if 检查或 typeof 方程。

【讨论】:

以上是关于如何在 Typescript 中检查未定义的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 可选属性不接受未定义的值

无法读取未定义的属性,Typescript

即使使用 `?` 链接或条件检查,Typescript Partial<T> 也会导致未定义的错误

如何防止使用 TypeScript 在构造函数中未定义成员?

在react typescript项目中如何使用没有@type定义的npm包

类型“字符串”不可分配给类型“WebkitAppearance |在 React + TypeScript 中未定义?