编译私有到#property

Ego*_*rKa 6 compilation private typescript

为什么即使在 #property 中使用“target:ESnext”私有类属性,TSC 也无法编译?

或者也许将来会这样做?

es2023配置给出错误,对于ES2022它也没有编译到#property中。

jca*_*alz 3

有关此问题的权威答案,请参阅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.athis.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#”,答案肯定是“否”,因为这需要类型定向发出。

Playground 代码链接