【问题标题】:TypeScript - null versus undefinedTypeScript - null 与 undefined
【发布时间】:2018-09-19 16:05:03
【问题描述】:

TypeScript Coding Guidelines 状态

使用未定义。不要使用 null

刚刚阅读了另一个 article on ECMAScript,它主张 null 优于 undefined,我想知道 Microsoft 或 TypeScript 团队的理由是否为这一决定所熟知?

【问题讨论】:

  • 如指南中所述,选择它是为了该项目的团队一致性,它并不意味着打字稿社区遵循的规范性指南。所以这就是他们的基本原理,“一致性”。
  • @RosdiKasim 一致性很好,但是我想知道是否有任何技术依据?另一篇文章(现在在帖子中)似乎有更多的技术立场。

标签: typescript


【解决方案1】:

指南不需要任何理由,可以随机选择要求以保持代码库的一致性。

就本准则而言,undefined 需要输入更多字符,但不需要显式分配给可为空的变量或属性:

class Foo {
  bar: number|undefined;
}

function foo(bar: number|undefined) {}

对比

class Foo {
  bar: number|null = null;
}

function foo(bar: number|null = null) {}

此外,在运行时检查 null 值的类型不太方便,因为 typeof val === 'object' 用于 null 和对象值,而 typeof val === 'undefined' 用于 undefined

有相关的 TSLint 规则可以解决这个问题,no-null-keyword

【讨论】:

  • 这是最好的答案。我想补充一点,在 JavaScript 的早期版本中,反对 undefined 的一个论点是它 could be reassigned 作为全局变量。但在 2018 年,undefined 没有任何不利因素。
  • @Paleo 是的。这无论如何都会导致 TS 编译错误。
  • 但是val === nulltypeof val === 'undefined' 容易。如果你愿意,你也可以使用val == null。所以我认为类型检查不方便是一个原因。
  • @tsh 对于 undefined 也可以是 val == nullval === undefined。我的意思是需要typeof 检查的情况(例如val 可能未定义)并且需要一个对象。 typeof val === 'object' 对应 null 会导致歧义,需要额外检查。
【解决方案2】:

几个月前我做了一些研究,结果发现必须使用 tslint 规则“no-null-keyword”优先考虑未定义。

我尝试更改我的代码库,但遇到了一些问题。 为什么? 因为我使用的 API 会为空字段返回 null。

由于 tslint 三等式规则,我很挣扎。

if (returnedData === undefined) // will be false because returnedData is null

这让你有两个选择:

1) 为您的三等式规则添加一些参数。

"triple-equals": [true, "allow-null-check"] 并执行If (returnedData == null)

allow-null-check allow "==" for null

2) 改用If (returnedData),但它会检查是否为空/未定义/空字符串或零

【讨论】:

  • "但它会检查 null OR undefined" ... 还是空字符串或零。但是,如果您确定该值是对象或 null/未定义,而不是标量值,那么测试 if (returnedData) 仍然是一个很好的测试。
  • @Paleo 确实,这就是我选择第一个选项的原因,我会添加
  • 我认为第一个选项(== null)会产生相同的结果:0""falsenullundefined 都是 ==。运营商== 只是一个不好的做法。第二种选择更好。
  • @Paleo gyazo.com/a90c339be646f49170bafd58cdc625df 第一个选项是未定义或 null 第二个是全部
  • 我不知道。谢谢。
【解决方案3】:

为什么使用 null 而不是 undefined?

在 javascripts 中,对象是动态的,没有任何类型信息。为此:

var person
person.namme

可能是拼写错误,也可能是name 属性。如果你使用 undefined as null 你在调试时不知道是否:

  • 变量/属性尚未初始化,或者
  • 您没有输入属性名称。

因此 null 比 undefined 更可取,您可以推迟:

  • 忘记初始化属性和
  • 使用了错误的属性。

也就是说:打字稿是打字的。因此以下代码:

var person
person.namme

会导致编译时出现类型错误。因此,不再需要这种意义上的 null。

也就是说,我仍然更喜欢 null 而不是 undefined。

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2017-11-16
    • 1970-01-01
    • 2022-12-02
    • 2021-10-20
    • 1970-01-01
    相关资源
    最近更新 更多