选择何种变体,何时选择?
吴新打破了法器。这么多不同的变体...
TypeScript是强类型的语言。
为了了解我们如何保护自己免受nullability问题的影响,我们需要首先了解TypeScript在处理null和undefined方面的设计方式。
空值和未定义意味着不同的事情。
- 某些东西还没有被初始化,没有被赋值:使用undefined。
- 某些东西目前不可用:使用null。
let name = {}; // no property defined
值 "undefined "表示一个变量已经被声明,但还没有被分配任何值。所以,该变量的值是'undefined'。
let name = undefined;
另一方面,'null'指的是一个不存在的对象,基本上意味着'空'或'无'。
null "被分配给一个变量,以指定该变量不包含任何值或为空。但是'undefined'是用来检查变量在声明后是否被分配了任何值。
**Null与空数组[]--**返回空数组比返回null更好
我认为我们应该把null或undefined转换成[],除非我们真的需要它是null或undefined的信息,但在这种情况下,我真的怀疑我们是否需要这种信息。这个简单的技巧会让代码变得更容易,不需要检查null,不需要在测试中覆盖额外的分支,等等。它让我们的生活变得更轻松。
在1个值的情况下,我们可以检查未定义。
if (name !== undefined) { }
这也足以让我们用非常简短的方式来写这个检查。
if (name) {} // undefined, null and false check inside
**许多现代语言中都有三元操作符--**如果(a)? b : c
如果a不是空的--取b作为结果,否则取c作为剩余部分。
const tariff = this.result?.tariff ? [this.result.tariff] : [];
初始化空数组。
const tariffs: Array<MyTariff> = new Array<MyTariff>();
const tariffs: Array<MyTariff> = null; // unwanted behavior
当我们试图迭代数组时,空数组提供了稳定的行为,因为空或未定义会破坏迭代。
this.result?.sellingTariffs?.forEach(item => {
操作符||或
this.result.sellingTariff || true
对于null和undefined的值会评估为真,但对于false的值也是如此。
this.result?.sellingTariffs || [] // if null return empty array
**Null类型--**代表一个只能取值为null的变量。
我们只能将null赋值给一个拥有null变量的变量。它变得有用的地方在于,我们可以通过联合类型让变量拥有不止一个的值。
// Defining nullable fields:
Null和Undefined的区别
Null和Undefined看起来很相似,但它们之间有一些区别。
1.与==相比,null等于未定义(平等检查
)。与==相比,null不等于未定义(严格平等检查)
。
2.2.当我们将null转换为数字时,它就变成了0。
当我们将undefined转换为数字时,它就变成了NaN
。
3. null是JSON中的一个有效值。
你可以用JSON来表示未定义
检查未定义
typeOf 也是一个经典的JavaScript方法,用于检查对象是否未定义。
if (typeOf tariff !== 'undefined') {
也可以通过使用等价操作符(==)与严格的等价操作符(==)来实现。
let name:number | null | undefined;
console.log(name) //undefined
console.log(typeof name) //undefined
console.log(name ==null) //true, == operator returns true for null
console.log(name === null) //false
console.log(name == undefined) //true
console.log(name === undefined) //true
操作符 !- 非空断言操作
这个操作符对编译器说,这个字段不是空的或未定义的,而是定义的。
type Tariff = {
let tariff: Tariff;
但是这个运算符并不改变对象的值。而且,如果值是空的或未定义的,这个运算符将不会帮助我们。应用程序将被编译得很好,但无论如何都会发生异常。
原则上,这在Kotlin语言中也是一样的,使用两个!
tariff!!.name。我们必须绝对确定这个对象不是空的或未定义的。危险的假设。
TypeScript中的操作符!!!
通过添加!!,现在如果customerData是真实的,表达式就是真的,如果customerData是虚假的,表达式就是假的,这就更容易管理了。
goToNextTab(): void {
而不是。
hasNextTab(): boolean {
因为!!customerData现在是一个布尔表达式,而customerData绝对可以是任何东西。这种表达式将允许写这样的函数来返回真。
const isSelected = (tariffs: Array, selected: Tariff): boolean => {
Nullish凝聚运算符?? ,可以同时检查null和undefined
? "操作符可以用来在另一个值为空或未定义的情况下提供一个后退值。它需要两个操作数,写法是这样的。
value ?? fallbackValue;
如果左边的操作数是空的或未定义的,?表达式会评估为右边的操作数。
let result = null ?? "right value";
Kotlin Elvis操作符?
// take right operand if left is null
结论
TypeScript是从JavaScript发展起来的。并且在基础层面上有很多相似之处。这两种语言现在都在平行发展。但在我看来,最好不要使用null,而应该使用undefined。我还提到了Kotlin语言,以展示与null斗争的相同方法。
链接
原文发表在Dev Genius的Medium上,人们在这里通过强调和回应这个故事来继续对话。