在TypeScript中,任何数乘以null都应该返回null而不是0。

4

我有一个场景,涉及到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

如何在TypeScript中获得null而不是0?

我需要一种通用的方法,而不是使用三元运算符来检查两个属性是否都为null,并返回null。

是否有任何编译器选项我需要在tsconfig.json中设置?


好的,Typescript 遵循 JavaScript / Ecmascript 约定。在进行数学运算时,会进行一些隐式转换,特别是 null 可以被强制转换为数字 0。 - Pac0
有没有办法返回null?因为我需要将零保存为零,将null保存为null在SQL中。 - gary
请提供需要翻译的文本。 - gary
2
@gary 是的,但我说“应该是NaN”。根据任何逻辑,null * number既不是数字,也不是null..?那个代码片段是JS自动类型转换的典型受害者。 - Teemu
3
@Gary,永远不要使用w3schools.com。它不是一个可靠的参考来源。为了你自己的利益,你需要找到更好的替代品。 - Aluan Haddad
显示剩余3条评论
1个回答

7

为什么你的结果是零

因为在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>属性是否为空并返回null。

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

为了避免代码混乱,并且具有类似于C#中的“一些特殊值吞噬每个操作”的功能,您可以使用NaN(非数字)而不是null。

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

  2. 任何操作,如x * y,如果任何操作数为NaN,则会产生NaN,而无需更改执行计算的代码。

  3. 如果您确实需要最终的null,则可以将NaN转换回null。(请注意,要测试数字是否为NaN,请使用Math.IsNan(),永远不要尝试与 === NaN 进行比较,因为这将始终给出false,即使NaN === NaN

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

无法确定是否可以适应您的情况,但如果要避免使用像我上面写的条件语句来混乱您的代码,则值得检查。


1
int x 怎么可能为空? - Eser
我已经在做这件事,但我想以通用的方式处理它,因为我有大约2000行计算代码。 - gary
这是一个示例,用于演示场景。@Eser - gary
1
@gary 当然... 但这不正是重点吗?任何涉及NaN/undefined的操作都会返回NaN,就像在C#中任何涉及null的操作都会返回null一样。 - Pac0
1
如果您不想要一个全局解决方案,如果您希望将“null”作为加法的0进行处理,那么我认为唯一的解决方案就是在您想要一个空结果的唯一操作之前专门使用条件语句。 - Pac0
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接