Ego*_*rKa 6 compilation private typescript
为什么即使在 #property 中使用“target:ESnext”私有类属性,TSC 也无法编译?
或者也许将来会这样做?
es2023配置给出错误,对于ES2022它也没有编译到#property中。
有关此问题的权威答案,请参阅microsoft/TypeScript#31670 。
如果 TypeScript 将TypeScriptprivate类属性作为以开头的 JavaScript 私有类成员#发出,那么不幸的是它会违反其语言设计目标之一。 TypeScript 非目标#5 是:
在程序中添加或依赖运行时类型信息,或根据类型系统的结果发出不同的代码(强调已添加)。相反,鼓励不需要运行时元数据的编程模式。
问题不在于该字段的声明位置,而在于该字段的使用。TypeScriptprivate属性仅声明为private,但仅使用其名称来引用:
class Foo {
a = 1;
private b = 2; // declaration
method() {
console.log(this.a + this.b); // use
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,this.a和this.b具有相同的形式,并且不加修改地发送到 JavaScript:
/* class Foo {
a = 1;
b = 2; // declaration
method() {
console.log(this.a + this.b); // use
}
} */
Run Code Online (Sandbox Code Playgroud)
另一方面,当您使用 JavaScript 私有属性时,对它的所有引用都需要具有印记#:
class Foo {
a = 1;
#b = 2; // declaration
method() {
console.log(this.a + this.#b) // use
}
}
Run Code Online (Sandbox Code Playgroud)
private对于声明来说,使用关键字“emit”是很容易的#,但为了让编译器知道它应该使用“emit”this.a + this.#b而不是“emit this.a + this.b”,它必须能够使用 TypeScript 类型系统信息来决定。这是违反规则的。
所以它现在不会发生,而且几乎肯定永远不会发生;如果有人提出功能请求,这样的请求将被拒绝。正如Microsoft TypeScript 团队的开发负责人在microsoft/TypeScript#31670 上的评论中所说:
哦,[这个建议]的另一种解释是“TS 会发出
private为#”,答案肯定是“否”,因为这需要类型定向发出。
| 归档时间: |
|
| 查看次数: |
756 次 |
| 最近记录: |