在打字稿中,将任何数字与 null 相乘应返回 null 而不是 0



我有一个场景,在 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

**如何在打字稿中获取空而不是 0?

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

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

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

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

如果你想要"C#空吞噬"行为,你确实需要明确指定它:

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/未定义的另一种解决方案

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

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

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

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

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

不确定这是否可以适应您的情况,但如果您想避免像我上面写的那样使用条件使代码混乱,值得检查一下。

相关内容

  • 没有找到相关文章

最新更新