将任何数字乘以null应该在typescript中返回null而不是0

时间:2018-04-13 22:28:08

标签: javascript c# typescript null

我有一个C#,

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

在typescript中的位置

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

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

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

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

1 个答案:

答案 0 :(得分:6)

为什么结果为零

因为在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> properties null并返回null。

使用NaN / undefined的另一种解决方案

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

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

  2. 任何类似x * y的操作都会在任何操作数为NaN时给出NaN,而不会对执行计算的代码进行任何更改。

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

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

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