【问题标题】:Multiplying any number with null should return null instead of 0 in typescript将任何数字与 null 相乘应返回 null 而不是打字稿中的 0
【发布时间】:2018-04-13 22:28:07
【问题描述】:

我有一个场景,在 C# 中,

decimal? x; // number
decimal? y; // null
c=x*y //c returns null

在打字稿中的位置

let x:number=null;
let y:number=12;
c=x*y //c returns 0

**如何在 typescript 中获取 null 而不是 0?

我需要设置通用方式,而不是使用三元运算符并检查属性 null 并返回 null。

我需要在 tsconfig.json 中设置任何编译器选项吗?**

【问题讨论】:

  • 好吧,Typescript 遵循 javascript / Ecmascript 约定。在进行数学运算时,会进行一些隐式转换,尤其是可以将 null 强制转换为数字 0。
  • 有什么办法可以返回null,因为我需要在SQL中将零保存为零,将null保存为null
  • null * number 应该是 NaN,而不是 null..?
  • @gary 是的,但我说“应该是NaN。”根据任何逻辑,null * number 不是数字,也不是 null ..?该代码 sn-p 是 JS 自动类型强制的典型受害者。
  • @gary 从不使用 w3schools.com。它不是一个遥不可及的参考。为了你自己,你需要找到更好的东西

标签: javascript c# typescript null


【解决方案1】:

为什么在你的情况下结果为零

因为在 TypeScript/JS/ES 中,涉及数字和 null 的算术运算将导致 null 被隐式转换为数字。并且 null 被转换为 0。

如果你想要“C# null-swallowing”行为,你确实需要明确指定它:

let c = x === null || y === null ? null : x * y;

Typescript 中的“自然”行为与 JavaScript / EcmaScript 相同:如果您有一个带有数字和 null 的操作,则 null 将被强制为数字 0。

我需要在 tsconfig.json 中设置任何编译器选项吗?**

据我所知,不存在也不应该存在,因为这就是算术运算在 ES / JS 中的工作方式,并且 TS 没有理由尝试将 ES 的算术规则更改为 C# 使用的规则。


我需要设置通用方式,而不是使用三元运算符并检查 p> 属性 null 并返回 null。

NaN / undefined 的另一种解决方案

为了避免这段代码混乱并有类似的“一些特殊值吞噬每个操作”,如 C# 中的 null,您可以使用 NaN(不是数字)而不是空值。

这个

  1. 将每个 null 转换为 NaN 会很容易。

  2. 如果任何操作数为 NaN,则像 x * y 这样的任何操作都会给出 NaN,而不会对执行计算的代码进行任何更改。

  3. 如果你最后真的需要空值,那么你可以将 NaN 转换回空值。 (注意,要测试一个数字是否为 NaN,请使用 Math.IsNan(),不要尝试与 === NaN 进行比较,因为这总是会给出错误,即使是 NaN === NaN)

  4. 最后但并非最不重要的一点是,如果其中一个操作数是undefined,则操作的结果也是NaN。所以实际上,你也可以将你的空值转换为 undefined 而不是 NaN,从 C# null 到 JS/TS undefined 的转换可能更自然。在序列化方面也可能更容易(提示:Newtonsoft.Json.NullValueHandling.Ignore)

不确定这是否能适应你的情况,但如果你想避免像我上面写的那样用条件语句弄乱你的代码,这是值得检查的。

【讨论】:

  • int x 怎么可能为空?
  • 我已经这样做了,但我想以通用方式处理它,因为我有大约 2000 行计算代码。
  • 那是为了演示场景@Eser
  • @gary 当然......但这不正是重点吗?涉及 NaN/undefined 的 any 操作将返回 NaN,就像在 C# 中任何涉及 null 的操作都将返回 null ?
  • 如果您不想要一个全局解决方案,如果您希望“空值”仍被处理为 0 以进行添加,那么我看不到任何解决方案可以在只有你想要一个空结果的操作。
猜你喜欢
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2018-11-14
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
相关资源
最近更新 更多