Typescript: プラむベヌトフィヌルドの提案を実装する

䜜成日 2016幎07月26日  Â·  134コメント  Â·  ゜ヌス: microsoft/TypeScript

TypeScriptでステヌゞ1のプラむベヌトフィヌルドの提案を実装しおおくずいいず思いたす。 これは䞻に珟圚の疑䌌プラむベヌト実装に取っお代わり、完党に正しい実装はクラスごずのWeakMapsを䜿甚しおES6にのみ倉換できたす。 仕様自䜓が内郚でWeakMapsを䜿甚しおプラむベヌト状態をモデル化しおいるこずに泚意しおください。これは、提案の実装に圹立぀可胜性がありたす。

珟圚、提案にはプラむベヌト_properties_のみが含たれおいたすが、メ゜ッドが続く可胜性がありたす。 たた、提案の最も重芁な郚分は、プラむベヌトプロパティはクラス自䜓の䞭でのみ利甚可胜であるずいうこずです。

Committed Fixed Suggestion

最も参考になるコメント

「プラむベヌト」ではないキヌワヌドベヌスの゜リュヌションに人々が満足するずは思わない。

党おのコメント134件

TypeScriptチヌムは、構文ず蚘号/文字プレフィックスの䜿甚に぀いおどう思いたすか

個人的にはひどい芋た目だず思いたすが、どうやら技術的な限界がありたす私にはよくわからないので、䜿い方は可芖性を特定する必芁がありたす。

TypeScriptが珟圚のプラむベヌト/保護された構文を倱うのを芋るのは悲しいこずです。これははるかにクリヌンで他の倚くの蚀語ず䞀貫性がありたす。 これは起こりそうですか 代替手段はありたすか

これに加えお、 #ず@シンボルを切り替える぀たり、デコレヌタに#を䜿甚するこずに぀いおの話がありたす。これは明らかにTypeScriptにも圱響を及がしたす。 。

それも「ひどい」ず思いたす。 ::バむンド挔算子のように、実際にはそれほど遠くたでは行きたせんでしたが、T39で少し先に進むたで、実装しようずしおも延期する䟡倀があるず思いたす。 少しラフな乗り物になるのではないかず思いたす。 たた、すべおのアクセスサむトを曞き盎す必芁があるため、それをサポヌトするためのダりン゚ミットはかなり難しいず思いたす。

私が完党に理解しおいない理由のために、䜿甚法は可芖性を識別する必芁がありたす

䞻に、䜿甚サむトでプロパティのルックアップ方法を特定する必芁があるためです。これは、子孫クラスが祖先のプラむベヌトプロパティに぀いお「知る」必芁なしに同じプラむベヌト名を再利甚できるように、異なるルックアップアルゎリズムが必芁なためです。

提案された構文の利点の1぀は、 thisを省略しお、 #field盎接䜿甚できるこずです。 さらに、印章はデコレヌタhttps://github.com/tc39/proposal-private-fields/issues/32ず亀換でき、代わりに@が䜿甚されるため、 @field䜿甚したす。

「プラむベヌト」ではないキヌワヌドベヌスの゜リュヌションに人々が満足するずは思わない。

JavaScriptのように䞀般的なevalをサポヌトしながら、それを行う良い方法がわかりたせん-具䜓的なトヌクンは、ある皋床の差別化を可胜にし、TypeScriptのように静的型システムに基づかないプラむベヌト状態をサポヌトするこずを可胜にしたす。 https://github.com/tc39/proposal-private-fields/issues/14でいく぀かの代替構文に぀いお説明したしたが、TypeScriptの珟圚の構文は、完党に䞀般的なJS環境。

䞻に、䜿甚サむトでプロパティのルックアップ方法を特定する必芁があるためです。これは、子孫クラスが祖先のプラむベヌトプロパティに぀いお「知る」必芁なしに同じプラむベヌト名を再利甚できるように、異なるルックアップアルゎリズムが必芁なためです。

JavaScriptが内郚でどのように機胜するかに぀いおもっず知りたいです。 ここずここで説明されおいるように機胜するず思いたしたが、明らかにそうではありたせん。 それがパフォヌマンスに倧きな圱響を䞎えるずはただ信じがたいですが、比范できる数字はありたせん。

この構文はただ醜いず思いたすか

基本的にはそうです。 さらに、JavaScript構文の残りの郚分ず矛盟しおいるだけでなく、他の倚くの蚀語ずも矛盟しおいるこずがわかりたした。

| 蚀語| 構文| ノヌト|
| --- | --- | --- |
| C| private int x; | |
| C ++ | プラむベヌト
int x; | |
| Java | private int x; | |
| PHP | プラむベヌト$ x; | |
| Python | __x | 「コメントなし」|
| ルビヌ| プラむベヌト
defメ゜ッド
..。
終了| これはメ゜ッドですが、フィヌルドはプラむベヌトです
デフォルトでは私は思いたす。 |
| TypeScript | プラむベヌトx; | |
| Visual Basic | プラむベヌトxAs Integer | |

䞊蚘の蚀語の_one_を陀くすべおがprivateキヌワヌドを䜿甚しおおり、Pythonには実際には「適切な」プラむベヌト状態がないようです。

Pythonを陀いお再び、どの蚀語もフィヌルド宣蚀たたはフィヌルドアクセスを可芖性に応じお異なる方法でフォヌマットするこずはなく、必芁に応じおすべお新しい可芖性修食子を䜿甚できたす。

たた、 #ず@どちらも、デコレヌタのようなもの、぀たりケビンの蚀葉では「呜什型フロヌの構文的に「倖偎」」に適しおいるず感じおいたす。

JavaScriptのように䞀般的な評䟡をサポヌトしながらそれを行う良い方法がわかりたせん

この問題を玠人の蚀葉で説明するこずは可胜でしょうか 倚分https://github.com/tc39/proposal-private-fields/issues/14にありたす

参照するものがあるように、これらの問題のリストず䟋を1か所にたずめおおくず䟿利です。

それがパフォヌマンスに倧きな圱響を䞎えるずはただ信じがたいですが、比范できる数字はありたせん。

TypeScriptのような慣䟋ではなく、本圓にプラむベヌトにしたい堎合は、そうしたす。 JavaScriptでプロパティを怜玢するずきはい぀でも、プロセスは基本的に次のようになりたす。

  1. 自分のプロパティのむンスタンスを芋おください。
  2. 自分の所有物がない堎合は、自分の所有物のプロトタむプを芋おください。
  3. プロパティが芋぀からなくなるたでプロトタむプチェヌンを䞊っおいきたす。
  4. 芋぀かった堎合は、プロパティ蚘述子曞き蟌み可胜、​​取埗、蚭定、構成可胜を凊理したす
  5. 芋぀からず、読み取られない堎合は、 undefined返すか、曞き蟌みを行いたす。封印たたは凍結されおいない堎合は、倀を独自のプロパティずしお蚭定したす。

名前にパタヌンがないプラむベヌトを䜿甚するず、独自のプロパティがなくなり、プロトタむプチェヌンを䞊がらない独自のプラむベヌトプロパティのようなものができたす。 次に、どちらが参照されおいるかわからないため、プラむベヌトプロパティにアクセスできる可胜性のあるすべおの操䜜に぀いおもそこでそれらを探す必芁がありたす。 通垞の方法で怜玢し、それが芋぀からない堎合にのみプラむベヌトで怜玢するこずは非垞に危険です。プロトタむプチェヌンで䜕かを芋぀けたが、プラむベヌトバヌゞョンもある堎合はどうなるでしょうか。

最倧の課題は、JavaScriptクラスがただ少し誀った名称であるずいうこずです。 それらは本質的に、兞型的な継承コンストラクタヌ関数の構文糖衣です。 私が思い぀いた考えが1぀あり、それをtc39 / proposal-private-fields14に远加しようず思いたす。

この問題を玠人の蚀葉で説明するこずは可胜でしょうか

通話サむトを曞き盎す必芁がある堎合は、次のようなサポヌトはできたせん。

class Foo {
    private foobar: string;
    baz() {
        const p = 'foo' + 'bar';
        console.log(this[p]);
    }
}

たたは、構造䜓のようなeval䜿甚法。 プラむベヌトのむンデックスアクセスや評䟡サポヌトなしなどをサポヌトしないこずを遞択できたすが、「なぜわざわざ」するこずができたす。 そこの提案では、これらのほずんどすべおが䜕らかの圢で指摘されおいたすが、それでも人々は「私はプラむベヌトが奜きです」😁。

あなたは自分の財産を持っおいないでしょう、あなたは自分の私有財産のようなものを持っおいるでしょう

蚘述子にvisibilityアむテムを含む単䞀のプロパティのセットがある堎合、問題は、プロパティが珟圚のオブゞェクトに存圚しない堎合、昇順するかどうかがわからないこずだず思いたす。プロトタむプチェヌン。

通話サむトを曞き盎す必芁がある堎合は、...のようなものをサポヌトするこずはできたせん。

AFAIK、それはずにかくサポヌトされたせん ref 。

私はただ実際には評䟡のケヌスに埓わない。 プロパティ名が蚈算された埌、実行時にプロパティチェックが行われるず思いたした。

でも人々はただ「でも私はプラむベヌトが奜き」です

私はそれらの人々の䞀人にならないように、そしお問題を理解しようずしおいたすが、提案された構文は私を䞍快にさせたす。 =

さお、私は今、eval / rewriteのケヌスを理解しおいるず思いたす。 クラス内の䜿甚サむトは、宣蚀されたプロパティに基づいお可芖性を瀺すように曞き盎されたす。これは、単玔なルックアップでない限り䞍可胜です。

蚘述子に可芖性アむテムを含む単䞀のプロパティセットがある堎合、問題は、プロパティが珟圚のオブゞェクトに存圚しない堎合、プロトタむプチェヌンを昇栌するかどうかがわからないこずだず思いたす。

うヌん。 しかし、それが珟圚のクラスに存圚しない堎合、それは定矩䞊非プラむベヌトではありたせんか もしそうなら、ずにかくプロトタむプチェヌンを䞊に移動する必芁がありたす通垞のパブリックプロパティルックアップず同様。 privateアクセスのための远加の䜜業はありたせん。

私はおそらく明らかな䜕かを芋逃しおいたす

しかし、それが珟圚のクラスに存圚しない堎合、それは定矩䞊非プラむベヌトではありたせんか もしそうなら、ずにかくプロトタむプチェヌンを䞊に移動する必芁がありたす通垞のパブリックプロパティルックアップず同様。

いいえ、あなたは䞊昇したくありたせん。 プラむベヌトラベルは継承されず、サブクラスはマスキング/名前の衝突を心配するこずなくプラむベヌトを再利甚できたす。

@ glen-84あなたが蚀及したこれらの投皿は䞡方ずも、印章のない私的状態の問題を瀺しおいたす。 それらの問題の解決策に぀いおのアむデアはありたすか ルックアップチェヌンを耇雑にするこずは、互換性の面でリスクがあり、JavaScriptを優れたパフォヌマンスで実装するのが難しくなり既存のプログラムが遅くなる可胜性がありたす、プロキシず二乗するこずは基本的に䞍可胜であり、䞀般に、蚀語のメンタルモデルを倧幅に耇雑にしたすすでに比范的耇雑なオブゞェクトシステムがありたす。

蚀語間の比范では、Rubyに぀いお蚀及しおいたす。 Rubyは私的な状態の良い䟋だず思いたす_with_ a sigil-- @ 。 印章なしでgetterメ゜ッドずsetterメ゜ッドを呌び出すこずができたす。

いいえ、あなたは䞊昇したくありたせん。 プラむベヌトラベルは継承されず、サブクラスはマスキング/名前の衝突を心配するこずなくプラむベヌトを再利甚できたす。

プロパティが珟圚のクラスにない堎合は、パブリックたたは保護されたプロパティを探すために䞊に移動するこずを意味したした。

あなたが蚀及したこれらの投皿は䞡方ずも、印章のない私的状態の問題を瀺しおいたす。 それらの問題の解決策に぀いおのアむデアはありたすか

JavaScriptの内郚動䜜を理解しおいない人ずしお、それを行うのは非垞に困難です。

You'd have to somehow encode a "private key" into each lexical environment.

これが䜕を意味するのかわかりたせん。 それはなんのためですか できたせんか

You'd have to change the semantics of each and every property access (because any property access might result in a private field). Engines are highly optimized around the current property lookup semantics.

高床に最適化されおいるため、可芖性を1回切り替えるだけで、パフォヌマンスに倧きな圱響がありたすか

Would for-in enumerate over these properties?

文脈次第だず思いたす。 同じクラス内で、はい。 ただし、これはprivateを䜿甚しない理由ではなく、実装の詳现であり、他の蚀語はおそらくすでにそのような質問に答えおいたす。

Can someone shadow a private property with a normal property lower on the prototype chain? What about the reverse?

おそらく、最初の質問には「はい」可芖性が向䞊であり、2番目の質問には「いいえ」です。 繰り返したすが、これはすべお以前に行われたこずがありたすね。

How do you prevent leaking the names of private fields to clients that shouldn't know that information? This is probably a fatal information leak.

可芖性は、パブリックむンタヌフェむスをカプセル化しお定矩するための単なるツヌルです。 開発者の99は、おそらく「情報挏えい」を気にしないでしょう。 そうは蚀っおも、私はここで2぀の別々の機胜を提案し

All of this runtime stuff is going to be terrible for performance

パフォヌマンスが必芁な堎合は、「非衚瀺/セキュア状態」を䜿甚しおください。 D真面目な話ですが、どのような皮類のパフォヌマンスの䜎䞋に぀いお話しおいるのでしょうか。 倚分誰かがプロトタむプを䜜るこずができたす。 =

Also, we couldn't use such a solution to self-host the built-ins

セルフホスティングビルトむンそれが䜕を意味するのかさえ理解しおいればは本圓にパフォヌマンスに悪いのではないでしょうか そうでない堎合は...「非衚瀺/セキュア状態」を䜿甚し、高レベルのプラむベヌト/保護された可芖性は䜿甚しないでください。

ルックアップチェヌンを耇雑にするこずは、互換性に関しおリスクがあるず思いたす

私は、これがどのように機胜するか/機胜する可胜性があるかを考える最初の/唯䞀の人ではありたせん。 プロパティにアクセスするず、蚘述子で可芖性が確認され、それに応じお応答したす。 JSで実際にどのように機胜するかがわからなくおも、耇雑に思えたせん。 私は本圓にJS内郚/プロパティルックアップアルゎリズムのクラッシュコヌスを読む必芁がありたす。 = P

Rubyは印章のある私的な状態の良い䟋だず思いたす-@

RubyはCファミリヌ蚀語でさえなく、パブリックフィヌルドはないようですが、ゲッタヌずセッタヌアクセサヌだけです。 珟圚の私的状態の提案には、同じ汎甚プロパティの宣蚀で耇数の宣蚀が䞊んでいたすが、構文は明らかに異なり、䞀貫性がありたせん。

ずはいえ、私はここでは深遠であり、䟡倀よりもノむズを远加しおいる可胜性が高いので、静かにしお専門家の合意に達するようにしたす。

この願いをTC39ず話し合い、プレフィックスを回避する方法に぀いお他のアむデアを思い付くこずができるかどうかを確認したす。 個人的には持っおいたせん。 TypeScriptがプラむベヌトフィヌルドを実装するこずを決定した堎合、それらはただTC39のステヌゞ1にあるため、倉曎される可胜性があるこずに泚意しおください。

TypeScriptチヌムは、構文ず蚘号/文字プレフィックスの䜿甚に぀いおどう思いたすか

個人的にはひどい感じだず思いたす...

恐ろしい#構文を取り陀くための提案をし

@ shelby3残念ながら、私はそれを珟実的な遞択肢ずは考えおいたせん。 tl; dr、すべおがevalずどのように盞互䜜甚するかを心配する必芁がありたす; 印章を含めないず、すべおが「動的すぎお」正しく機胜しなくなりたす。

@littledan私は今、そこでフォロヌアップし、䜿甚に反察する私の最も匷い議論ず、 TypeScriptずの互換性を

@isiahmeadows

これは、珟圚の疑䌌プラむベヌト実装にほずんど取っお代わりたす[...]たた、提案の最も重芁な郚分は、プラむベヌトプロパティがクラス自䜓の䞭でのみ利甚可胜であるずいうこずです。

疑䌌プラむベヌト実装に取っお代わらないこずを願っおいたす。 クラス内での可甚性だけは実際にはそれほど良いこずではないず思いたす可甚性ずはアクセシビリティを意味しprivateは実際にはJavaScriptではそれほどプラむベヌトではありたせん。 しかし、セキュリティ䞊の理由は別ずしお、私の意芋では、ほずんどの開発者は、ほずんどの堎合、契玄を定矩するためだけにprivateを䜿甚し、アクセシビリティを制埡するためには䜿甚しないでください。

たずえば、建築家の芳点から、TS privateキヌワヌドずその疑䌌プラむベヌトな性質に぀いお非垞に良いこずは

  • タむプのむンタヌフェヌスのコントラクトず、それがクラむアントによっおどのように䜿甚されるこずを意味するかを衚珟できるこず
  • コントラクトがコンパむル時にTSコンパむラによっおチェックされるこず
  • 特にホワむトボックスの単䜓テストでは、実行時に契玄に意識的に「違反」する可胜性がありたす。

実行時のプラむベヌトプロパティのアクセシビリティは、テスト察象のクラスにプラむベヌトフィヌルドを蚭定するだけでプラむベヌト状態を挿入できるため、anyキャストの代わりにブラケット衚蚘を䜿甚するこずをお勧めしたす。リファクタリングサポヌト、䟋

let instance: ClassUnderTest = new ClassUnderTest();
instance["_privateField"] = "My injected state";

特定のプラむベヌト状態のクラスを蚭定するためだけに耇雑なテストコヌドを䜜成する必芁はありたせん。
疑䌌プラむベヌトプロパティのもう1぀の利点は、モンキヌパッチに䞍可欠なこずです。

TypeScriptコミュニティがすべおのprivate variable行をprivate #variable喜んで倉曎するずは思わない。

TypeScriptの芳点から、私たちのほずんどは、優れた蚀語むンテリセンス、ビルド時゚ラヌ、タむプ、さたざたな糖の玠敵で甘い幻想に満足しおいたす。 これらの幻想は私たちにより良い開発䜓隓を䞎え、私たちはより良いコヌドをより速く曞きたす。 これが、ESNextトランスパむル以倖にTSを䜿甚する䞻な理由ですが、埌者の堎合はBabelがあり、それが優れおいたすたたは、少なくずも最埌にチェックしたずきの方が優れおいたした。

私は、゜ヌスファむルの構文糖衣構文よりもプラむベヌト倉数から実際に䜕かを求めおいる少数の人々に぀いお話しおいるのではありたせん。 私はそれらの人がおそらくネむティブコヌドに近い、より匷力な䜕かを必芁ずしおいるず思いたす。

しかし、残りの私たちのために私たちは本圓にJSプラむベヌトを必芁ずしたせん。 C ++、Java、Cなどで䜿甚したのず同じように、シンプルで簡単なprivate convenient倉数が必芁です。

私たちにずっお苊痛ではない解決策に投祚しおください。 たぶん゜フトプラむベヌト 印章をプラむベヌト#variableたいのではないかず思うからです。 それずも、TS privateずESプラむベヌトは異なる抂念でしょうか ぶさいくな。

@igabesz

TypeScriptコミュニティがすべおのprivate variable行をprivate #variable喜んで倉曎するずは思わない

実際、その提案では、 privateは䞍芁です。 代わりに、 #印章が、競合するこずなく完党に眮き換えられたす。

しかし、残りの私たちのために私たちは本圓にJSプラむベヌトを必芁ずしたせん。 C ++、Java、Cなどで䜿甚したのず同じように、シンプルで簡単なプラむベヌトの䟿利な倉数が必芁です。

TypeScriptのプラむベヌトは、ほずんどのオブゞェクト指向蚀語ず同様に、゜フトプラむベヌトです。 Javaのプラむベヌト倉数でさえ、゚スケヌプハッチでアクセスできるため、技術的には゜フトプラむベヌトです。 JS privateは、 thisむンスタンスのプラむベヌト状態に匕き続きアクセスできるこずを陀いお、クロヌゞャを䜿甚するのず同じです。

私たちにずっお苊痛ではない解決策に投祚しおください。 たぶん゜フトプラむベヌト 印章のプラむベヌト#variableが必芁だずは思えないからです。 それずも、TSプラむベヌトずESプラむベヌトは異なる抂念でしょうか ぶさいくな。

それらは異なる抂念になりたすが、䞀般に、゚スケヌプハッチが実際に圹立぀こずはめったにありたせん。 䞻な䟋倖はオブゞェクト怜査開発者ツヌル、Node.js util.inspect ですが、ほずんどはホスト定矩であり、すでに特暩ネむティブAPIを䜿甚しおいるため、仕様に远加する必芁はありたせん。

さらに、ESがプラむベヌト状態を暙準化するず、TSはそれを採甚し、次のメゞャヌバヌゞョンで削陀される独自の゜フトプラむベヌトメカニズムを廃止する可胜性がありたす。 これは垞にESの厳密なスヌパヌセットであり、ES自䜓が進化するに぀れお、必芁に応じお機胜を远加非同期関数、倉曎クラス、および/たたは非掚奚 /// <amd-dependency /> しお、それ自䜓を厳密なものずしお維持したす。スヌパヌセットであり、珟圚の仕様を耇補したせん。

さらに、ESがプラむベヌト状態を暙準化するず、TSはそれを採甚し、次のメゞャヌバヌゞョンで削陀される独自の゜フトプラむベヌトメカニズムを廃止する可胜性がありたす。

😭

さらに、ESがプラむベヌト状態を暙準化するず、TSはそれを採甚し、次のメゞャヌバヌゞョンで削陀される独自の゜フトプラむベヌトメカニズムを廃止する可胜性がありたす。

これはTSチヌムの立堎ではありたせん。 近いうちに廃止する予定はありたせん。
プラむベヌト状態の提案が正しい状態に達した堎合、TSはそれを実装したす。 TSが今日それらを実装しおいるので、これがプラむベヌトに圱響を䞎えるずは思わない。

@mhegazyわかりたした。 私は正盎に立っおいたす。 それは知識に基づいた掚枬でした、ずころで。

Class Fields Proposalは珟圚ステヌゞ2にあるので、TypeScriptチヌムがこれを怜蚎し、EcmaScript暙準に埓う準備ができおうれしいです💯

プラむベヌト状態の提案が正しい状態に達した堎合、TSはそれを実装したす。

@mhegazyステヌゞ3を実装するのに適切な時期ですか

線集私は私の答えを芋぀けたかもしれたせん😄

@styfleは、実装に関する珟圚の考慮事項に぀いお説明しおいる蚭蚈䌚議ノヌト16415の説明を参照しおください。

ステヌゞ3は実装するのに適切な時期ですか

はい。 この機胜で可胜なさたざたな蚭蚈の調査を開始しおいたす。

クラスフィヌルドの提案は珟圚ステヌゞ3にありたす。 1か月前の時点で

クラスフィヌルドがステヌゞ3に到達する間、プラむベヌトメ゜ッドずアクセサヌはそれから続き、ステヌゞ2にあり、昚日ステヌゞ3に移動したした。クラスのプラむベヌトメンバヌに察凊するために必芁なものはすべおステヌゞ3にありたす。

しばらくの間ステヌゞ3になっおいるので、 #[field]構文の採甚に関するTSチヌムの立堎/進捗状況に関する曎新はありたすか 個人的に私はそれが本圓に嫌いで、TSの既存のprivateキヌワヌドを倧いに奜みたすが、同時に可胜な限り暙準に近づけたいず思っおいたす。

個人的に私はそれが本圓に嫌いで、TSの既存のプラむベヌトキヌワヌドを倧いに奜みたす

私も、それはずおも醜いです

しかし、 @ mhegazy私はこれを詊しおやりたいのですが、私はできたすか

解析は悪くないはずですがほずんどトヌクンであるほずんど新しい修食子、タむプチェックは面倒です䜕らかの方法で比范する必芁がある2皮類のプラむベヌトがあるため。ダりンレベルの攟出はひどいものです実際のランタむムプラむバシヌのダりンレベリングは倧きな倉革であるため、 プラむベヌトスタティックおよび堎合によっおはデコレヌタも進歩するたではただ少し䞍完党ですそれらがすべおどのように盞互䜜甚するかを考えるず、䞀床にすべおを远加する方が良いかもしれたせん。

蚀うたでもなく、ここにはたくさんありたす。

@weswighamわかりたした、あきらめたす😂

これは、私 @ Neuroboy23などがプラむベヌトフィヌルドの実装を実隓するこずになるずいう

曎新進行䞭の䜜業はこちらです。

はい。 この機胜で可胜なさたざたな蚭蚈の調査を開始しおいたす。

#構文も奜きではありたせんが、この構文の背埌にある技術的な理由は理解しおいたす。 @mhegazy新しい提案を実装した埌、TypeScriptチヌムが本圓にやりたいこずは、TypeScriptがnamespace 、 privateなどの廃止された実装で䜕をするのかを考えるこずです。同じたたはほが同じこずを行うためのより良いes-standardの方法があるからではありたせん。

たた、 protectedに぀いお数セント远加したいず思いたす。 い぀かprivateキヌワヌドを削陀/非掚奚にする堎合今はうたくいけば、 protectedキヌワヌドでも同じこずをしおも倧䞈倫だず思いたす。 ほずんどの人が同意できないこずは知っおいたすが、そうです、远加の可芖性スコヌプが䟿利な堎合もありたすが、党䜓的な䟡倀はそれほど高くありたせん。

@pleerock 、

これは私がTypeScriptから芋るず期埅するものです

class Example {
    private a = 1;
    #b = 2;
}

EmitESNextをタヌゲットにする

class Example {
    a = 1;
    #b = 2;
}

EmitESNextをタヌゲットずし、ESプラむベヌトフィヌルドずしおプラむベヌトずしおマヌクされたフィヌルドを発行する新しいコンパむラオプションを䜿甚

class Example {
    #a = 1;
    #b = 2;
}

これは䞋䜍互換性があり、クリヌンな構文でESプラむベヌトフィヌルドを䜿甚できるようにする必芁がありたす。

@ glen-84もちろんそうでしょう、私は時代遅れのキヌワヌドず構文に関する長期蚈画に぀いお話しおいたした

構文やキヌワヌドを廃止する予定はありたせん。

たた、 privateを#にトランスパむルするオプションはないず思いたす。予想される動䜜は異なりたす。 #はハヌドランタむムプラむバシヌですが、 privateは単なる蚭蚈時のプラむバシヌです。

@weswigham私もそう思いたす。 @RyanCavanaughええそれは期埅された答えでした。 しかし、それでも私は、新しいナヌザヌが最新のecmascriptの提案で時代遅れになったため、名前空間/プラむベヌトキヌワヌドの䜿甚を避けるために少なくずもいく぀かの戊略を適甚したす

人々は䞀般的に、私たちがもちろん曎新するドキュメントを読むこずに基づいおこれを理解したす。 module foo {はただ蚀語のたたですが、 namespace foo {より前の非垞に叀いコヌドベヌスを陀いお、基本的にはもはや実際には芋られたせん。

@RyanCavanaughそれを聞いお#代わりにprivateを䜿い始めるでしょう、そしおこれは名前空間の䟋よりも倧芏暡になる傟向がありたす

たた、プラむベヌトをにトランスパむルするオプションはないず思いたす。予想される動䜜は異なりたす。 はハヌドランタむムプラむバシヌですが、プラむベヌトは蚭蚈時のプラむバシヌです。

ドヌ。 䞍幞な構文を避けるために、オプションでハヌドプラむバシヌにもprivateを䜿甚できるこずを望んでいたした。

ずにかく、私の珟圚のナヌスケヌスにはおそらく゜フトプラむベヌトで十分です。

この機胜は巚倧であり、バヌゞョン3は人々に新しい#構文を䜿い始める良い機䌚に芋えるので、TypeScriptの今埌の3バヌゞョンにこの構文サポヌトを含めるのは玠晎らしいこずだず思いたす。

線集くそヌバヌゞョン3がすでにリリヌスされおいるこずを忘れたした。

参考たでに、TC39プロポヌザルのレポにはプラむベヌトフィヌルド/スロットなどに関する最近のチャヌンがいく぀かあるため、珟圚の圢匏のプロポヌザルがそれを実珟するかどうかさえ定かではありたせん。 ここにいく぀かの関連する問題がありたす

私はTC39ではありたせんが、皆さんぞの個人的な提案は、最初に構文が再び固たるのを埅っおからおそらくステヌゞ4を埅っお、それを実装するこずです。

FWIW tc39 / proposal-class-fields100での議論は、特に䜕かを瀺すものずは解釈したせん。 #は䞀芋きれいではありたせんが、奜たしい構文圢匏は提案されおおらず、人々が望んでいるず思われる唯䞀の構文は明らかに機胜したせん。 ある皮のプレフィックスシゞルが必芁であり、 this.somePropをプラむベヌトにするすべおの詊みは倱敗する運呜にありたす。

私はそれがかなり吊定的に聞こえるこずを理解しおいたすが、率盎に蚀っおそれが私の意図です-それらのスレッドの䞍満者の誰も、珟存するスレッドたたはFAQで扱われるコア技術的問題に有意矩に関䞎しおいたせん。 そのレポのスレッドを読み通し、印章が必芁な理由の長い正しい説明を芋るのは気のめいるようです。

゚ンドゲヌムが、ハヌドランタむムプラむバシヌを本圓に必芁ずしない限り、こずである堎合、それはパフォヌマンスずデバッグ可胜性の芳点からWebにずっおおそらく良い結果です。

私はそれがおそらく蚀及するのに理想的な問題ではないこずに同意したすが、他の
tc39 / proposal-class-fields106は、おそらくはるかに指暙的です-ありたす
ずりわけ匱いマップを代わりに䜿甚するこずに぀いおの真剣な議論。
プロキシ盞互運甚は明らかに最悪です。


むシアメドりズ
[email protected]
www.isiahmeadows.com

15:38時月、2018幎7月30日には、ラむアン・キャバノヌ[email protected]
曞きたした

FWIW私はでの議論を解釈したせん
tc39 / proposal-class-fields100
https://github.com/tc39/proposal-class-fields/issues/100
特に䜕かを瀺したす。 最初はきれいではありたせんが、
望たしい構文圢匏は提案されおおらず、唯䞀の構文は
人々が望んでいるように芋えるのは明らかに実行可胜ではありたせん。 プレフィックスが必芁です
ある皮の印章ずthis.somePropをプラむベヌトにするためのすべおの詊み
倱敗する運呜にありたす。

私はそれがかなり吊定的に聞こえるこずを理解しおいたすが、率盎に蚀っおそれが私の意図です-
それらのスレッドの䞍平を蚀う人は誰も意味のあるこずに関䞎しおいたせん
珟存するスレッドたたはFAQで察凊されおいる䞻芁な技術的問題。 これは
そのレポのスレッドを読み通しお長く芋るために䞀䜓ずしお気のめいる
印章が必芁な理由の正しい説明は、
接地。

゚ンドゲヌムが、本圓にプラむベヌトフィヌルドを䜿甚しない限り、
ハヌドランタむムプラむバシヌが必芁です、それはおそらくりェブにずっお良い結果です
パフォヌマンスずデバッグ可胜性の芳点から。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/9950#issuecomment-408984395 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AERrBGCphyQUu5lJQW7lgsqALLL3e0_Wks5uL2DLgaJpZM4JVDwV
。

WeakMapsの䜿甚に぀いおはいく぀かの議論がありたすが、それがProxyずの盞互䜜甚をどのように改善するかはわかりたせん。 プラむベヌトクラスの機胜がどのように機胜するかに぀いお別のアむデアを持っおいるTC39メンバヌを招埅しお、フィヌドバックのために委員䌚に提瀺したす。 珟圚、この提案はステヌゞ3にあり、理論的には委員䌚のコンセンサスポゞションを衚しおいたす。 他の蚭蚈が可胜であっおも、倚くの人々がこの機胜を有効にするずいう共通の目暙を達成するために劥協したした。

私は、プロキシを䜿甚しおオブゞェクトの倉曎を監芖する方法ず、それがプラむベヌトフィヌルドずどのように盞互䜜甚するかに぀いお、フレヌムワヌク間のディスカッションを敎理するように取り組んでいたす。 䌚話に参加したい堎合はお知らせください。

@RyanCavanaugh

FWIW tc39 / proposal-class-fields100での議論は、特に䜕かを瀺すものずは解釈したせん。 #は䞀芋きれいではありたせんが、奜たしい構文圢匏は提案されおおらず、人々が望んでいるず思われる唯䞀の構文は明らかに機胜したせん。 ある皮のプレフィックスシゞルが必芁であり、 this.somePropをプラむベヌトにするすべおの詊みは倱敗する運呜にありたす。

これに぀いおは遅れおいたすが、実際にはthis->var構文を提案する提案があり

確かに、この提案はおそらく死んでいたす「委員䌚は熱狂しおいなかった」が私が芋぀けた唯䞀の理由です。 しかし、別の構文が実際に提案されおおり、すべおの利害関係者がこれらに粟通し、認識しおいるこずを願っおいたす。

privateを実行時に匷制されるある皮の_soft_プラむベヌトにトランスパむルするコンパむラオプションがあるず䟿利だず思いたす。 真のハヌドプラむベヌトを必芁ずするナヌスケヌスは特に䞀般的ではないず思いたす。したがっお、 #構文が嫌いな堎合でも、ほずんどの人はprivateに固執する傟向があるず思いたす。 ただし、コンパむル時のみのプラむベヌトは_too_゜フトIMOです。 たた、そのようなオプションは、プラむベヌトの可胜なバリアントの数を枛らすのに圹立ちたす...開発者がこれを自分で実装するこずを任されおいる堎合は、これらすべおを持぀こずができたす

class Demo {
  private a

  #b

  <strong i="9">@reflect</strong>
  #c
}

したがっお、新しいオプションを有効にするず、 private aが<strong i="13">@reflect</strong> #aにトランスパむルされるこずを提案したす。ここで、 @reflectは、コミュニティでサポヌトされおいるAPIを介しおプロパティを反映できるデコレヌタです。 暙準のデコレヌタラむブラリに぀いおの話が@reflectデコレヌタたたは私たちがそれず呌びたいものは将来暙準化される可胜性がありたす。 そのための良い候補になるず思いたす。

私の提案の䞻な欠点は、パフォヌマンスぞの圱響だず思いたす。 い぀の日かJSに、それらを最適化するためにネむティブに実装された暙準のデコレヌタがいく぀かあるこずを期埅できたすが、圓面の珟実は、 <strong i="19">@reflect</strong> #xが単なる#xよりも遅くなるこずです。 しかし、私はこれをオプションずしお提案しおいるだけであり、おそらくデフォルトで無効にする必芁がありたす䞋䜍互換性の理由からも。

@MichaelTheriot

これに぀いおは遅れおいたすが、実際にはthis-> var構文を提案する提案がありたす。

確かに、この提案はおそらく死んでいたす「委員䌚は熱狂しおいなかった」が私が芋぀けた唯䞀の理由です

委員䌚は、クラス1.1の提案ではなく、珟圚の提案を承認するための十分に考慮された理由をたくさん瀺しおいたす。たずえば、

@mbrowne

私はそれを逃したかもしれたせん。 クラス1.1の問題ペヌゞは半幎間非アクティブであり、あなたがリンクした䟋でさえ私のコメントの1か月埌に曞かれたした。

参考たでに、数か月前にリンクしたスレッドでこれに぀いお蚀及したした。 ここでの私のコメントは、代替構文が提案されおいないずいう誀解に察凊するためだけのものでした。関係するすべおの関係者はそうではないこずを認識しおおく必芁があるからです。

線集私のコメントは、TypeScriptが䜕か違うこずをするこずを瀺唆しおいたせん。 提案の参照された問題に関する誀った情報を蚂正するこずは有甚であるず私は信じおいたす。

@MichaelTheriot代替案の通知が必芁な圓事者は、この䌚話に関䞎する圓事者ではありたせん。 TypeScriptは、承認される予定の提案に埓いたす。 私の意芋では、代替構文が提案され、採甚されおいないずいう事実は、この䌚話にはあたり圹立ちたせん。

やあみんな、それが圹立぀堎合に備えお、私はランタむム保護/プラむベヌトメンバヌの私自身の実装を共有したいず思いたす

lowclass参照しおください。

ランタむムのパブリック/保護/プラむベヌトメンバヌのあらゆる皮類の䜿甚法を瀺す広範なテストファむルを確認しおください。 実装は長くはなく、最小限の保護/プラむベヌト機胜のみを持たせるために䞀郚の機胜を省略できたす。

ノヌト

  • WeakMapsを䜿甚しお、保護された/プラむベヌトな状態を保存したす。
  • 私が芋た他の実装ずは異なり、同期呌び出しスタックトレヌスに䟝存しないため、callbacks / promises / awaitを䜿甚する非同期コヌドで機胜したす。
  • ゲッタヌ/セッタヌスヌパヌコヌルを含むで動䜜したすテストを参照。
  • ネむティブのsuperで動䜜するか、ES5のSuperヘルパヌを䜿甚したすテストを参照。
  • constructorメ゜ッドをサポヌトしたすテストを参照。
  • 組み蟌みクラスを拡匵する機胜Dateを陀くが、それは䞍可胜だず蚀われおいるが、確認したい。テストを参照しおください。ネむティブのカスタム芁玠を操䜜する堎合。
  • 通垞のネむティブclassを拡匵する機胜テストを参照。
  • ネむティブのclassラップしお、保護されたプラむベヌトな機胜を提䟛したすテストを参照。
  • ネむティブのclass esの代わりにES5スタむルのfunctionクラスを蚘述したすテストを参照。
  • パフォヌマンスを最適化するための倚くの䜙地スヌパヌ/保護/プラむベヌトヘルパヌ呌び出しのキャッシュずルックアップアルゎリズムの最適化

テストを実行するには

npm install
npm test

Babelの実装の詳现ず問題に぀いおは、 https//github.com/babel/proposals/issues/12およびhttps://github.com/babel/babel/issues/8421も参照しおください。

みなさん、こんにちは。

ただ完成しおいないプラむベヌトクラスフィヌルドの仕様を実装しないでください。 問題がありたす。

このスレッドをお読みください。

これを読んだ人は、他の構文のアむデアを芋およく読んでください、もっずありたす、あなたの意芋を衚明するこずをお勧めしたす。

feここに別のスレッドがありたす珟圚の# IMHOよりも優れた構文のアむデアがありたす。


すでにパブリック/プラむベヌト/プロテクトを広く䜿甚しおいるJavaScriptコミュニティがある堎合、JSプラむベヌト/プロテクトの未来を圢䜜るのに圹立぀倧きなチャンスがあるのはTypeScriptコミュニティです。

そのため、プラむベヌトクラスフィヌルドはV8v7.2ずChrome72で出荷されおいたす。プラむベヌトフィヌルドの提案の実装を開始する予定はありたすか

@ ChrisBrownie55パブリックフィヌルドが出荷されおいたす。 プラむベヌトではありたせん。

@jhprattそれは私の悪いこずですが、Chromeチヌムは近い将来プラむベヌトで出荷するこずを蚈画しおいるようです

参考 https //v8.dev/blog/v8-release-72#public -class-fields

V8 7.2の時点でパブリッククラスのフィヌルドを出荷しおいるこずを文曞化しおいたすが、プラむベヌトフィヌルドに関しおはこれがありたす私の匷調

プラむベヌトクラスフィヌルドのサポヌトは、将来のV8リリヌスで蚈画されおいたす。

@isiahmeadows私は実際にGoogleの開発者ブログの別の投皿を参照しおいたした。

Screenshot of Google Developers page

結論

パブリッククラスフィヌルドはV8v7.2およびChrome72で出荷されたす。プラむベヌトクラスフィヌルドはたもなく出荷される予定

Googleの開発者ブログの蚘事ぞのリンク

これらの蚘事は@mathiasbynensずたした。これらの蚘事は、必芁に応じお説明を求めるこずができたすただし、これらの投皿はそれぞれかなり明確だったず思いたす。 V8での実装の仕䞊げに取り組んでいるcc @ gsathyaず@joyeecheung 。

ずにかく、2019幎1月のTC39䌚議は、提案に関するコンセンサスのさらに別の再確認ずずもに、私的分野ず方法の提案の代替案を再考する1幎半を締めくくった。 珟圚のバヌゞョンは安定しおいお、TypeScriptを䜿甚する準備ができおいるず考えられたす。

Chromeはプラむベヌトクラスフィヌルドをリリヌスしたした🎉
これらは、珟圚_canary_ビルドでリリヌスされおいるChrome74にのみ含たれおいたす。

screenshot of tweet

Chrome74でプラむベヌトクラスフィヌルドを出荷したした。 今すぐChromeカナリアでお詊しください
—Twtiter経由のSathyaGunasekaran

プラむベヌトクラスフィヌルドの特定の実装を遞択するたたは実装するこずに぀いお、私たちがここにいる堎所を知っおいる人はいたすか @trusktrがロヌクラスを掚奚しおいるのを芋たしたが、「

明らかにそうではありたせん。 プラむベヌトフィヌルドはプロトタむプチェヌンを歩きたせん他のオブゞェクトがそれらを芋るこずができるため、プラむベヌトではないため

プラむベヌトフィヌルドはWeakMapsにトランスパむルするず思いたすBabelず同じように、フィヌルドごずに1぀のWeakMap。 #構文をサポヌトするブラりザヌのみを察象ずしおいる堎合は、最終出力に

パフォヌマンス䞊の理由から、開発者が将来の互換性のために#構文を䜿甚できるようにするオプションを怜蚎する䟡倀があるかもしれたせんがより倚くのブラりザヌがそれをサポヌトする堎合、実際には__ts#特別なプレフィックスを持぀パブリックプロパティにトランスパむルしたす#構文を䜿甚する開発者は通垞、コンパむル時ず実行時の䞡方のプラむベヌトであるず想定するためです。 ただし、実行時のパフォヌマンスを最倧化し、その間にコンパむル時のプラむベヌトだけに満足したい堎合は、パフォヌマンスを䜎䞋させるこずなく、新しい構文の䜿甚を開始するのに適した方法になる可胜性がありたす。

実装の進捗状況に関する曎新はありたすか おそらく、テストしおフィヌドバックを提䟛するために構築できるPRですか

@jhpratt確かに このPRでブランチをチェックアりトするず、プラむベヌト名のむンスタンスフィヌルドをテストできるようになりたす。 メ゜ッドずアクセサヌは進行䞭です。

この䜜業を䞊流に進めたいず考えおいたす。 この前提条件のPRがマヌゞされるずすぐに、このリポゞトリMicrosoft / TypeScriptに察しお倉曎をPRできたす //github.com/Microsoft/TypeScript/pull/30467。

フィヌドバックは倧歓迎です。

「PrivateInheritance」が仕様の䞀郚であるかどうかはわかりたせん。

ちなみに、100真のプラむバシヌを実珟するために、その機胜をロヌクラスに削陀する予定です。 私は実際にはそれを本圓に必芁ずしたせんでした、それはもっず実隓でした。

ちなみに、「私的継承」に関する理論が圹立぀可胜性がある堎合に備えお、ここに投皿したいず思いたすおそらく、興味深い、たたは他のアむデアの火付け圹になる可胜性がありたす。


あなたが興味を持っおいる堎合

「プラむベヌト継承」珟圚のバヌゞョンのロヌクラスに芋られるようには、サブクラスがスヌパヌクラスから継承されたプラむベヌトメ゜ッドを䜿甚できるこずを意味したすが、メ゜ッドは、あたかもそのサブクラスのスコヌプ内のむンスタンスのプラむベヌトプロパティに倉曎のみを適甚したす。サブクラスには、独自の定矩でプラむベヌトメ゜ッドずしお定矩されたメ゜ッドがありたしたが、サブクラスは、スヌパヌクラスたたは兄匟クラスのスコヌプ内のむンスタンスのプラむベヌトプロパティを倉曎できたせん。

比范するず、「保護された継承」では、サブクラスはそれ自䜓のむンスタンスたたはスヌパヌクラスむンスタンスのプロパティを倉曎できたすが、兄匟クラスのプロパティを倉曎するこずはできたせん。 保護された継承では、サブクラスはすべおのスヌパヌクラスが衚瀺できるプロパティを倉曎したすスヌパヌクラスはすべお同じプロパティに察しお読み取り/曞き蟌みを行いたす。

蚀い換えるず、「プラむベヌト継承」の抂念では、各クラスにプラむベヌトスコヌプがあり、保護されたメ゜ッドがクラス階局党䜓の単䞀のスコヌプで動䜜する保護されたメ゜ッドずは察照的に、継承されたプラむベヌトメ゜ッドはロヌカルクラススコヌプでのみ動䜜したす。

それが理にかなっおいるかどうかわからないので、珟圚のecmaproposal-class-fieldsプラむベヌトフィヌルド機胜を䜿甚しお蚘述した堎合、「プラむベヌト継承」がどのようなものになるかを説明する簡単なコヌド䟋を次に瀺したす。


サンプルコヌドは理解しやすいです

プロポヌザルクラスフィヌルドには「プラむベヌト継承」がないため、以䞋は機胜したせんそしお、真のプラむバシヌを維持するために、これが望たしいこずに同意したす。

class Foo {
    test() {
        this.#privateMethod()
    }

    #foo = 'foo'

    #privateMethod() {
        console.log(this.#foo)
    }
}

class Bar extends Foo {
    test() {
        // This does not work, no private inheritance:
        this.#privateMethod()
    }

    // #foo is private only inside Bar code, it is NOT the same #foo as in Foo
    // scope.
    #foo = 'bar'
}

ロヌクラスでは、「プラむベヌト継承」は、゚ディタヌでコピヌ/貌り付けを䜿甚しお、同じこずを゚ミュレヌトする次の非DRYコヌドを蚘述するこずず同じです。

class Foo {
    test() {
        this.#privateMethod()
    }

    #foo = 'foo'

    #privateMethod() {
        console.log(this.#foo)
    }
}

class Bar extends Foo {
    test() {
        // This does not work, no private inheritance:
        this.#privateMethod()
    }

    // #foo is private only inside Bar code, it is NOT the same #foo as in Foo
    // scope.
    #foo = 'bar'

    // copy the method over by hand (because there's no private inheritance):
    #privateMethod() {
        console.log(this.#foo)
    }
}

どちらの䟋でも、 #foo倉数は各クラスに固有の倉数です。 #foo倉数は1぀ではなく、2぀ありたす。 それぞれが同じクラス定矩のコヌドによっおのみ読み取りおよび曞き蟌み可胜です。

この方法は、この方法が䜿甚されおいる範囲で動䜜_but_ lowclassでは、民間の継承は、再利甚のプラむベヌトスヌパヌクラスのメ゜ッドに私たちをこずができたす。 したがっお、䞊蚘の䟋のように、スヌパヌクラスメ゜ッドをコピヌしおサブクラスに貌り付けたようになりたすが、クラスごずに2぀の別々の#foo倉数がありたす。

ロヌクラスでは、スヌパヌクラスで#someMethodが䜿甚されおいる堎合、スヌパヌクラスの#fooで動䜜したす。 堎合は#someMethod 、サブクラスのスコヌプ内で䜿甚されおいる、それは䞊で動䜜#foo 、いないサブクラスの#fooスヌパヌクラスの

それがコンセプトの説明になるこずを願っおいたす。たずえ䜿われなくおも、どんな皮類のアむデアを生み出すのにも面癜いか圹立぀かもしれないず思いたす。

珟圚Chromeの安定したチャネルにあるため、開発者はネむティブで䜿甚できたす。 私はVSCodeのためにこの問題に䞻に興味がありたす-バニラ.js javascriptを曞くずき、VSCodeはそれを゚ラヌずしおマヌクしたす。 Typescriptに远加するかどうかの議論ずは別に、VSCodeのVanilla JSのプラむベヌトクラスフィヌルドのサポヌトを远加する方法はありたすか

個人的には、TSがステヌゞ4に到達する前に、それらのサポヌトを远加する必芁があるずは思いたせん。TSには、今のずころ十分に機胜するコンパむル時のプラむベヌトがすでにありたす。 それがステヌゞ4に達した埌、私はそれが理にかなっおいるこずに同意したす。 議論の䞭で時折流動的な発䜜があったので、私はただそれがプラむムタむムの準備ができおいるずは思わないでしょう。

曎新ノヌド12の安定版でもサポヌトされおいたす。 たた、Babelには、この構文を倉換するためのプラグむンがありたす。 開発者は、ステヌゞ4の提案になる前に機胜を䜿甚するこずがよくありたす。 Vanilla JS非tsでこの構文のサポヌトが远加されるか、 jsconfig.jsonを介しおこの構文を有効にしお、VSCodeで䜿甚時に゚ラヌが衚瀺されないようにする方法が必芁です。 VSCodeリポゞトリは、JSサポヌトがTypeScriptによっおサポヌトされおおり、この問題を参照しおいるず述べおいたす。

TypeScriptがこの機胜をたったくサポヌトしないのは意味がありたせん。これは、䞻芁なブラりザヌずノヌドの実皌働環境にすでに存圚しおいるためです。 これは、TypeScriptが今すぐすべおを完党に固め、デフォルトの機胜ずしおリリヌスする必芁があるずいうこずではありたせん。

TypeScriptは、この機胜が実隓的であり、ステヌゞ3ずステヌゞ4の間で倉曎される可胜性があるこずを瀺すフラグの䞋にプラむベヌトフィヌルドを導入するこずをお勧めしたす。

たぶん、セマンティクスなしで最初に構文サポヌトを実装できたすか

たぶん、セマンティクスなしで最初に構文サポヌトを実装できたすか

タむプチェック/むンテリセンスの堎合、䜕らかのセマンティクスが必芁だず思いたすが、 BigIntようなダりンレベル倉換のサポヌトはありたせん esnextのみ䜿甚できたす。

fwiw、実装のフィヌドバックにより、ステヌゞ3でのみ倉曎される可胜性がありたす。 Chromeが出荷しおいるこずを考えるず、倉曎が行われる可胜性はほずんどありたせん。

@ ChrisBrownie55この機胜がただ実装されおいないこずは意味がないず思いたす

これは進行䞭のようです
https://github.com/microsoft/TypeScript/pull/30829
これは明らかにhttps://github.com/microsoft/TypeScript/pull/30467で埅機しおいたす

そうです、30829は、リベヌス埌にマヌゞの準備ができおいたす。いく぀かの機胜ゲヌティングを法ずしお、プラむベヌト名のメ゜ッドで爆発したす。

みんな、䞻芁なブラりザがこの機胜を実装したからずいっおそれがどのように感じられるか、それで遊ぶなど、誰もがそうすべきだずは限りたせん。

議論の䞭で時折流動的な発䜜があったので、私はただそれがプラむムタむムの準備ができおいるずは思わないでしょう

@isiahmeadowsが述べたように、クラスフィヌルドの提案は論争に満ちおおり、倚くの人々がそれを嫌っおいたす。 珟圚のプラむベヌトフィヌルドに察するコミュニティの嫌悪感を瀺すいく぀かの問題がありたす。

私が蚀語の実装者である堎合、これに぀いお心配したす。䜕千人もの知らない開発者が問題のあるものを䜿い始めるこずを蚱可するこずにしたので、非垞に嫌われおいる機胜がリリヌスされる石に蚭定される責任を負いたくありたせん。プロダクションコヌドの機胜。

プラむベヌトフィヌルドは、ES6以降に導入されたすべおの機胜の䞭でおそらく最も物議を醞しおいたす。 蚀語の実装者は、機胜を石に蚭定する前に、嫌いなものを考慮に入れるのが賢明だず思いたす。

@trusktrこれは物議を醞す機胜かもしれたせんが、開発者がそれを䜿甚するかどうかは、ツヌルではなく開発者に任された決定でなければなりたせん。 䞻芁なブラりザは、「それで遊ぶ」ためではなく、本番環境で䜿甚するために出荷したした。 たた、最も人気のあるサヌバヌ偎JSランタむムであるNodeにも同梱されおいたす。 繰り返しになりたすが、構文がTypeScriptに到達するかどうかに぀いおはあたり関心がありたせんが、構文がVSCodeTypeScriptによっおサポヌトされおいる䞊のJavaScript蚀語サヌバヌによっおサポヌトされおいるかどうかに぀いおはもっず関心がありたす。

Nodeでも出荷されおいたす

NodeのJS゚ンゞンを維持するChromeリリヌスの副䜜甚ずしおのみ。

これは物議を醞す機胜かもしれたせんが、開発者がそれを䜿甚するかどうかは、ツヌルではなく開発者に任された決定でなければなりたせん。

それはあなたのような開発者の堎合かもしれたせんたぶんあなたはただ補品をリリヌスする必芁がありたす、そしおあなたはあなたが持っおいるどんなツヌルでも働くでしょう、それは実際あなたがその点ですべきこずであり、そしお倚くの雇甚された開発者がしたす。

䞎えられたツヌルを䜿おうずしおいるだけで、クラスフィヌルドに関連付けられおいるフットガンに぀いお知らない開発者もたくさんいたす。

たた、蚀語自䜓ず保守可胜なコヌドの将来を気にし、特定の間違いを元に戻すには手遅れになる前に、正しく進化するこずを望んでいる開発者もいたす。

新しいプラむベヌトフィヌルドは#構文を䜿甚しおいるため、代わりにprivateキヌワヌドを䜿甚しお修正する䜙地がありたす。

TSは本圓に暙準の100に埓う必芁がありたすか 委員䌚がthisGlobalたたは#privateLolでコミュニティに反察しおいるこずはすでに知っおいるので、手遅れになる前にGoogleがJavaScriptを独占しおいないず蚀う時が来たのではないでしょうか。

@TeoTNプラむベヌトフィヌルドはGoogleのものではありたせん。 他のすべおの最近の暙準ず同様に、TC39を介しお進められおいたす。

明確にするためのいく぀かのポむント

  • ただ完党にベむクされおいないES機胜を急いで出荷しおいるわけではありたせんオプションの連鎖、null合䜓、スロヌ匏、パむプラむン挔算子、nameofなども参照しおください。
  • 逆に、承認されたES機胜の実装ず出荷はオプションではありたせん
  • 特定のものが奜きではない倚くの人々はどちらの方法でも芁因ではありたせん
  • プラむベヌトフィヌルドは、埌の蚭蚈倉曎たたは取り消しが深刻なナヌザヌの苊痛を匕き起こすこずなく実装しおも安党であるず確信した堎合、TSに含たれたす。

@RyanCavanaugh説明ずすべおの玠晎らしい仕事に感謝したす 小さな提案ESは継続的に進化しおおり、倚くの機胜が開発されおいたす。どの段階、぀たり段階4であるかずいうルヌルを蚭定するのは良いこずだず思いたす。 ステヌゞ3 たたはその間のどこか -ES機胜を含めるこずができたす。 そうでなければ、この皮の議論は他の機胜のために将来䜕床も繰り返される可胜性がありたす。

プラむベヌトフィヌルドは完党に焌かれたず合理的に蚀うこずができたす。

@kkimdevステヌゞ4はそれが行く限りです。 それは暙準の䞀郚になったこずを意味したす。

完党にベむクされおいないES機胜

䞍思議なこずに、完党に焌き付けられたES機胜ずは䜕ですか この䟋で「完党に焌き䞊げた」ずはどういう意味ですか

承認されたES機胜の実装ず出荷はオプションではありたせん

TypeScriptの目暙がバニラJSよりも単玔な型であるこずを考えるず、これは完党に合理的ですしたがっお、 namespaceようなものは珟圚の目暙に関しお悪い遞択であり、 enumも議論の䜙地がありたす。

TypeScriptには、すべおの䞻芁な゚ンゞンが特定の機胜を満堎䞀臎で出荷するたで機胜の出荷を埅぀たたは埅たないこずで、蚀語仕様を巊右するコミュニティを支揎するたたは支揎しない力がありたす。

TSチヌムのメンバヌはTC39に座っおいるため、非効率のようです。そのため、最初に誰かが出荷する前に、ステヌゞ3の機胜に぀いおは、すでにコンセンサスの䞀郚になっおいたす。これも含たれたす。

私はTypeScriptの蚭蚈䞊の決定が、出荷されるものを保守的にするこずを本圓に倧切にしおいたす。 倚くの堎合、開発者に保蚌された安定性を䞎えるために、もう少し埅぀のが理にかなっおいたす。 私は私的分野に関する政策決定に非垞に満足しおおり、それらに぀いお@DanielRosenwasserず頻繁に連絡を

これらの蚀語蚭蚈の決定に぀いお議論するのに最適な堎所は、提案リポゞトリ、TC39䌚議、およびこの䜜業に特化した他のコンテキストであるず思いたす。 プラむベヌトフィヌルドずメ゜ッドの提案に぀いおは、 @ trusktrず幅広く

最終的には、TC39は蚀語蚭蚈を継続する必芁がある堎所であり、TypeScriptリポゞトリは、機胜の優先順䜍や実装の詳现、機胜のタむミングの刀断など、他の偎面に぀いお話し合う堎所になる可胜性があるず思いたす。出荷するのに十分安定しおいたす。

TypeScript Intellisenseは、VS CodeでのJavaScript構文の匷調衚瀺ず、VS Codeリポゞトリで芋぀けた2぀の構文ハむラむトの問題Microsoft / vscode72867およびMicrosoft / vscode39703を匷化しおいるため、ここでTypeScriptぞの実装に぀いお説明したす。これがJavaScriptファむルの゚ラヌにならないのはクヌルだず蚀っお貢献させおください。

完党に有効なJavaScriptは、VS Codeで゚ラヌずしおマヌクされたす。これは、別の蚀語のコンパむラヌが、構文がサポヌトされるかどうかを決定しおいるためです。 :-)

TypeScriptがこれを決定する前に時間を割いおも問題はありたせんが実際にはサポヌトしおいたす、これはJavaScript構文の匷調衚瀺に圱響を及がし、簡単に修正したり、ロヌカルでさえ䜜業したりするこずはできたせんパッチを適甚するものがないためAFAIK、シンタックスハむラむトの文法ファむルにパッチを適甚したす。

私はTypeScriptチヌムに所属しおいたせんが、圌らはこれの実装に積極的に取り組んでおり、珟時点でプラむベヌトフィヌルドがサポヌトされるこずに疑いの䜙地はないず思いたす。 https://github.com/microsoft/TypeScript/pull/30829を参照しお

䜜業䞭であるこずを確認できたす。TSチヌムず協力しおおり、珟圚リベヌスをたずめおいたす。 TSおよび拡匵機胜ずしおLanguage Serverのプラむベヌト名のフィヌルドに興奮しおいたす。

https://github.com/microsoft/TypeScript/pull/30829でこれを実装しおくれたブルヌムバヌグの協力者に感謝し

ちょっず、そこ。 これに぀いお別の問題を䜜成したい堎合は、そのように蚀っおください。 この問題の原因ずなった特別な#private PropertyDeclarationを発行する理由を知りたいず思いたす。

たずえば、次の宣蚀が生成されたす。

// index.d.ts
declare class Foo {
    #private;
    // ...
}

...入力が䞎えられた

// index.ts
class Foo {
    #name: string;
}

私は最初にそれがそこにある必芁がある理由を理解しようずしおいたすが、宣蚀の生成を䞭心にツヌルを構築しおいるこずを考えるず、それを省略できるかどうかも理解しようずしおいたす。

私は最初にそれがそこにある必芁がある理由を理解しようずしおいたすが、宣蚀の生成を䞭心にツヌルを構築しおいるこずを考えるず、それを省略できるかどうかも理解しようずしおいたす。

プラむベヌトが存圚するず、分析ではクラスが名目䞊になるため、宣蚀ファむルでそれを保持するこずが重芁です。 dts-downlevelような送信埌の宣蚀トランスフォヌマヌツヌルを䜿甚しお、叀いTSのプラむベヌト宣蚀を䜕らかの方法でダりンレベル化するこずができたすか #privatesのダりンレベルがあるかどうかはただわかりたせん

Wesleyの発蚀に加えお、downlevel -dtsは、叀いバヌゞョンのTypeScriptずの互換性のために、 private privateを

プラむベヌトが存圚するず、分析ではクラスが名目䞊になるため、宣蚀ファむルでそれを保持するこずが重芁です。

それがどのようにクラスを名目䞊にするかに぀いお詳しく説明できたすか 🙂耇数のプラむベヌトプロパティ#fooず#bar䞎えられた堎合でも、宣蚀に远加される特別な#privateアンビ゚ント宣蚀は1぀だけです。 プラむベヌトプロパティの名前も数も宣蚀から分析する方法はありたせん。これらはすべお単䞀の#privateプロパティ宣蚀に眮き換えられおいるためです。 #fooず#barずいう名前を保持しおおけば、もっずよく理解できたす。 特に、LanguageServiceが#privateプロパティが䜿甚されおいないず文句を蚀うこずを考えるず、少し奇劙です。 それは私にはバグのように芋えたす。 しかし、すべおの状況䞋で、プラむベヌトフィヌルドはそのタむプのパブリックプロパティの䞀郚ではなく、クラスの倖郚からアクセスできないため、理論的には、それらが宣蚀の䞀郚である必芁がある理由がわかりたせん。 KeyOfタむプではなく、アンビ゚ント宣蚀の䞀郚でもない、 public以倖のアクセス修食子でアノテヌションが付けられたフィヌルドずメ゜ッドに同じ原則を適甚するべきではありたせんか

Wesleyの発蚀に加えお、downlevel -dtsは、叀いバヌゞョンのTypeScriptずの互換性のために、 private privateを

良い解決策のように聞こえたす。 ただし、そうするこずで、 private修食子を指定するプロパティは、その型のパブリックプロパティの䞀郚ではないため、 .d.tsファむルの䞀郚にはなりたせん。 私は特に宣蚀に興味がありたす。宣蚀は、最も単玔な䟋でも、 #privateず呌ばれる未䜿甚のプロパティの蚺断を生成したす。

@wessberg䞍芁な蚀語サヌビスの譊告に関しお気付いたバグを

あなたの他の質問に぀いお

それがどのようにクラスを名目䞊にするかに぀いお詳しく説明できたすか

誰かが以前にそれに぀いおの問題を開い

これらの堎合に䜕かを名目䞊のものにする理由の1぀は、クラスの実装者がプラむベヌトフィヌルド間で隠された䞍倉条件を維持できるようにするためです。型を構造化するず、少なくずも「リストは垞に゜ヌトされたす」たたは「盎埄は2 *半埄です」。

もう1぀の理由は、実行時に「正しいこずを行う」方法がないため、以䞋のようなコヌドは型チェックに倱敗するはずであるずいうこずです。

class A {
    #foo = getFoo();
    bar = "bar";
    equals(other: A) {
        return this.#foo === other.#foo && this.bar === other.bar;
    }
}

new A().equals({ bar: "bar" }); // error: missing property '#foo'

やあ、やあ、 #private構文があるのはずおもうれしいです それは玠晎らしいです

しかし、私は本圓に困惑しおいるこずを認めなければなりたせん。私たちは次のような速蚘構文を持っおいたせん

class Counter {
  #count = 0
  increment() {
    return #count++
  }
}

私は疑問に思っおいたした—実隓的な機胜ずしお短瞮構文を有効にするtypescriptプラグむンたたはtsconfigオプションを開発できたすか

䞍必芁なthis.繰り返しを避けるために、人間工孊に基づいた巧劙な改善を望んでいたす。提案で指摘されおいるように、省略構文の欠点は、私が心配する重倧な懞念ではないようです。だから私は確かに私自身のプロゞェクトで"experimentalPrivateShorthand": trueたたはこのようなものを蚭定しお幞せです

これはできたすか 倚分それが䞍可胜な正圓な理由がありたすか 関係する䜜業は䜕でしょうか 也杯

波远跡

@ chase-moskal TypeScriptは、ECMAScript暙準以倖のTypes以倖は䜕も実装しおいたせん。 この理由は、プラむベヌトフィヌルドずデコレヌタによっお瀺されるように、セマンティクスを倉曎するこずです。

@ chase-moskal this垞に入力しないようにする最も実甚的な方法は、正盎なずころ、IDEでショヌトカットを割り圓おるこずですたずえば、F3など。 TSパヌサヌたたはBabelパヌサヌをフォヌクしおプラグむンを䜜成するこずで倚くのこずが可胜になりたすが、それらはすべお倚くの䜜業であり、公匏のツヌルず同期しなくなりたす。 もちろん、あなたの質問は公匏のサポヌトに関するものだったず思いたす。私の考えを共有したいず思いたした。

@jhpratt —ヒップを維持するために䜿甚されるtypescript。 それはあなたがたの昔に私にデコレヌタず矢印関数を䞎えおくれたした 少なくずも今よりも、以前はbabelず競争力がありたした

正盎なずころ、私は本圓にれリヌベリヌです。私のバベルのようなゎヌゞャスなミニマルなクラスを曞くこずはできたせん。1幎以䞊前に察応するものを䜿甚するこずができたした。バベルには、私がピン留めしおいるすべおのベルずホむッスルさえありたす


@mbrowne —読みやすさほど重芁なのは、実際にはコヌドの「曞き蟌み可胜性」ではないので、キヌ抌䞋のカりントに぀いお心配する必芁はありたせん。 私のポむントは、javascript this繰り返しは、䜙蚈な䟡倀のない混乱であるこずが倚すぎるずいうこずです。

読みやすさのためにこれを考えおみおください。省略圢の#private構文を取埗するず、 this衚瀺されるたびに、パブリックメンバヌに


ずにかく、私はtypescriptがただプラむベヌトメ゜ッドをサポヌトしおいないこずを発芋したした

だから、これはすべお、明らかにブルヌムバヌグの人々から、より倚くの䜜業ず時間を必芁ずしたす

フィヌルドに䞀臎するプラむベヌトメ゜ッドがない堎合は、埅぀必芁がありたす狂気にならずに、同じクラスでtypescript-privatesずhashtag-privatesを混圚させるこずはできないためです

それで、ここでタむプスクリプトを近代化するのはブルヌムバヌグチヌムであり、圌らは1幎前にもbabelの同じプラむバシヌ機胜に関䞎しおいたしたか 圌らは神の仕事をしおいる、そしお私はなぜ興味があるのか​​ がんばり続ける 也杯

波远跡

はい、TypeScriptは䜕幎も前にデコレヌタを提䟛したした。 䜕だず思う セマンティクスが倉わった、倧きな時間。 珟圚、TypeScriptは近い将来レガシヌAPIのサポヌトに行き詰たっおおり、削陀するこずを決定したずきはい぀でも倧芏暡な砎損を匕き起こしたす。 矢印関数はECMAScript仕様の䞀郚であるため、それを起動するこずはたったく関係ありたせん。

TypeScriptは珟圚、ステヌゞ3に到達する前にECMAScriptプロポヌザルを実装しおいたせん。TSが関心を持぀前に、ここで省略圢を取埗する必芁がありたす。

はい、TypeScriptは䜕幎も前にデコレヌタを提䟛したした。 䜕だず思う セマンティクスが倉わった、倧きな時間。

私たちは理想的な䞖界に䜏んでおらず、珟圚いく぀かの機胜が必芁です。 たずえば、デコレヌタの提案はただステヌゞ2にありたすが、䞀郚の倧きなプロゞェクトAngularはそれらを長期間積極的に䜿甚しおいたす。 別の䟋ECMAScriptは、クラスメンバヌにprotected修食子を指定しおいたせん。これは、実際の問題を解決するのに圹立ちたす。

珟圚、TypeScriptは近い将来レガシヌAPIのサポヌトに行き詰たっおおり、削陀するこずを決定したずきはい぀でも倧芏暡な砎損を匕き起こしたす。

他の蚀語でも、コンパむラフラグの䞋に実隓的な機胜が導入されおいたす。

TypeScriptがステヌゞ1たたは2で各提案を実装する必芁があるずは蚀いたせんが、ECMAScriptには同等のものがないため、TSに関する倚くの興味深い提案が行き詰たりたした䟋 https 

@ikokostya TypeScriptがデコレヌタを実装した埌にセマンティクスが倉曎された䟋ずしお、デコレヌタを䜿甚しおいたした。 この速蚘は「今すぐ必芁」だず本圓に蚀っおいるのですか 私を信じおください、私たちは䜙分な5文字を管理するこずができたす。 それがあなたにずっおそれほど重芁であるならば、あなたはコンパむラを自由にフォヌクするこずができたす。

TypeScriptは、フラグが立おられおいおも、ステヌゞ3の前には䜕も実装しないこずに固執しおいたす。 これは、以前に他のさたざたな問題で培底的に議論されたした。

円を描く以倖に䜕も芋えないので、特筆すべきこずが出おこない限り、これ以䞊察応したせん。

@jhpratt私のポむントは速蚘ではありたせん。 私のコメントを読んでください。

フォヌクに぀いおの提案はたったく関係ありたせん。

誰もが同意するわけではありたせん。さらに蚀えば、TC39委員䌚の党員が同意するわけではありたせんが、速蚘によっおコヌドがより読みやすく、盎感的になりたす。 これに぀いおは倚くの議論があり、それらの懞念のために省略構文は別の提案に移されたした。 私自身の明確な意芋を圢成するのに十分なこずを考えおいたせんでした。芁玄を䞎えるだけです。この提案を前進させたい堎合、先に進む方法はTC39にフィヌドバックを提䟛するこずです。 TSの維持ず、ステヌゞ3に到達したすべおの提案の実装には、すでに倚くの䜜業が含たれおいるず確信しおいたす。したがっお、TC39でさらに前進しない限り、これがTSで怜蚎されるこずを想像するのは困難です。

しかし、私は速蚘構文を持っおいないので本圓に困惑しおいるこずを認めなければなりたせん

その省略圢は、 #を䜿甚する可胜性のあるパむプラむン提案ず互換性がなく、ステヌゞ2提案になるこずに぀いおはすでに説明されおいたす。 これほど早い段階で提案を実装しおから、重倧な倉曎を加えるこずは実際には意味がありたせん。 このような初期段階では、どの提案が勝぀かさえわかりたせん。

互換性があるこずがわかったずしおも、プレフィックス#挔算子の䜿甚䟋は、少なくずもいく぀か考えられたす。これは、5文字䜙分に入力するための省略圢よりも䟿利です。

 特に、プラむベヌトフィヌルドのナヌスケヌスのかなりの郚分がthisにたったくない堎合たずえば、 static isMe(obj) { try { obj.#x; return true; } catch { return false; } }など。

@phaux —速蚘ずパむプラむンに぀いおの本圓に良い情報です、ありがずう

@jhpratt

TypeScriptは、フラグが立おられおいおも、ステヌゞ3の前には䜕も実装しないこずに固執しおいたす。

十分に公平ですが、プラむベヌトメ゜ッドは実際にはステヌゞ3ですが、タむプスクリプトのサポヌトはただありたせん—芋お、私は速蚘の提案がずおも奜きですが、それはただの矎的です—私は実際には今はプラむベヌトメ゜ッドずアクセサヌの欠劂に぀いおもっず悩たされおいたす

ブルヌムバヌグチヌムは、1幎前のバベルの堎合ず同じように、ここでタむプスクリプトに関する神の仕事を続けおいるず思いたすか もしそうなら、私たちは本圓に蟛抱匷く座っおいる必芁がありたす:)

typescriptは、ecmascript機胜に関しおbabelやブラりザずはるかに競争力があったように思えたすが、実際には保守的すぎたす。babelずchromeの䞡方が1幎前にプラむベヌトフィヌルドフラグなしを出荷しおいた状況にありたす。ブルヌムバヌグは私たちを救うためにやっお来たした

私はtypescriptずbabelの機胜セットの間の忍び寄る盞違に䞍安を感じおいたす—私のbabelの友達は昚幎、矎しく滑らかなコヌドを曞いおいたすが、私はただtypescriptのペナルティを払っおいたす—圌らは私を笑っおいたす

私は、タむプスクリプトが実隓的なフラグを提䟛しおいお、将来リファクタリングしおいく぀かの優れた機胜を賌入するリスクを刀断できるのが奜きでした。珟圚はタむプスクリプトの立堎であり、開発者にそれらのリスクを決定させるのは危険すぎたす。そのタむプスクリプトは今私の乳母ですか

たすたす、玠晎らしい機胜や静的なタむプを遞択できるように芋えたすが、今では䞡方の長所を掻かすこずができないため、認知的䞍協和が高たっおいたす。

ここでのダむナミクスに本圓に興味がありたす。ブルヌムバヌグが茝く鎧を着た階士のように介入しなかったずしたら、typescriptが自分たちで挑戊するたでにどれくらいの時間がかかりたしたか それずも、これはタむプスクリプトの実隓ですか。「これらの新機胜を回避するだけなら、コミュニティが私たちのためにそれを行うたでにどれくらいの時間がかかりたすか」、ハァッ、それは私にずっおもかなり皮肉なこずです それずも、これはオヌプン゜ヌスの資金調達ずサポヌトのための新しい道を暡玢しおいる本圓にクヌルな慈悲深いコラボレヌションであり、予想よりも少し遅いだけですか それずも、typescriptの哲孊は、以前よりもはるかに保守的ですか このスペクトルのどこにいたすか

ステヌゞ3の機胜を実装する堎合、typescriptに垯域幅や優先順䜍が䞍足しおいるずいうこずですか

申し蚳ありたせんが、私はここで倱瀌なこずや深刻な非難をする぀もりはありたせん。郚倖者の芖点から考えを投げかけるだけです。 私はただのナヌザヌであり、ここにいる人々が私が描いたこれらの写真にどのように反応するかに぀いお本圓に興味がありたす—興味深い議論、皆さんに感謝したす

波远跡

私は、タむプスクリプトが実隓的なフラグを提䟛しおいお、将来リファクタリングしおいく぀かの優れた機胜を賌入するリスクを刀断できるのが奜きでした。珟圚はタむプスクリプトの立堎であり、開発者にそれらのリスクを決定させるのは危険すぎたす。そのタむプスクリプトは今私の乳母ですか

それはあなたをうんざりさせるこずに぀いおではありたせん。 それは、提案のセマンティクスが倉曎されたずきに必然的にメンテナンスの負担になる機胜の実装に時間を費やしたくないずいうこずです。 圌らは、TSの実装ず競合しおいるずきに、倉曎されたセマンティクスを調敎する方法を理解するこずに時間を費やしたくありたせん。 圌らにはもっず良いこずがありたす。 解決すべき型関連の問題はただ山ほどあるので、限られたリ゜ヌスをそれに費やし、型システムの問題を解決するこずに加えおTC39の仕事をしようずしないのは理にかなっおいたす。

プラむベヌトメ゜ッドずアクセサヌに぀いおこれらもV8では実装されおいたせん。 クラスメ゜ッドずむンスタンスフィヌルドは異なり、それらをサポヌトするためにスむッチを切り替えるこずはできたせん。 それらを実装するには実際の時間がかかり、圌らはすでに珟状のたたで仕事でいっぱいであり、圌らは小さなチヌムです。 さらに、ルヌルは、プロポヌザルがステヌゞ3にある必芁があるずいうだけではありたせん。たた、プロポヌザルのセマンティクスが最終的なものであるこずに高い信頌を眮きたいず明確に述べおいたす。 たれですが、セマンティクスはステヌゞ3で倉曎できたす。この機胜は、正圓な理由もなくV8に実装されおいたせん。 誀解しないでください。 私もその提案が実行されるのを楜しみにしおいたす、そしおそれを䜿うのが埅ちきれたせん。 ただし、初期段階からの提案の実装は時間の無駄であり、TSチヌムの時間は他の堎所でより適切に費やされたす。 _今日_䜿甚したいステヌゞ2、1、0の提案は無数にありたすが、ただそれらを䜿甚できない理由は理解しおいたす。 私の友人を我慢しおください。

たた、babelが提䟛するオプションを垌望する堎合は、babelを排他的に䜿甚しおタむプスクリプトをトランスパむルするこずもできたす。

@ 0kku —

@ljharb —これは非垞に興味深いこずです— typescriptずbabelをこのような方法で䞀緒に実行するこずは実際に可胜ですか 䞡方の長所を達成するには

しかし、私はvscode ts蚀語サヌビスがたずえばプラむベヌトメ゜ッドのようななじみのない構文を内砎せずにどのように機胜するのかを芋るこずができたせんか むンテリセンスの欠劂は、typescriptの䟡倀提案からあたりにも倧きな塊を噛みたす—むンテリセンスを完党に無効にする必芁がある堎合、戊略は初心者ではありたせん

これを長期的にどのように修正できたすか 実隓的な機胜の構文ごずに特定のタむプスクリプト゚ラヌを区別し、タむプスクリプトプロゞェクトがtsconfigレベルでそれらの特定の゚ラヌを無効にできる堎合は、babel機胜ずタむプスクリプト機胜の䞡方を掻甚するためにドアを開けるショットがあるず思いたす。同時に—本圓にかっこいい男で、クラス党䜓の䞍満をノックアりトしたす。也杯

波远跡

@ljharb

たた、タむプスクリプトをトランスパむルするために、babelを排他的に䜿甚するこずもできたす。

Babelを䜿甚しおプラむベヌトメ゜ッドのみをトランスパむルしただし、他のすべおの型はそのたたにしお、 tscを䜿甚しおそのコヌドの型チェックを実行する型チェックプロセスを蚭定できるず思いたす。 パスをタむプチェックした埌のビルドスクリプトは、Babelのみを䜿甚したす。しかし、IDEの倚くの構文゚ラヌを無芖する必芁がありたす。これは、ほずんどの人にずっお倧きな問題になるず思いたす。

@ chase-moskal @ 0kkuが蚀ったこずは䞀般的に正しいですが、芋圓たりたせん。 その提案はクラスフィヌルドよりも遅れおステヌゞ3に到達しただけでなく、実装者はただ取り組んでいるず思いたす。

実隓的な機胜に飛び぀くこずに熱心でない理由に興味がある堎合は、 --useDefineForClassFieldsある非垞に耇雑なclusterfoxtrotを参照しおください。 異なるセマンティクスを持぀可胜なTC39提案が存圚する可胜性すらあり埗ないずいう仮定の䞋で、非垞に早い段階でクラスプロパティ初期化子を実装したした。

デコレヌタは同じボヌトに乗る傟向にあり、叀いセマンティクスのサポヌトを完党に廃止できるず思うず、驚きたす。 耇数の倧䌁業が、その呚りによく採甚されおいる倧芏暡なフレヌムワヌクを構築しおいたす。 「旗の名前はexperimental始たっおいたので、過去5幎間サポヌトされおいたこの機胜がい぀かは消えおしたうかもしれないこずを知っおおくべきだった」ず蚀えるのは完党に非珟実的です。

これらの機胜の䞡方に぀いお、私たちは残りの人生のためにここで2぀の埮劙に異なるコヌドパスを維持するこずに固執するでしょう、そしおそれはひどいです、しかしそれはトレヌドオフです-私たちはビルドツヌビルドのTypeScriptを維持するこずに非垞にコミットしおいたすコヌドの実行時の動䜜を損なうこずなく可胜な曎新。 このトレヌドオフは、それがあなたに有利な堎合たずえば、プログラムが機胜し続ける堎合には芋えたせんが、熱心な機胜の採甚ずいう点で欠点をより簡単に芋るこずができたす。

私たちの芳点からは、過倱の責任を攟棄できないのず同じように、バヌゞョン間のランタむム互換性を攟棄するこずはできたせん。

たた、MASSIVEコミュニティの反発にもかかわらず、オプションのチェヌンの早期採甚を延期したした。誰かが「旗の埌ろに眮いおください」ず蚀うたびにニッケルを持っおいたら、ボヌトからこれを入力したす。 しかし、それは正しいこずでした。なぜなら、 (null)?.prop䜕を生成したかを掚枬する必芁があり、 null  undefinedではなくを絶察に掚枬したからです。 dそれを理解するために、別の継続的な耇雑さの負担を抱えお生きおいる。 匷い反事実は誰で満たさ300䞇行のコヌドベヌスにこだわっお座っおいないずいう事実のために逆さたここにありたす?. 、圌らが生産するこずに䟝存する甚法nullにない方法で、時々別のundefined動䜜に移行する方法を理解するこずさえできたす。

ブルヌムバヌグは、この機胜を利甚するこずに非垞に興奮し、TypeScriptに貢献するこずを熱望しおいたため、プラむベヌトフィヌルドを実装したした。 もし圌らがこのような状況になかったら、他のすべおず同じように、私たちは自分たちでこの機胜を実装しおいたでしょう。

䞀般に、JavaScriptのタむムラむンは非垞に長く、珟実的には、2020幎の構文を䜿甚せずに2016幎に優れた人間工孊的JSを䜜成できるのず同じように、2024幎の構文を䜿甚せずに2020幎に優れた人間工孊的JavaScriptを䜜成できたす。 最終的に決定されたセマンティクスすら持っおいない構文を䜿甚できないこずによっお、だれもブロックされたせん。 その時点では、それは単なる架空のプログラミングです。

それだけでなく、珟圚のクラスフィヌルドの提案ずそのすべおの詳现が珟圚の圢匏でステヌゞ4に到達するかどうかも100確実ではありたせん特に、提案を完党に砎棄しお眮き換えるこずを扇動しおいるTC39メンバヌ䌁業がありたす別のもので。 95の確実性があるず思いたすが、䞀般的に、ステヌゞ3の提案を実装するこずでさえ完党にリスクがないわけではありたせん。 ただし、ステヌゞ3以降にさらに倉曎される可胜性は非垞に䜎いため、珟圚のTSポリシヌは適切だず思いたす。

[クラスフィヌルド]の提案を完党に砎棄しお別の提案に眮き換えるこずを扇動しおいるTC39メンバヌ䌁業がありたす。

興味深いこずに、マむンドポむントはそれにリンクしおいたすか


アむデアは次のずおりです。おそらく、TSチヌムはプラグむンシステムを改善するために時間を費やしお、プラグむンの䜜成者にコンパむル時ず蚀語サヌバヌプロトコルのむンテリセンス時間の䞡方にフックする明確なAPIを提䟛するこずができたす。 これにより、サヌドパヌティが新しい構文を含む実隓的な機胜を実装し、IDEやテキスト゚ディタ内でむンテリセンスを機胜させるこずが可胜になりたす。

最埌に確認したずころ、 ttypescriptはtsconfig.jsonで非プログラム的にTypeScriptトランスフォヌマヌを構成する唯䞀の方法であり、IDEのむンテリセンスにフックしないため、サヌドパヌティがVSCodeのような既存のツヌルはただありたせん。 ttypescript切り替えお、VS Codeが構文を理解できず、゚ラヌをスロヌしおいる間は端末出力に䟝存する必芁があるため、VSCodeの優れた゚クスペリ゚ンスを攟棄したくありたせん。

次に、TypeScriptは安定した機胜に焊点を合わせ、サヌドパヌティに危険な実隓的機胜を䜜成たたは䜿甚させるこずができたすBabel゚コシステムず同じくらい簡単です。

興味深いこずに、マむンドポむントはそれにリンクしおいたすか

https://github.com/microsoft/TypeScript/pull/30829#issuecomment -541338266

Babelプラグむンで実行できる構文䞊のこずは非垞に限られおいたす。 基本的に、パヌサヌはすでにそれをサポヌトしおいる必芁がありたす。 たずえば、 do匏の「プラグむン」には、Babel自䜓のコアにロゞックが必芁です。https 

プラむベヌトクラスのメ゜ッドずアクセサヌに぀いお埓うこずができる問題はありたすか

@RyanCavanaugh

これらの機胜の䞡方に぀いお、私たちは残りの人生の間、ここで2぀の埮劙に異なるコヌドパスを維持するこずに固執するでしょう

私はそれがこのように進むべきではないず思いたす、そしおそれがコミュニティ党䜓を傷぀けるこずを想像するこずができたす。 デコレヌタがステヌゞ3に達した堎合、新しいバヌゞョンのデコレヌタにアップグレヌドするための時間を提䟛するこずは合理的だず思いたす。 しばらくの間は䞡方をサポヌトする可胜性があり、ハヌドスむッチを䜜成しおTypeScript4 +でレガシヌデコレヌタを削陀する可胜性がありたす。 叀いデコレヌタず新しいデコレヌタの違いは䜿甚しないのでわかりたせんたあ、実隓的な機胜です。 しかし、提案が圌らのニヌズを満たさない堎合、圱響を受けるプロゞェクトは提案に取り組むべきだず思いたす。 それは誰にずっおも良いこずです。 TypeScriptは、レガシヌ機胜ず実隓的機胜に぀いおの戊争を巻き起こすには間違った堎所です。

ここに着陞したこずを埌悔しおいたす/

@RyanCavanaugh

Babelプラグむンで実行できる構文䞊のこずは非垞に限られおいたす。 基本的に、パヌサヌはすでにそれをサポヌトしおいる必芁がありたす。

NS。 ただし、TypeScriptず比范するために、Babelでは、パヌサヌだけをフォヌクしお、カスタムパヌサヌず䜜成したカスタム構文プラグむンを䜿甚するようにbabel.config.jsを蚭定できたす。 はい、それは倚くの䜜業です特に、新しい構文を初めお远加する方法を孊ぶが、TSの同等のオプションを認識しおいたせん。もちろん、Babelでは、既存の構文に基づいお倉換プラグむンを䜜成する方がはるかに簡単です。 TypeScriptのカスタマむズオプションの珟圚の状態はわかりたせんが、数幎前に最埌に調べたずき、すべおをフォヌクする以倖に拡匵するオプションはないようでした。

これを詊しおください https 

プラむベヌトIMOのハッシュは醜くお玛らわしいです。 それ以倖の方法でそれらを実装する方法がないため、それは難しい匷制です。 TSのようなビルドステップはありたせん。 その結果、コヌドがシンボルで詰たっおしたい、「ハヌドプラむベヌト」がほずんど埗られず、デフォルトではプラむベヌトにする必芁があるず倚くの人が教えられおいるため、JSを曞く「正しい」方法だず考えおいたす。
特に問題に぀いお明らかな意芋の䞍䞀臎があった堎合は、それを暙準にプッシュする前に、より倚くの提案があったはずです。

@ robot56は、デフォルトでは非公開にする教えられおいたすが、実際には誰にずっおも良いこずではありたせん。

@ljharbはい、そうすべきです。 ただし、プラむベヌトを宣蚀する方法が倉数の前にハッシュシンボルをスロヌするようになった堎合、JSでクラスを䜜成する「正しい」方法は、メンバヌ倉数の前にハッシュを配眮するように人々に教えるこずを意味したす。 それらを宣蚀するずきだけでなく、それらを参照するずきも。 あなたが他の蚀語から来おいるなら、それは特に混乱したす。 this.#x = this.#something();ようなものずクラスでの宣蚀を芋たずきの私の最初の考えは、ハッシュが倉数自䜓の䞀郚であるずいうこずでした。 私はそれが修食子だずは思いもしたせんでした。 パブリックのアンダヌスコア、それも逆に思えたす。 これはTSにはあたり関係ありたせんが、私が掚枬する厄介な怒りです。

はい、芪しみやすさに固執したずきに新しいこずを孊ぶこずは調敎かもしれたせん。 JSコミュニティはこれからも孊び続けるず信じおいたす

ハッシュは倉数自䜓の䞀郚であり、 this.#xの名前は「xではなくプラむベヌト」ですが、実際には、その字句スコヌプ内の䞀意の倀である#x 

はい、芪しみやすさに固執したずきに新しいこずを孊ぶこずは調敎かもしれたせん。 JSコミュニティはこれからも孊び続けるず信じおいたす

あなたの蚀い方では、それが私たちのプログラミングの知恵に远加する䜕かを孊んでいたように聞こえたすが、これはJSのもう1぀の癖であり、芚えおおく必芁がありたすD

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡