在JavaScript中重用类名

在JavaScript中重用类名,javascript,class,global,Javascript,Class,Global,是否可以以某种方式重用在找到的全局对象列表中定义的类名?比如数字,字符串 假设我想拥有自己的字符串类。我可以定义它,并像这样使用它: String.js export default class String { } App.js import String from './String' let string = new String(); 这确实有效,但是 PHPStorm告诉我:是的,您使用了一个原始对象包装器,认为它是 全局对象字符串。 然后ESLint告诉我:不允许原始包装器实例

是否可以以某种方式重用在找到的全局对象列表中定义的类名?比如数字,字符串

假设我想拥有自己的字符串类。我可以定义它,并像这样使用它:

String.js

export default class String {
}
App.js

import String from './String'

let string = new String();
这确实有效,但是

PHPStorm告诉我:是的,您使用了一个原始对象包装器,认为它是 全局对象字符串。 然后ESLint告诉我:不允许原始包装器实例没有新的包装器 最后,SonarQube告诉我:对基本类型使用包装器对象是毫无意义的、令人困惑的和危险的。应改为使用简单文本。 是的,有没有一种方法可以封装我的类,这样它就不会与全局字符串类混淆

import './String'
函数和类定义是模块的本地定义。您正在导入文件,但未使用其中的任何内容

这就是为什么:

let string = new String();
如果模块作用域中没有字符串定义,将使用全局字符串

请确保命名所需的导入:

import String from './String'

顺便说一句,这是为什么给String类一个唯一的名称(如PhysicsString或StringMaterial或Thread)是更好的做法的多个原因之一。这样,如果您忘记将其导入某个位置,您就不会意外地使用全局定义。

这样做是非常糟糕的做法。你为什么要这么做?总结我的反应。因为我试图用我的类设计的对象是一个实际的字符串。我喜欢这块布。我已经找过同义词了,但根本没有。@DavidMaes我看不出有什么问题。虽然每个人都告诉你这不是一个好主意,但是你的代码仍然可以运行,不是吗?所以在JS中这是完全可能的,事实上,我甚至不能让ESLint对此进行抱怨。@DavidMaes这是一种糟糕的做法,因为它会让其他人更难理解代码。如果您不关心这个问题,那么您可以创建名为String的类,并且希望永远不要遇到同样需要使用全局构造函数的情况,尽管您可以设置instruments.String之类的内容。当你想要的东西很明显是可能的时候,继续引用其他语言是没有多大帮助的。啊,那实际上是我的错误,我实际上已经按照你说的做了。我已经编辑了这个问题。同样的问题。就像我说的,JS就是这样做的。但是我的代码约定没有看到我使用的是我自己的类。@DavidMaes最有可能的情况是,linter只使用构造函数的名称,实际上并没有在范围中查找它。然而,我希望有某种“import正在隐藏全局变量警告”。@Bergi我知道我所有的类都被封装得非常清楚,因此隐藏是不能偶然完成的。如果您正在使用的类显然导入了String的新定义,那么这是一个不错的做法。对不起,我错过了。对于eslint,您可以禁用该规则,呵呵,但重命名该类可能更容易……那么,恐怕我能想到的唯一剩下的解决方案是使用范围分析修补Linter://