我有一个场景,在 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。
这
很容易将每个 null 转换为 NaN。
如果任何操作数是 NaN,则任何像 x * y 这样的操作都将给出 NaN,而不会对执行计算的代码进行任何更改。
如果你真的需要在最后空值,那么你可以将 NaNs 转换回空值。(请注意,要测试一个数字是 NaN,请使用
Math.IsNan()
,永远不要尝试与=== NaN
进行比较,因为这总是会给出 false,甚至NaN === NaN
)最后但并非最不重要的一点是,如果其中一个操作数
undefined
,则运算的结果也将NaN
。所以实际上,你也可以将你的空值转换为undefined而不是NaN,从C#null
到JS/TSundefined
的转换可能更自然。在序列化方面也可能更容易(提示:Newtonsoft.Json.NullValueHandling.Ignore
)
不确定这是否可以适应您的情况,但如果您想避免像我上面写的那样使用条件使代码混乱,值得检查一下。