在TypeScript中有没有一种方法可以通过引用以一种有意义的方式将一个类标记为不可比较?如果我不小心尝试使用==或===比较该类的一个对象,我希望得到一个错误/警告,因为这不会找到“相等”的克隆。
==
===
yrdbyhpb1#
TypeScript没有禁用对象引用的相等运算符的功能。请记住,这是一个有效的操作(检查两个变量或类似变量是否包含对同一对象的引用)。虽然您可以通过编写lint工具插件或类似工具来阻止显式===和!==操作,但要注意这些比较通常是隐藏的(例如,在对Array.prototype.includes、Map或Set操作或Object.is等的调用中)。任何编写TypeScript代码的人都应该知道(或很快学会),不能使用相等运算符来检查对象 * 等价性 *,只能用于检查对象 * 标识性 *(if (a === b)表示“它们是 * 同一个对象 * 吗?"而不是“它们是等价对象吗?”)。这并不局限于你的类,它适用于JavaScript中的所有对象(因此也适用于TypeScript):
!==
Array.prototype.includes
Map
Set
Object.is
if (a === b)
console.log({} === {}); // false console.log([] === []); // false console.log(new Date(0) === new Date(0)); // false // ...and so on...
7d7tgy0s2#
使用===来比较Typescript中的对象并不像在Java中那样表示可能的错误。在Java中,如果你有两个Integer对象正在被==比较,很可能是因为你没有意识到它们被装箱了,或者可能是因为你认为它们会被自动取消装箱。问题是在Java中,==对于不同的“整数”可以有不同的含义,这取决于它们是什么类型的整数,而通常语言会执行隐式强制,所以你不必关心你有什么类型的整数。Typescript没有任何与 * 类似的语义,所以读者可能怀疑===意味着在Typescript中按值比较的唯一原因是因为读者不熟悉Typescript。所以Typescript团队不太可能选择为此在编译器中添加警告。注意,即使在Java中,类似的代码 * 很可能是 * 一个错误,编译器不会警告你这是由第三方linting工具处理的。也许可以为typescript-eslint编写一个规则来警告它,但我无法找到它的现有规则。
Integer
new Number(...)
2条答案
按热度按时间yrdbyhpb1#
TypeScript没有禁用对象引用的相等运算符的功能。请记住,这是一个有效的操作(检查两个变量或类似变量是否包含对同一对象的引用)。虽然您可以通过编写lint工具插件或类似工具来阻止显式
===
和!==
操作,但要注意这些比较通常是隐藏的(例如,在对Array.prototype.includes
、Map
或Set
操作或Object.is
等的调用中)。任何编写TypeScript代码的人都应该知道(或很快学会),不能使用相等运算符来检查对象 * 等价性 *,只能用于检查对象 * 标识性 *(
if (a === b)
表示“它们是 * 同一个对象 * 吗?"而不是“它们是等价对象吗?”)。这并不局限于你的类,它适用于JavaScript中的所有对象(因此也适用于TypeScript):
7d7tgy0s2#
使用
===
来比较Typescript中的对象并不像在Java中那样表示可能的错误。在Java中,如果你有两个Integer
对象正在被==
比较,很可能是因为你没有意识到它们被装箱了,或者可能是因为你认为它们会被自动取消装箱。问题是在Java中,==
对于不同的“整数”可以有不同的含义,这取决于它们是什么类型的整数,而通常语言会执行隐式强制,所以你不必关心你有什么类型的整数。Typescript没有任何与 * 类似的语义,所以读者可能怀疑
===
意味着在Typescript中按值比较的唯一原因是因为读者不熟悉Typescript。所以Typescript团队不太可能选择为此在编译器中添加警告。注意,即使在Java中,类似的代码 * 很可能是 * 一个错误,编译器不会警告你这是由第三方linting工具处理的。也许可以为typescript-eslint编写一个规则来警告它,但我无法找到它的现有规则。new Number(...)
来创建,但是不像Java,Typescript中没有装箱数字的用例,你应该总是使用原始数字。我认为linters * 确实 * 警告过使用装箱的原始数字,因为基本上使用它们总是不好的。