当未指定访问修饰符时,会隐含哪些访问修饰符?

163

对于支持访问修饰符的各种概念,如字段、属性、方法和类,如果没有指定访问修饰符,则隐含哪些访问修饰符?


@basarat,我已经很久没有使用TypeScript了,所以很难记得它是如何工作的!就我所知,你的回答看起来很合理,但我觉得它不够权威,不能标记为正确答案。你的答案是基于你对这门语言的经验,还是来自规范信息? - Sam
基于规范 https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md - basarat
2
为了澄清这个问题和答案,应该在问题中指定TypeScript以使其清晰明了。虽然有一个TypeScript标签,但那是唯一的迹象,我们没有讨论Scala、Java、C#、C++等。 - absmiths
@basarat,你的链接失效了,因为规范文件已更名。新的可用链接是:https://github.com/microsoft/TypeScript/blob/main/doc/spec-ARCHIVED.md - Wimateeka
2个回答

250

如果未指定,class 中的所有内容均为 public。如果未使用 export 关键字,则 module 中的所有内容均为私有。


6
对于使用入门套件的人来说,一些套件会附带tslint,这可能会让人感到困惑。当您看到此消息时:default access modifier on member/method not allowed请检查tslint.json以允许默认或隐含的访问修饰符。 - visheshd
1
可以使用预处理步骤自动分配“private”吗? - Qwerty

-4

我不同意这个说法:

如果没有指定,类中的所有内容都是公开的。

即使使用了私有修饰符,所有内容仍然是公开的。只需要查看转译后的代码就可以看到。私有注解方法将会被公开访问。只有在转译过程中才会出现错误。无论是公开还是私有,都会被转换为<Object>.prototype.funcName


28
是的,这是一个好观点。不过,我的问题是“当未指定访问修饰符时,隐含了哪些访问修饰符”,而不是“当未指定访问修饰符时,我的代码是否可以被访问”。访问修饰符是 TypeScript 的概念,而不是 JavaScript 的概念。因此,我认为 @basarat 的答案解决了我在问题中所指的内容,并且在上下文中似乎是正确的。也许有些余地可以消除问题和答案中的歧义措辞。 - Sam
这就是TS的工作方式,它会编译你的代码,无论从TS的角度来看是否“正确”,这适用于TS中的所有内容,包括类,但主要的一点是,如果你遵循TS的警告 - 你不会访问被标记为私有的属性。 - Andrew Bogdanov
7
我想不出有任何一种语言可以真正保护隐私。在 C# 中,你可以通过反射轻松地访问任何私有字段。在像 C 或 C++ 这样的低级语言中,你只需移动指针就可以访问私有字段。除了操作系统层面的保护措施(如 DEP 和加密内存)之外,访问修饰符只是编译器提供的辅助功能,帮助你编写更好的代码。...对吗? - pbristow
@pbarranis 私有JavaScript字段 实际上是私有的,无法从JavaScript运行时内部访问它们。 - Yogu

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