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

gar*_*ary 2 javascript c# null typescript

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

decimal? x; // number
decimal? y; // null
c=x*y //c returns null
Run Code Online (Sandbox Code Playgroud)

打字稿中的位置

let x:number=null;
let y:number=12;
c=x*y //c returns 0
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pac*_*ac0 6

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

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

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

let c = x === null || y === null ? null : x * y;
Run Code Online (Sandbox Code Playgroud)

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

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

据我所知,没有,也不应该,因为算术运算在ES/JS中是如何工作的,TS没有理由尝试将ES的算术规则改为C#使用的算术规则.


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

NaN/undefined的另一种解决方案

为了避免这种代码混乱并且像nullC#中那样有一些类似"某些特殊值吞下每个操作" ,你可以使用NaN(非数字)而不是空值.

这个

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

  2. 如果任何操作数是NaN,那么像x*y这样的任何操作都会给出NaN,而对执行计算的代码没有任何改变.

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

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

它不能确定这可以适应你的情况,但是如果你想避免像我上面写的条件那样混乱你的代码是值得的.