如何在 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】:它确实有效,但null
和undefined
之间存在差异。您实际上是在分配给 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)null
和 undefined
在 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 Partial<T> 也会导致未定义的错误
如何防止使用 TypeScript 在构造函数中未定义成员?