当没有要指定的确切值“未定义”或“空”时,为 TypeScript 可选参数传递啥? [复制]

Posted

技术标签:

【中文标题】当没有要指定的确切值“未定义”或“空”时,为 TypeScript 可选参数传递啥? [复制]【英文标题】:What to pass for TypeScript optional parameter when there is no exact value to specify, 'undefined' or 'null'? [duplicate]当没有要指定的确切值“未定义”或“空”时,为 TypeScript 可选参数传递什么? [复制] 【发布时间】:2019-03-21 18:13:18 【问题描述】:

我在 TypeScript 中有以下函数(我无法更改参数的顺序),

user(firstName: string, lastName?: string, address?: string);

在我只需要传递firstNameaddress 的情况下,作为lastname 传递的更好/合适/推荐值是什么?

case 1: user("Jack", undefined, "NY");

case 2: user("Jack", null, "NY");

每种方法的优缺点是什么?

【问题讨论】:

“更好”关于什么? @IngoBürk 什么是最合适或推荐的?这两种方法的行为是否相同? 这取决于函数是如何实现的。如果您省略第二个(和第三个)参数,使用 undefined 会发生什么,但 null 更短(这也是一个指标)。函数在 undefined 或 null 上的行为取决于实现。 @IngoBürk 在函数中它没有明确处理这种情况。在那种情况下,我应该通过什么。这个功能我不能改变。 (但我想知道除了处理那些 null 和 undefined 之外还有哪些可能的更改) 最安全的方法是使用 undefined。如果该函数不处理这个问题,它可能不应该首先将这些参数设为可选,因为user("Jack")user("Jack", undefined, undefined) 相同,那么如果它不能处理缺少的参数,为什么还要设置可选参数。跨度> 【参考方案1】:

你应该使用未定义的。

这个:

lastName?: string

告诉我们lastName 参数的类型为string | undefined。所以使用null 是非法的(在严格模式下,这有点好)。使用未定义。

【讨论】:

只有启用了strictNullChecks 才是非法的,IMO 是个好主意。 @AndyJ 我忘记了这一点,因为在任何项目中,我做的第一件事就是启用strict: true。非严格的打字稿对我来说很奇怪。 是的,我也是这样做的。【参考方案2】:

我找到了这个The Typescript coding style guide,它指出你应该始终使用 undefined 而不是 null,

null未定义

使用未定义。不要使用 null。

无论如何检查here, undefined 表示变量已声明但尚未赋值。 null 是一个赋值。它可以分配给一个变量作为没有值的表示。所以为了达到optional的目的,我认为undefined会更好。

【讨论】:

它并没有说你应该总是使用 undefined,它说当你为 TS 代码库做贡献时你应该总是使用 undefined ...“这些是 TypeScript 贡献者的编码指南。这个不是 TypeScript 社区的规范性指南。”他们继续将信息带回家“再次:这不是 TypeScript 社区的规定性指南” 无论如何检查这里,未定义... 该链接解释了 javascript 上下文中的主题。如果您想知道 TS 的正确性,请看我的回答,它是 100% 合法的 @NurbolAlpysbayev 我认为这不会造成任何伤害吧? 链接?如果是,那么链接在 JS 上下文中是正确的。此外,它对 Typescript 也是正确的,因为它是 JS 的超集。但主题是关于 Typescript,所以我想你想从 type system 的角度了解什么是正确的方法。 @NurbolAlpysbayev 同意您的理解。我只需要强调这两者之间的区别。

以上是关于当没有要指定的确切值“未定义”或“空”时,为 TypeScript 可选参数传递啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

空指针是啥意思

为什么std :: string没有空指针?

5.任意值类型推论联合类型

是否有 JavaScript 习语将“未定义”更改为“空”?

一个类或对象的“sizeof”可以为零吗?

IE10 d3.v3.js 错误:无法获取未定义或空引用的属性“原型”