我有一个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中设置任何编译器选项吗?**
答案 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
(非数字)而不是空值。
此
很容易将每个空值转换为NaN。
任何类似x * y的操作都会在任何操作数为NaN时给出NaN,而不会对执行计算的代码进行任何更改。
如果你真的需要最后的空值,那么你可以将NaNs转换回null。 (要小心,要测试一个数字为NaN,请使用Math.IsNan()
,不要尝试与=== NaN
进行比较,因为这总是会给出错误的,甚至是NaN === NaN
)
作为最后但并非最不重要的评论,如果其中一个操作数为undefined
,则操作的结果也为NaN
。实际上,您也可以将空值转换为未定义而不是NaN,从C#null
到JS / TS undefined
的转换可能更自然。在序列化方面也可能更容易(提示:Newtonsoft.Json.NullValueHandling.Ignore
)
不确定这是否可以适应您的情况,但是如果您想避免像我上面写的条件那样混乱您的代码,那么值得一试。