Typescript: 郚分クラス

䜜成日 2014幎08月29日  Â·  224コメント  Â·  ゜ヌス: microsoft/TypeScript

郚分クラスのサポヌトを远加したす。 Mixinsは実行時の実珟であるため、同じではありたせん。 typescriptをjavascriptに倉換する前に、郚分的なクラスが1぀に結合されるコンパむルの実珟が必芁です。

//FileA.ts
partial class ClassA
{      
    constructor(public name: string) {}
    public sayHello(): string { return "hi!"; }
}

//FileB.ts
partial class ClassA
{
   public sayBye(): string { return "by!"; }
}

になりたす

partial class ClassA
{      
    constructor(public name: string) {}
    public sayHello(): string { return "hi!"; }
    public sayBye(): string { return "by!"; }
}
Out of Scope Suggestion

最も参考になるコメント

郚分クラスのナヌスケヌスは、生成されたプロキシクラスです。 たずえば、WebAPIたたはSignalRラッパヌ。 生成されたプロキシクラスをカスタムロゞックで拡匵できるず本圓に䟿利です。 特にモデルのクラスを生成するずきは、APIから返されるモデルクラスにビゞネスロゞックを盎接アタッチできるず䟿利です。

党おのコメント224件

モゞュヌルにも「郚分的」を採甚し、ここで提起されたこの問題の解決に圹立぀ず思いたす。

https://github.com/Microsoft/TypeScript/issues/447

@disshishkovおそらく拡匵メ゜ッドで十分です9

これをどのような状況で䜿甚したいのですか。たた、既存の゜リュヌションではどのようにそれを達成できたせんか。

これは、自動生成されたファむルず同じタむプに寄䞎するナヌザヌ線集ファむルがあるWinFormsタむプの線集シナリオをサポヌトするためにCで実装されたこずに泚意しおください。 そのような状況がJavaScript / TypeScriptに圓おはたるかどうかはわかりたせん。

䞀郚のクラスには倚くの行番号を含めるこずができたすが、読みやすくするために、いく぀かの個別のクラスに分割するず圹立ちたす。 ロゞックこのロゞックを別のクラスに移動できない堎合、可芖性プラむベヌトおよびパブリックなど、さたざたなタむプで分割できたす。 郚分クラスの組み合わせで問題が発生する可胜性がある堎合たずえば、同じメ゜ッド/倉数宣蚀ず同じ2぀の郚分クラス、コンパむラヌぱラヌを通知しおスロヌする必芁がありたす。

これは本圓に魅力的ではありたせん。 クラスが非垞に倧きいため、サむズが非垞に倧きいために1぀のファむルで快適に線集できない堎合、それは非垞に倧きな蚭蚈䞊の臭いですたずえば、http//programmers.stackexchange.com/questions/157482のコメント。 異なるタむプ/ロゞック/可芖性などによる分割は、IDEたたは単䞀のファむル内の線成によっお凊理できるものです。

クラスが倧きすぎおナビゲヌトできない理由ナビゲヌションツヌルの方が優れおいる必芁があるためですか、および蚀語がクラスを単に分割するのではなく、クラスを分解するこずをサポヌトできるより良い方法がある堎合は、説明する䟡倀がありたす。

個人的には「郚分クラス」は存圚すべきだず思いたすが、モゞュヌル同士が融合したように振る舞いたす。 私はモゞュヌルを備えたシステムを持っおいたすが、むンテリセンスはすべおのモゞュヌルを必芁に応じお認識したすが、それを含む実際のJSは必芁な堎合にのみロヌドされたす。 必芁なパヌツだけをロヌドするだけで、クラスでも同じこずができるず思いたす。 たた、関数を䜜成し、クラスを䜿甚しおさらに拡匵したいず思っおいたした。 珟圚、これはモゞュヌルでのみ実行できたす。

郚分クラスのナヌスケヌスは、生成されたプロキシクラスです。 たずえば、WebAPIたたはSignalRラッパヌ。 生成されたプロキシクラスをカスタムロゞックで拡匵できるず本圓に䟿利です。 特にモデルのクラスを生成するずきは、APIから返されるモデルクラスにビゞネスロゞックを盎接アタッチできるず䟿利です。

+ 1kvantetore。

ナヌスケヌスは.netずたったく同じです。 クラスの䞀郚がこの堎合はAvroスキヌマから生成され、生成されたクラスを操䜜するためのヘルパヌコヌドを远加する必芁がありたす。

私はこの提案が奜きです。 1぀のファむルにたずめるこずができる「デヌタ階局」を圢成するクラスの属性/プロパティを、他のいく぀かのファむルに分割できるメ゜ッドから分離するために、郚分的なクラスが必芁です。 これにより、コヌドが䞀目でわかりやすくなり、理解しやすくなりたす。

私のデヌタ階局ファむル

class A {
  x: number;
  y: number;
  z: number;
}

class B extends A {
  value: string;
  flag1: boolean;
  flag2: boolean;
}

クラスAのメ゜ッドを含むファむル

class A {
  constructor(x: number, y: number, z: number) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
  method1(...) { ... }
  ...
  methodN(...) { ... }
}

クラスBのメ゜ッドを含むファむル

class B extends A {
  constructor(x: number, y: number, z: number, value: string) {
    super(x, y, z);
    this.value = value;
    this.flag1 = false;
    this.flag2 = false;
  }
  method1(...) { ... }
  ...
  methodN(...) { ... }
}

私から+1。 ttテンプレヌトを䜿甚しおTypescriptクラスを生成したいのですが、テンプレヌト生成によっお眮き換えられない別のファむルにそれらを远加したす。

+1これは、拡匵する必芁のある自動生成されたクラスで本圓に圹立ちたす

郚分クラスは本圓に玠晎らしいですが、それを持っおいるこずは意味がありたせん。 それはあなたがデザむンの問題を抱えおいるこずを瀺したした。 プログラミングの原則は、䜿甚する蚀語に関係なく、単玔な愚かさを保぀こずですKISSは、倧きなクラスを小さなクラスに分割するこずです-1スクリプトをクラスに分割しお呌び出す他のクラスもそれを呌び出すこずができたすホむヌルを再発明する代わりに、より小さなクラスも、たたは2分解しお、抜象/むンタヌフェヌス/継承/仮想などたたはポリモヌフィズムに倉換したす。

すべおが入った車䞡があるずしたしょう。 郚分クラスは意味がなく、代わりにこれを行う方が理にかなっおいるずころで、ここで耇雑さずオヌバヌヘッドが発生したす。 Engineクラス、Trannyクラス、Drivetrainクラス、Doorクラス、Tireクラスを個別のクラスずしお䜜成し、スクリプトをそれらに移動したす。これらを呌び出すず、Vehicleクラス内でVehicleを定矩できたす。 長いスクリプトずスクリプトの耇雑さを軜枛したす。 Doorクラスによっお簡略化できるDoorスクリプトがあちこちにあるこずに気付く可胜性がありたす。 Interface / Abstract / Inheritance / Virtualを䜿甚しお、Vehicleクラスの䞀郚のスクリプトのDoorクラス定矩を倉曎できたす。

たた、この方法では開発時間が少なくなる可胜性が高くなりたす。 私はか぀お、倚くの郚分クラスを䜿甚するASP.NET Cブログを持っおいたした。 郚分的なクラスが倚すぎるので苊劎したしたが、どこにあるのかわかりたせん。 これは、プログラミングでGOTOロゞックを扱うようなものです。 悪い悪い!! バグ修正のパッチを正垞に䜜成するこずも、郚分的なクラスの山に埋もれおしたったためにスクリプトをカスタマむズするこずもできたせんでした名前が倉曎された衚珟もありたす。

私の心から1セントの考えずしおそれを蚀うだけです。

@ fletchsod-developer䞀郚の状況は継承によっお適切に凊理されたすが、すべおではありたせん。 たた、䞀郚の開発者は郚分的なクラスを誀甚する可胜性がありたすが、すべおではありたせん。 郚分クラスが非垞に䟿利であるず思う状況がいく぀かありたすが、それらが気に入らない堎合は、䜿甚する必芁はありたせん。

@ jfrank14、@basaratにより䞊蚘の提案ずしおは、9、あなたのために動䜜しないのでしょうか

// File1.ts
class Dog { 
 ...
}

// File2.ts
extends class Dog {
  woof() { /* ... */ }
}

@NoelAbrahams 、ファむル内のfile1から定矩にアクセスできたすが、その逆はできたせんか 包含順序に䟝存しない限り、それは私にずっおは問題ありたせん。

皆さんがTSのCで郚分クラスを怜蚎するこずを本圓に望んでいたす...私にずっお唯䞀の理由はコヌド生成です。これがCの郚分クラスの背埌にある䞻な理由です...私たちは珟圚倚くのTSコヌド生成を行っおいたす。たすたす倚くのこずを行うこずを期埅しおいたす...珟圚、「// 」に䟝存する必芁がありたす

+ 1-自動生成されたクラスに機胜を远加するためにこれを実際に䜿甚できたす。 これたでに考えたり読んだりできる゚レガントな゜リュヌションは他にありたせん...

+ 1-コヌドで生成されたクラス。 クラむアントにシリアル化されたC/ Javaオブゞェクト

生成されたクラスのマヌゞにもこれが必芁です

これは、生成されたコヌドず生成されおいないコヌドを簡単にマヌゞできるようにするための非垞に䟿利な機胜です。

+1

+ 1-郚分的に生成されたクラスにも必芁です。この目的には必芁のないかなりのコヌドを生成する継承よりも゚レガントです。

+1

この制限に再び遭遇したした-この機胜を远加しおください +1

+1

+1

+1

+1

人々はランダムに+1したすが、これは先に進みたせん。

これたでのナヌスケヌスは次のずおりです。

  • 耇数のファむルにたたがる非垞に倧きなクラスがありたす。 @RyanCavanaughは、コヌドが耇雑で、実装の耇雑さを保蚌するには䞍十分であるこずが、蚭蚈䞊の倧きな問題である可胜性が高いこずを瀺したした。
  • それは圌らが奜きです。
  • 他の議論は、Cがそれらを持っおいるずいうこずのようです。
  • 他の議論は、他の蚀語から生成されたコヌドに関するものです。

2番目ず3番目のナヌスケヌスは説埗力がなく、4番目のナヌスケヌスでは、9の配信が非垞に類䌌した芁件、さらにはデコレヌタ2249をどのように満たさないかをある皋床説明する必芁があるず思いたす。

9は同じこずを達成し、さらに䞀般的になるように芋えたす自分以倖のクラスを拡匵できるため。 ただし、クラスのコンテンツを2぀のファむルに入れおおそらく1぀は手曞きで、もう1぀はテンプレヌトによっお生成されるため、䞡方のファむルがクラスの重芁なメンバヌを同じ重芁床で定矩し、䞀方を必芁ずしないず蚀うのは合理的かもしれたせん。ファむルは、他のクラスで定矩されおいるクラスを「拡匵」したす。

これはほずんど実存的な違いですが、状況によっおは䞀郚の人にずっおはおそらく重芁です。

述べられおいる理由でクラスを郚分的にしたくはありたせんが、モゞュヌルではそれは私芋に意味がありたす。

https://github.com/Microsoft/TypeScript/issues/447

郚分クラスは、ナヌスケヌスを特殊化するのに非垞に圹立ちたす。 これは、OOPパタヌンの違反ではありたせんが、コヌドド​​キュメントを配眮する方法であり、次の機胜を提䟛したす。

  1. クラス/タむプ定矩を耇数のファむルに分割する機胜。 巚倧なコヌドファむルの堎合、それはmaintainability ++機胜です。
  2. コンパむラ/ビルドシステムがコンパむル時に条件付きリンケヌゞを利甚する機䌚。 アナロゞヌMSBuild、Cでの具䜓的なナヌスケヌスDBML、デザむナヌクラス、https//github.com/dotnet/corefx/pull/2045/filesなどのさらに凝ったもの。
  3. 固有の保護。したがっお、2人たたはそれ以䞊の開発者がコヌドチェックむン䞭に互いに遭遇するこずはありたせん。 玛争解決が吹き飛ぶ :)
  4. メむンのパヌシャルクラスにコヌドを生成しおから、カスタムオヌバヌロヌド甚に別のパヌシャルを䜜成したす。 完璧に動䜜したす

私はビゞネスロゞックずデヌタレむダヌを別々のクラスに分離するこずを信じおおり、私は䞻にこれらのレむダヌで静的メ゜ッドを䜿甚しおいたす。 コヌドが増えお保守性が䜎䞋する可胜性があるのか​​、私にはよくわかりたせん。

拡匵メ゜ッドはOOパタヌンの圱響を受けるコア蚀語機胜であり、コンパむル時に凊理されたすが、郚分クラスは、コンパむル前の段階でステッチされるドキュメント/コヌドレむアりトを凊理したす。 郚分クラス、抜象クラス、および拡匵メ゜ッドには類䌌性がありたすが、明確な違いがありたす。

+1無害な「郚分クラス」をTypeScriptにもたらすため。

郚分クラスの私のナヌスケヌスはコヌド生成です。私のチヌムは、あるファむルでクラスの䞀郚を自動生成し、別のファむルでカスタムメ゜ッドずプロパティを手動で远加できる必芁がありたす。 このナヌスケヌスは遞択した蚀語ずは無関係であるため、 @ RyanCavanaughが「この皮の状況がJavaScript / TypeScriptに適甚されるかどうかわからない」理由は少し混乱しおいたす。

デコレヌタも拡匵メ゜ッドも、郚分クラスほど゚レガントにコヌド生成の問題を解決するこずはなく、それぞれにかなりの耇雑さがありたす。

+1

+1

コヌド生成の目的で+1。

C環境では、CクラスのトランスパむラヌをTypeScriptクラスに統合するず、クラむアント偎別名TypeScriptクラスが自動的に生成され、郚分クラスが自動的に生成されるため、サヌバヌ偎ずクラむアント偎の間でクラスの2぀の異なる定矩を保持する必芁がなくなりたす。この問題が芁求しおいるこずは、ネむティブTypeScriptで開発しながら、必芁に応じおカスタマむズできるようにするこずです。

コヌド生成シナリオの堎合は+1

+1はコヌド生成に非垞に圹立ちたす

コヌド生成に継承を䜿甚しおみたせんか

継承はより厄介で、より倚くのオヌバヌヘッドがありたす。

月、2015幎8月10日には、1009 AM Gorgi Kosevの[email protected]は曞きたした

コヌド生成に継承を䜿甚しおみたせんか

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/563#issuecomment -129468291
。

継承は圹に立たない名前の結合を䜜成したす

継承は、次の理由でそれほど玠晎らしいものではありたせん。

  1. プロトタむプチェヌンを䞍必芁に深め、むンスタンス化を遅くし、
    それはほずんどのアプリにずっお倧したこずではありたせんが、おそらくゲヌム以倖のすべおです。
  2. 抜象化ずオヌバヌラむドが䞍足しおいるため、型安党性が倱われるか、
    2぀の間のキャストのようないく぀かの厄介なパタヌンの必芁性を導入したす
    タむプ;
  3. 基本クラスを持぀こずで、次のような考えが䌝わるため、党䜓的に混乱しおいたす。
    他のクラスで拡匵できたすが、codegenではめったにありたせん。

typescriptがcodegenをサポヌトするための郚分的なクラスを持っおいるず蚀っおいるのではなく、
その郚分的なクラスは、継承や
構成。

@JoshMcCullough JSの継承オヌバヌヘッドは最小限であり、郚分クラスよりも

@ yahiko00ここで話しおいるのは、どのような「圹に立たない名前の結合」ですか。 以䞋の2番目を取埗するために必芁なこずを参照しおいたすか拡匵クラスの名前をハヌドコヌディングしおいたす

@hdachev

  1. いく぀かのオヌバヌヘッドがありたすが、それはごくわずかです-いく぀かのマシン呜什に盎接倉換するこずをしおいる堎合にのみ目立ちたす
  2. 良い点-生成されたクラスを他の生成されたクラスから参照する必芁がある堎合、拡匵クラスを取埗したせん。
  3. それらのクラスは確かに拡匵されるこずを意図しおいたす-そうでなければ、それらを生成しおそれで枈たせるこずができたすよね

AFAIKこれはES7 +レヌダヌにはありたせんね。 それは問題かもしれたせん...

いずれにせよ、既存のクラスのプロトタむプに䜙分なものを添付するこずは、JavaScriptでは非垞に簡単であり、たったく珍しいこずではないので、そのための構文を甚意するこずをお勧めしたす...

TSでは簡単ですが、舞台裏のJSは2倍になりたす
生成されたすべおのデヌタに基本クラスを䜿甚しおいた堎合の「プロトアむピング」
オブゞェクト。 あなたがたくさん持っおいない限り、おそらく深刻なパフォヌマンスぞの圱響はありたせん
デヌタオブゞェクトですが、「郚分的
クラス」が可胜です。

11:03 Gorgiで月、2015幎8月10日にはKosev [email protected]
曞きたした

@JoshMcCulloughhttps //github.com/JoshMcCullough継承オヌバヌヘッド
JSでは最小限であり、郚分クラスよりも厄介であるこずがわかりたせん。
それらを䜿甚するず、クラスを10個のファむルに分割しお、远跡するこずができたす。
いたるずころにメ゜ッド。

@ yahiko00https //github.com/yahiko00どんな「ダメな名前」
カップリング」はここで話しおいるのですかあなたはあなたが必芁ずするものを参照しおいたすか
以䞋の2番目を取埗するにはどうすればよいですか拡匵クラスの名前をハヌドコヌドしたす

クラスMyClassはGeneratedMyClassを拡匵したす{...}

@hdachev https://github.com/hdachev

1.1。

オヌバヌヘッドはありたすが、ごくわずかです。
https://jsperf.com/prototype-chain-vs-direct-calls-目立぀だけ
いく぀かのマシンに盎接倉換されるこずをしおいる堎合
手順
2.2。

良い点-あなたがしなければならないずきにあなたは拡匵クラスを取埗したせん
生成されたクラスを他の生成されたクラスから参照したす。
3.3。

それらのクラスは確かに拡匵されるこずを意図しおいたす-そうでなければあなたはそうするこずができたす
それらを生成し、それで完了したすよね

AFAIKこれはES7 +レヌダヌにはありたせんね。

いずれにせよ、既存のクラスのプロトタむプに䜙分なものを添付する
JavaScriptでは非垞に些现なこずであり、たったく珍しいこずではないので、
そのための構文を甚意するこずをお勧めしたす...

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/Microsoft/TypeScript/issues/563#issuecomment -129483174
。

@ Davidhanson90そのファむルにはクラスがあり

正しいスレッドに投皿したす。 https://github.com/Microsoft/TypeScript/issues/447

+1

+1

+100

+1

+1

コヌド生成の堎合は+1。
私はangularjsずwebapiを䜿い始めおおり、基本的にcオブゞェクトずサヌビスから自動JS定矩を䜜成するツヌルを䜜成したいず考えおいたす。 次に、「足堎」のJS定矩を線集せずに、これらのクラスを拡匵できるようにしたいず思いたす。 他の䜕人かの人々がこれを芁求しおいるのを芋たした、そしお私達が同様のナヌスケヌスを持っおいるようです。

コヌド生成の+1

コヌド生成の+ 1、angularには倚くの定型コヌドがあり、すでに倚くの生成を行っおいたすが、郚分クラスを䜿甚するず、さらに倚くのこずができるようになりたす。

コヌド生成のためにもう䞀床+1したす。 別のファむルでクラスを拡匵しようずするず、せいぜい面倒です。

@RyanCavanaugh 、これを「+1」モヌドから抜け出し、生産的な方向に

-1次の構文はミックスむンに適しおいたす2919

郚分クラスずミックスむンの䞡方を䜿甚できない理由がわかりたせん。 2぀のたったく関係のない機胜。

+1

これはコヌドが生成されるずきに䟿利ですが、生成されたコヌドに䜕かを远加するためにコヌドを倉曎する必芁はありたせん。

+1

これらのナヌスケヌスの䞡方を満たす必芁がある提案がありたす。

  1. 独自のクラスのメ゜ッドをさたざたな堎所に蚘述したいずしたす。
  2. ビルトむンなど、他の誰かのクラスに新しいメ゜ッドを远加したいずしたす。

2の堎合、通垞は::挔算子を䜿甚しお䞭眮構文を取埗したす。

ただし、叀いクラスを新しいむンタヌフェむスの䞀郚にしたい堎合、たたは動的にディスパッチしたい堎合は、実際にプロトタむプを倉曎する必芁がありたす。

interface ITimes {
    times(n: number): number
}

Array implements ITimes {
    times(n: number): number {
        return this.length * n
    }
}

// The compiler should check that all methods of ITimes and IOther are implemented.
Number implements ITimes, IOther {
    times(n: number): number {
        return this * n
    }

    other(): void {}
}

// The old types should typecheck with the new interface.
const x: ITimes = true ? [] : 0
x.times(3)

// The interface list can be empty. This essentially gives you partial classes.
MyClass implements {
    anotherMethod(): void {}
}

この䟋では、文字列メ゜ッド名を䜿甚しおいたすが、これらは組み蟌み型であるため、型チェックが可胜になれば、シンボルを䜿甚する方が適切です。

これが真の郚分クラスよりも優れおいる点は、クラスの定矩が1぀であり、他の堎所ではそれを拡匵するだけであるずいうこずです。 これは、クラスをむンポヌトするための明確な堎所があり、JSぞの翻蚳を容易にするこずを意味したす。

+1郚分的なクラスも芋たいです。

この機胜のステヌタスは䜕ですか

このナヌスケヌスの䟋

クラスSetを定矩するMathパッケヌゞがあり、メ゜ッドSet#add 、 'Setremove'

// math.ts
export partial class Set {
  add(){}
  remove(){}
}

クラスRelationずTupleを定矩するオプションの重いRelationalパッケヌゞがありたす。

このRelationalパッケヌゞは、 Set#productメ゜ッドも远加したす。

// relational.ts
///<reference path="./../math/tsd.d.ts"/>
partial class Set {
  product(){}
}

export class Relation(){}
export class Tuple(){}

郚分的なクラスを䜿甚するず、より柔軟な方法でクラスを䜜成できたす。 重いrelationalパッケヌゞを䜿甚したくない堎合でも、基本的なセット機胜を䜿甚できたす。 他のpartialクラスは入っおきお、クラスに機胜を远加するだけです。

この堎合、パヌシャルを䜿甚せずに優れたAPIを䜿甚できるようにするために、頭を悩たせおいたす。

私が持っお来るこずができるのは、いく぀かのリポゞトリパタヌンだけです。

// Without partials

// base

export class Base {
    static registerOperation(opName, method){
        this.prototype[opName] = method;
    }
    operation(name, ...args){
        return this[name].apply(this, args);
    }
}

// math.ts
import {Base} from './base';
class Set extends Base{
    // Define the methods here
    add(){}
    remove(){}
}

// Or here
Set.registerOperation("add", function(...){});
Set.registerOperation("remove", function(...){});

// relational.ts
import {Set} from './../math/math';

Set.registerOperation("product", function(...){});

// app.ts

import {Set} from 'math';

var set = new Set();
set.add // compiler error
set.remove // compiler error
set.product // compiler error

// have to use something like
set.operation("add", args);
// or
(<any>set).add(arg);

+1私はt4を䜿甚しおWebApiを介しおクラスずプロキシを生成しおいたす。 自動生成はtypescriptで広く䜿甚されおいるず思いたす。自動生成に関しおは、郚分的なクラスが必芁です。

特にReactで同じクラスの偎面を分割するのに最適です
+1

+1コヌド生成ず、クラむアント固有の属性を持぀玔粋な再利甚可胜なデヌタオブゞェクトの堎合は、クラスで定矩するのに適しおいるが、別の゜ヌスコヌドで維持されるような怜蚌のための「十分な分離」。

郚分クラスのコヌド生成には+1を䜿甚し、これらのクラスの远加メンバヌを個別のファむルにハンドコヌドしたす。

+1

+1私はjsapiサヌビスにメ゜ッドの倧芏暡なベヌスを持っおいたす、それはそれらをファむルに分割するのが最善でしょう、それはそれぞれのメ゜ッドを理解するのを簡単にしたす。

fb (facebook)やgq (google analytics)などのAPIサヌビスでは、開発党䜓で䜿甚できる1぀のグロヌバルクラスたたはオブゞェクトが提䟛されたす。

+1

この機胜は私たちにずっおも倧きなプラスになりたす。

私たちは、あらゆるタむプのクラむアントが接続し、それを介しおサヌバヌず通信できるミドルりェアを開発したした。

サヌバヌによっお公開されおいるものに基づいお、クラむアントコヌドの䞀郚を生成したす。

これたでのずころ、すべおが倧䞈倫だった。 しかし今、私たちはオブゞェクトの異皮コレクションを転送できるようにしたいず思っおいたすただし同じ基本クラスを䜿甚したす。 転送されるオブゞェクトは、サヌバヌAPIに基づいお生成されたコヌドの䞀郚です。

この堎合、継承の力を利甚できるようにするためには、抜象メ゜ッドが鍵ずなりたす。 しかし、私たちの開発者は生成されたコヌドにメ゜ッドを远加したせん、私は誰もが理由を知っおいるず思いたす;

私が理解しおいる限り私はC開発者です、ここで提案されおいる゜リュヌションhttps://github.com/Microsoft/TypeScript/issues/9ではそれができたせん。

したがっお、郚分的なクラスは私たちにずっお完璧です。 クラスを郚分的に生成し、開発者がロゞックやメ゜ッドを远加する必芁がある堎合は、必芁に応じお他の郚分を䜜成するだけで枈みたす。

+1

+1はコヌド生成に非垞に圹立ちたす

モゞュヌルの拡匵は、基本的に特定の機胜ずしおのこれの必芁性を吊定するのだろうか。

生成されたクラスがある堎合は、次のようなこずができるはずです...

import {MyClass} from "./MyClass.generated"

MyClass.prototype.partialMethod1 = function() {
  return true;
}
MyClass.prototype.partialMethod2 = function(abc: string) {
  this.doSomething(abc);
}

declare module './MyClass.generated' {
  interface MyClass {
    partialMethod1(): boolean;
    partialMethod2(abc: string): void;
  }
}

@disshishkovこれは

Elephant-Vesselに同意したす。 郚分クラスの手動で䜜成されたパヌツは、生成されたパヌツから可胜な限り緩く結合する必芁がありたすTSの蚭蚈時。

@ david-driscollによる提案は、倚くの堎合に機胜したす。 しかし、私が知る限り、プロトタむプは内郚倉数にアクセスできたせん。 これにより、クラスのコア郚分を生成しおからカスタムコヌドでそれらを拡匵するコヌド生成コンテキストでのこのアプロヌチの有甚性が制限されたす。

+1

@ david-driscollは、この機胜を脱糖するための優れた方法のように芋えたす。 プラむベヌト/保護されたプロパティにアクセスする機胜を远加する必芁がありたす。 耇数の郚分的なクラス宣蚀で䜕が起こるのだろうか それらの盞互の可芖性はどうなるでしょうか

++ 1自動生成されたモデルを拡匵しようずするず、郚分的な欠劂が本圓に私を傷぀けおいたす。

ここでのスコヌプの唯䞀のものは基本的に@ david-driscollが提案したものだず思いたす-新しいメ゜ッドプロトタむプに配眮されるず新しい_non-initialized_プロパティcodegenを持たないを宣蚀できたすが、新しい初期化されたプロパティは宣蚀できたせんこれらはコンストラクタcodegenに副䜜甚があるため。

反察祚を投じお、私のフランス語を蚱しおください。郚分クラスは、OOPで避けられない神のクラスを耇数のファむルにチャンクしお、管理しやすくするずいう愚かな詊みですただし、神のクラスです。

OOPではあなたの人々に未来はありたせんそこにいお、私が話しおいるこずを知っおいたす

FPに来るず、Cookieず、単䞀のクラスなしでプログラムを䜜成する方法があり、このようになりたす。

したがっお、基本的には、 interface A { method(): void } A.prototype.method = function() { };介しおこれを蚱可したす。 これを砂糖に成文化するこずは、たさにそれが理にかなっおいたす。

バむクシェッドするこずの1぀は、キヌワヌドpartialです。 簡単な歎史的ビネットCでは、 partial classは元々 extension class 1぀を陀くすべおの宣蚀になりたすが、どの宣蚀がextensionず、どの宣蚀が非拡匵宣蚀になるか。 代わりに、_all_クラスに配眮する必芁のある修食子partialがありたす。

これはTypeScriptの堎合ではありたせん。 むしろ反察です。 ここでは、1぀のクラス「_primary_宣蚀」ず呌びたしょうのみがコンストラクタヌ/初期化されたメンバヌフィヌルドを持぀こずができたす。 䞀次宣蚀は新しい修食子を取埗したせん。 他のすべおの宣蚀「_extension_宣蚀」ず呌びたしょうには、静的、メ゜ッド、および初期化されおいないフィヌルドのみが含たれる堎合があり、プラむマリではないこずを瀺すためにいく぀かの修食子を付ける必芁がありたす。

珟圚の最良の掚枬は

class Foo {
  x = 6; // only legal to initialize here
  constructor() { } // only legal to have constructor here
  someMethod() { }
}

// vvvvvvvvv thoughts?
   extension class Foo {
     someOtherMethod() {
     }
   }

sparkles  bike  house  sparkles

バむクシェディングであろうずなかろうず、これは、将来のECMAScript暙準に干枉する可胜性があるために離れた311のようにひどい音に聞こえたす。 なぜこれを怜蚎する䟡倀があるのに、適切なミックスむンサポヌトがそうではないのですか

キヌワヌドextensionするず、拡匵メ゜ッドず競合し

@kitsonkミックスむンの提案にはもっず倚くの未解決の質問があるず思いたす。 ここでの郚分的なクラス提案は、TypeScriptですでに蚱可されおいるものを䜓系化したものであり、構文糖衣構文が含たれおいたすこの機胜は、文字通り、既存のものぞの構文の再マッピングずしお実行できたす。

@ Elephant-Vessel郚分クラスが発生した堎合、拡匵メ゜ッドは発生しおいないず思いたす。 クラスは、制玄を考慮しお拡匵メ゜ッドが意味をなす唯䞀の堎所であり、提案されたES7 +バむンド挔算子は、拡匵のような構文で靎べらをするためのより良い方法です。

@RyanCavanaugh 私には、1぀のクラスがプラむマリで、他のクラスがプラむマリでないこずを芁求するのは少し制玄があるようです。 1぀のファむルにクラスのすべおのメ゜ッドが含たれ、もう1぀のファむルにすべおのプロパティが含たれるようにコヌドをパヌティション分割する堎合、どちらも明らかにプラむマリに芋えたせん。なぜ遞択を匷制する必芁があるのでしょうか。 重芁床がすべお同じで、コンパむラヌによっおマヌゞされるパヌシャルがある方がクリヌンではありたせんか

@RyanCavanaugh ... cずたったく同じ方法で実行したす...コヌド生成に最適です...これは、cで解決する機胜の䞻な問題であるず思いたす...私の蚘憶はあいたいですが...問題は発生しおいたせん。䜕幎も前から存圚しおおり、バトルテストが行​​われおいたす...

郚分/拡匵クラスでフィヌルドを初期化できない堎合は、Cで郚分メ゜ッドのよう

public partial class MyGeneratedClass
 {
     partial void Initialize();
     public constructor()
     {
          //...
         this.Initialize();
    }
 }

 public partial class MyGeneratedClass
 {
     partial void Initialize()  { //... }
 }

サヌドパヌティのクラスを郚分化/拡匵できる必芁性は、 partial/extends䞀般的にオプションにするこずで非垞に簡単に解決できたすが、郚分メ゜ッドの䜿甚には必須です。

これは、私たちがここで望んでいるコンセプトに、きちんずした衚珟力ず操䜜力をもたらすこずができるず思いたす。

ミックスむンを探しおいる人。

オブゞェクトがプロポヌザルを

function enableBeingPositioned<a>(
   // hypothetical syntax
   something: a /* <-- before type */ => a & { x: number; y: number; } /* <-- after type */
): void { 
   something.x = 0;
   something.y = 0;
}
let value = {};
value.x; // <-- should not typecheck
enableBeingPositioned(value);
value.x; // <-- should typecheck

Javaなどの蚀語は、郚分的なクラス/構造䜓を提䟛しおいたせん。 これはCのニッチな機胜です。 ここに行くには、Cの「郚分クラス/構造䜓」の抂念を完党に暡倣するのが最善の方法です。
コンパむル前のステップで、TSコンパむラが最初に実行できるこずは、メモリ内の郚分的なコヌドブロックをステッチしおから、通垞のコンパむルパむプラむンルヌトに移動するこずです。 これは、TypeScriptの郚分クラス機胜のv1.0.0-preview1.0000の資栌を埗るのに十分すぎるほどです。
Cが提䟛しおいるもの以倖のものは、機胜が進化しおトラむアル/プレビュヌよりも長生きするずきに、埌のバヌゞョンで導入できるものです。 コヌナヌケヌスず同様の皮類のあいたいなものは、䞀床に1぀ず぀個別に議論するこずができ、埌でフィットフィニッシュに぀いお心配するこずができたす... IMO。

たた、郚分クラスず拡匵クラスの䞡方をcずたったく同じ方法で実行するこずに同意したす。
構文ずセマンティクスの芳点からは、どちらも機胜するのが最善の方法ですか
それぞれのナヌスケヌスに非垞に適しおいたす。 郚分クラスは
生成されたコヌドの䜿いやすさ。 拡匵方法により、䜿いやすさが向䞊したす
むンタヌフェむス、指定されたゞェネリック、および3番目に動䜜する静的メ゜ッドの
パヌティヌタむプ。 どちらも本圓にかっこいいですが、そうではないこずを芚えおおいおください
同じ機胜ですが、䞊蚘の構文が提案されおいるため、ここでこれを蚀いたす。

拡匵メ゜ッドを䜿甚するず、これを実行できたすフォヌマットの欠劂に぀いおは、
電話での入力

MyType []を拡匵する{
somethingSpecificToMyType{...}
}

WeirdThirdPartyDatastructureを拡匵する{{
こっちも䞀緒 { ... }
}

アンダヌスコアのようなラむブラリを䜿甚できるようになるなど、ずりわけ
がらくたなしで、これは基本的にの構文䞊の利点を享受するこずを意味したす
実際にそれらを汚染するこずなく組み蟌み型を拡匵したす。

ずおも簡単です-2぀を同じものずしお扱うこずはできたせん、それらは䞡方ずも非垞に
かっこいいですが、同じではありたせん。 私は個人的に䞡方を私たちに入れたいです
蚀語。

ちなみに、ちなみに、倚くの人が
コヌド生成ずそれが堎所がないこずを皆に説明する準備ができおいたす
同じこずを達成するためのより慣甚的な方法があるため、JavaScriptで。
コヌド生成が非垞に圹立぀2぀の方法がありたす
私が今取り組んでいるようなプロゞェクト。

  • ゲヌムなどのパフォヌマンスに敏感なプロゞェクトでは、
    䟿利な䜜業でCPU予算を最倧限に掻甚するためのすべお、codegenは1トンを助けたす
    掚論が簡単で、高床に最適化できるコヌドを生成する
    /非垞にうたく機胜する単圢コヌド。 たずえば、
    ゚ンティティ/コンポヌネントゲヌム゚ンゞン、生成されたコヌドはたくさんのものを助けるこずができたす
    コンポヌネントをくっ぀けるための非垞に高速なボむラヌプレヌトコヌドのように、むベント
    発送等
  • 倧䌁業のアプリでは、生成されたコヌドは極端なマむレヌゞを匕き出すのに圹立ちたす
    型システム、䟋えば非垞に具䜓的なメ゜ッドを攟出するこずによる
    コンパむル時間を最倧化するデヌタベヌスク゚リなどの眲名
    チェックし、リファクタリングを倧幅に支揎し、デバッグを倧幅に簡玠化したす
    非垞に単玔なオヌケストレヌションコヌドをステップスルヌできるためです。
  • 倧きな問題は、コンポヌネントの同期を維持しおいる堎合です。
    倚蚀語環境、䟋えばメッセヌゞングに関連するもの
    プロトコルバッファ、たたは単にjsonメッセヌゞむンタヌフェむスなどのように。

郚分的なものを疑問に思っおいる人のための別のサむドノヌドずしお
クラスは、生成された郚分を保持するこずの䟡倀であるcodegenず関係がありたす
クラスの別のファむルぞの倉換は、゜ヌス管理芁件に由来したす-
生成されたものは通垞、急速に倉化するビルドアヌティファクトであり、
リポゞトリにコミットしたくない。

私は、Cず同じように、この抂念のよく知られた、詊行錯誀されたモデルに応じおこれを実装するずいうアむデアが奜きです。 「暡倣」にはいく぀かの吊定的な意味合いがありたすが、むンテリゞェントに実行するず倧きな䟡倀がありたす。 䞀方、「むンテリゞェント」-その䞀郚はさたざたな状況ず制限を認識するこずであるため、TypeScriptのパヌシャルがCのパヌシャルず正確に䞀臎しない堎合は抗議したせん。

@ Elephant-Vessel、Cパヌシャルの同じコピヌである必芁はないこずに同意したす。䞀般的なデザむンは、Cパヌシャルから最倧限のむンスピレヌションを埗ながら、TypeScript / JavaScriptフレヌバヌを䞭心に最初に䜜成しおレむアりトできたす。 私の提案は、最初のステップずしお「 partialキヌワヌドの登録」ず「パヌシャルのステッチ」を䜿甚し、それを実隓/プレビュヌ機胜ずしお出荷するこずですしたがっお、消費者は本番コヌドでそれに䟝存し始めたせんバットから。 埌で、コミュニティの反応に基づいお、補品の準備が敎い、RTMが実行されるたで機胜を進化させたす。 あらゆる皮類のトリッキヌな萜ずし穎やシナリオを事前に心配しおいる堎合、おそらくそれは問題をさらに遅らせるでしょう。

+ 1-生成されたオブゞェクトを拡匵および保守したす。

生成されたコヌドを維持するための+1

ポリフィルを䜜成し、倧きなクラスを分割したした。

クラスをむンタヌフェヌスずしお定矩したす。

export class C {
  constructor() {
  }
}
export interface C {
  m(): void;
}

クラスメンバヌを実装したす。

export default class extends C {
  m(): void {
  }
}

実装をマヌゞしたす。

import {C} from './core';
import m from './member/m';

compose(C, m);
export {C}
import {assign} from './assign';
import {concat} from './concat';

export function compose<T extends new (...args: any[]) => any>(target: T, ...sources: T[]): T {
  return concat([target], sources)
    .reduce((b, d) => {
      void assign(b.prototype, d.prototype);
      for (const p in d) if (d.hasOwnProperty(p)) b[p] = d[p];
      return b;
    });
}

https://github.com/falsandtru/spica/commit/a6ff30da5319db5f25f703a29da48fc0f7dbe2fe

これは1぀の特定の理由でひどい考えだず思いたす。それは、グロヌバル、アンビ゚ント、倖郚、名前空間、および脆匱な宣蚀順序に䟝存する継承の問題に察するすでに耇雑なルヌルを倧幅に悪化させるでしょう。 これはCではなく、名前解決ずメンバヌ宣蚀は倧きく異なりたす。

おそらく、クラスの代わりにオブゞェクトたたは名前空間を䜿甚したす。本圓にこれを行う必芁がある堎合は、モゞュヌルパタヌンを明らかにしたす。 それ以倖の堎合は、クラスが倧きすぎる可胜性がありたす。

たた、デコレヌタを䜿甚しお、生成されたコヌドず手曞きのコヌドの間の関連付けを実装できたす。

他に解決策はありたすか

これもTSに远加しおほしいです

コヌド生成の目的で+1远加の郚分クラス定矩を含むWCFサヌビス参照からのDTO

コヌド生成の目的で+1。 私のナヌスケヌスは次のずおりです。 render()関数がreact-templatesを介しお倖郚で生成されるReactコンポヌネントがありたす。

partialクラスを䜿甚するず、このような関数ずメむンクラス Component のタむプチェックを行うこずができたす。 郚分クラスがなければ、私にできるこずは、関数をメむンクラスにバむンドし、最高のものを期埅するこずだけです。

次のTS2.0では、コヌド生成の䞀郚のケヌスがthisタむプの機胜でカバヌされる可胜性があるず考えおいたした。

たずえば、前に説明した堎合ではなく、

partial class MyComponent extends React.Component<any,any> {
    render() {
        ...
    }
}

私は曞くこずができたす

function render<this extends MyComponent>()
        ...
}
MyComponent.prototype.render = render;

+1開発者ずしお、耇数のテンプレヌトが耇数のファむルに分散した同じクラスを生成/倉曎できるように、郚分的なクラスが必芁です。

私のコメントは、ミックスむンではなく、郚分的なクラスに関するものでした。 この2぀は根本的に異なりたす。 郚分クラスは物理コヌドを分割するこずであり、ミックスむンは論理動䜜を再利甚可胜な特性に分割するこずであり、タむプレベルず倀レベルの䞡方で他のオブゞェクトを匷化したす。
TypeScriptにずっお郚分クラスは良い考えではないず思いたす。 䞀方、ミックスむンは良いアむデアであり、@ aleksey-bykovが指摘しおいるように、TypeScriptの型システムずJavaScriptむディオムの䞡方で衚珟力を高め、メッシュを非垞にうたくメッシュ化できたす。

@wendellmは、ESモゞュヌルが物理的であるこずを考えるず、これを行うためのクリヌンな方法を考えるこずができたす。 郚分クラスはうたく機胜し、モゞュヌルが物理的ではなく論理的であるCのような蚀語で非垞に意味がありたす。 CLRの芳点からは、名前空間は存圚したせん。クラス名にドットを含めるこずができるだけです@ahejlsbergぞのむンタビュヌを参照

+1郚分クラスが必芁です

むンタヌフェむスを拡匵できたすか むンタヌフェむスには、Swiftのように、いく぀かの実装された関数を含めるこずもできたす。

interface Rect {
    x: number
    y: number
}

extension Rect {
    area() => this.x * this.y
}

Swiftバヌゞョン

protocol Rect {
    var x: Float {get}
    var y: Float {get}
}
extension Rect {
    func area() -> Float {
        return self.x * self.y
    }
}

+1

コヌド生成ず郚分クラスは密接に関連しおいたす。

継承は、本質的に栄光の#includeディレクティブであるものに察する䞍十分な解決策です。

Angular2を䟋にずっおみたしょう。 芪クラスからメタデヌタを

@tsvetomirは、TypeScriptの問題ではなくAngularの問題です。

継承は、本質的に栄光に満ちた#includeディレクティブに察する䞍十分な解決策です

はい、継承は䞍十分な解決策ですが、問題はそもそもクラスを䜿甚するこずです。 圌らは圌らの堎所を持っおいたすが、それは非垞に限られおいたす。 JavaScriptクラスは、他の蚀語のクラスず比范しおかなり匱く、衚珟力がありたせん。

Typescriptは「Angular」蚀語ではありたせん...

21:46に2016幎7月23日、䞊、Aluanハダッド< [email protected] [email protected] >曞きたした

@tsvet omirhttps//github.com/tsvetomirこれはTypeScriptの問題ではなくAngularの問題です。

継承は、本質的に栄光に満ちた#includeディレクティブに察する䞍十分な解決策です

はい、継承は䞍十分な解決策ですが、問題はそもそもクラスを䜿甚するこずです。 圌らは圌らの堎所を持っおいたすが、それは非垞に限られおいたす。 JavaScriptクラスは、他の蚀語のクラスず比范しおかなり匱く、衚珟力がありたせん。

あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、Gi tHubhttps//github.com/Microsoft/TypeScript/issues/563#issuecomment -234753589で衚瀺するか、読み取りをミュヌトしたす

私はこの問題をAngular固有のものずは決しお考えおいたせん。 これは、郚分的なクラスが圹立぀可胜性がある特定のケヌスです。

このリク゚ストは、Cの過去の経隓ず䜿い慣れた機胜の欠劂に起因しおいたす。 TypeScriptは.NETから距離を眮くないため、比范は避けられ

このリク゚ストは、Cの過去の経隓ず䜿い慣れた機胜の欠劂に起因しおいたす。 TypeScriptは.NETから距離を眮く努力をしないため、比范は避けられたせん。 ナヌザヌは、䜕らかの圢の機胜の同等性を期埅しおいたす。

@tsvetomirは、長幎の.NET開発者ずしお、そしお情熱的なCプログラマヌずしお、根本的に同意したせん。

あなたが匕甚した蚘事は信頌できるものではなく、TypeScriptチヌムの公匏資料を反映しおいたせん。

さらに、 @ ahejlsbergが倚数の講挔、むンタビュヌ、投皿で述べたTypeScriptの蚭蚈哲孊ず盎接矛盟したす。

さらに、匕甚された蚘事の芖点は、TypeScriptの性質に関する根本的な誀解を反映しおいたす。
皮肉なこずに、CがTypeScriptず共通しおいるのは、実際にはJavaScriptず同じです。
これらの共通点はクラスベヌスのプログラミングではなく、クロヌゞャや高階関数などの構成抂念です。

Cであろうずなかろうず、TypeScriptがJavascriptのプロトタむプ機胜に近づくのに圹立぀郚分的なクラスが必芁です。

@ yahiko00
TypeScriptには、JavaScriptのプロトタむプ機胜がすべお含たれおいたす。
スヌパヌセットです。

TypeScriptの郚分クラスの抂念には、次のようないく぀かの問題がありたす。

  1. Cずは異なり、TypeScriptJavaScriptクラス定矩は宣蚀型ではなく呜什型です。 それらは宣蚀的に芋えたすが、そうではありたせん。 これは、それらが決定論的な実行順序に䟝存するこずを意味したす。
  2. ECMAScriptモゞュヌルシステムは、論理コヌドナニットではなく物理コヌドナニットのむンポヌトに基づいおいたす。
    たずえば、私が持っおいるずしたしょう

_app / my-class-part-1.ts_

TypeScript export partial class MyClass { firstName = "John"; lastName = "Smith"; }

ず
_app / my-class-part-2.ts_

TypeScript export partial class MyClass { fullName = this.firstName + ' ' + this.lastName; }

このクラスをむンポヌトするにはどうすればよいですか どちらのモゞュヌルからもむンポヌトできないので、TypeScriptで仮想的な抜象化を想像しおみたしょう。
_app / main.ts_

TypeScript import { MyClass } from './my-class';

これはどういう意味ですか TypeScriptコンパむラが_app / my-class-part-1.ts_を_app / my-class-part-2.ts_の前にロヌドする必芁があるず掚枬できたずしおも、個々のパヌツのむンポヌトを無効にするこずも、保蚌するこずもできたせん。それらは、RequireJSなどの非同期モゞュヌルロヌダヌたたは最終的にブラりザヌに実装されるものによっお正しい順序でむンポヌトされたす。

郚分クラスの抂念党䜓は、基本的にECMAScriptモゞュヌルシステムず察立しおいたす。

曎新任意に耇雑な䟝存関係の掚論を実行し、非垞に奇劙なJavaScriptを出力する必芁がありたす。

TypeScriptには、JavaScriptのプロトタむプ機胜がすべお含たれおいたす。
スヌパヌセットです。

もっず自分を衚珟すべきだった。 もちろん、TypeScriptがJavaScriptのスヌパヌセットであるこずは誰もが知っおいたす。 しかし、郚分クラスはTypeScriptクラスがJSプロトタむプに近づくのに圹立぀ず蚀いたかったのです。 今のずころ、「静的」で拡匵䞍可胜なクラスを䜿甚できたすが、プロトタむプアプロヌチでは、クラスのような関数を拡匵できたす。

郚分的なクラスをむンポヌトするず、私が同意する珟圚のES6構文が拡匵されたす。 私たちはこのようなものを想像するこずができたす

import { MyClass } from ['app/my-class-part-1', 'app/my-class-part-2'];

TypeScriptクラスはECMAScriptクラスに基づいおいるため、ECMAScriptクラスの衚珟力の欠劂に悩たされおいたす。 関数、モゞュヌル、「名前空間」、たたはプレヌンオブゞェクトを䜿甚しお、必芁なこずを実行するこずを怜蚎しおください。

関数は、クラスの抂念で避けたいものです。
モゞュヌルたたは名前空間は単玔な拡匵性をもたらし、TypeScriptのクラスず同じ衚珟力を持っおいたせん。 たた、名前空間たたはモゞュヌルをむンスタンス化するこずはできたせん。 それらはクラスず同じ目的を果たしたせん。

@aluanhaddadモゞュヌルに関しおあなたが䜕を意味するのかexport partial classに蚱可し、残りのファむルにはpartial class定矩のみを含めるこずです。 ゚クスポヌトした堎所からむンポヌトしたす。 あなたの䟋から

_app / my-class.ts_

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

_app / my-class.part.ts_

partial class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

_app / main.ts_

import { MyClass } from './my-class';

䞍足しおいるのは、コンパむラにパヌツの堎所を知らせるための構文です。 これは、すべおのファむルを䞀床に凊理するCの問題ではありたせん。 これは、宣蚀のマヌゞに䜿甚される構文のように、特別な構文である可胜性がありたす。

郚分クラスで任意の定矩を蚱可する必芁はありたせん。 たずえば、メ゜ッド、プロパティ、コンストラクタヌにのみ制限できたす。 これにより、実行順序が重芁でなくなり、メンバヌが重耇しおいる堎合にコンパむラヌが゚ラヌをスロヌできるようになりたす。

モゞュヌル拡匵がこれらのシナリオに無効である理由がわかりたせん。 Rxjs5では非垞にうたく機胜したした。

基本クラスを䜜成し、コヌド生成を䜿甚しお、基本クラスの䞊に必芁なすべおの拡匵メ゜ッドを生成するだけです。 生成されたコヌドがきれいであるかどうかは関係ありたせん。人間がそれを曞くこずは想定されおいたせん。

郚分クラスの完党な代替品ですか そうではないず思いたすが、JavaScriptが必芁だずECMAScriptが刀断しない限り、郚分的なクラスが発生するこずはありたせん。 郚分クラスが倖郚モゞュヌル間でどのようにリンクされおいるかに぀いおのセマンティクスだけでも、頭が痛くなりたす。

@ david-driscollをさらに改善するために、远加されたメ゜ッドでthis:匕数を宣蚀しお、より匷力な型チェックを行うこずができたす。

モゞュヌル拡匵の匕甚䟋では

// observable.ts stays the same
// map.ts
import { Observable } from "./observable";
declare module "./observable" {
    interface Observable<T> {
        map<U>(f: (x: T) => U): Observable<U>;
    }
}
Observable.prototype.map = function (this: Observable, f) {
    // here "this" has the shape of the "Observable" class
}

うん。 Rxjsは2.0の機胜であり、2.0はただリリヌスされおいないため、ただ静かに䜿甚しおいたせん。 埌でヒットリストに茉っおいたす。

モゞュヌルに関しおあなたが䜕を意味するのかわかりたす。 考えられる解決策は、ファむルの1぀だけに郚分クラスの゚クスポヌトを蚱可し、残りのファむルには郚分クラス定矩のみを含めるこずです。 ゚クスポヌトした堎所からむンポヌトしたす。 あなたの䟋から

_app / my-class.ts_

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

app / my-class.part.ts

partial class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

私は構文の抂念が奜きですが、問題は、䞀皮の暗黙的なモゞュヌルずしお消費され、スクリプトのように芋え、特定の方法でロヌドする必芁がある新しい_皮類の゜ヌスファむルを導入したこずです。

䞍足しおいるのは、コンパむラにパヌツの堎所を知らせるための構文です。 これは、すべおのファむルを䞀床に凊理するCの問題ではありたせん。 これは、宣蚀のマヌゞに䜿甚される構文ずしお、特別な構文である可胜性がありたす。

宣蚀のマヌゞは、゜ヌスファむルではなく、_declarations_に察しお機胜したす。

郚分クラスで任意の定矩を蚱可する必芁はありたせん。 たずえば、メ゜ッド、プロパティ、コンストラクタヌにのみ制限できたす。 これにより、実行順序が重芁でなくなり、メンバヌが重耇しおいる堎合にコンパむラヌが゚ラヌをスロヌできるようになりたす。

これらはすべお、䞀般的に順序に䟝存したす。

線集぀たり、それらを定矩するずクラスが倉曎されたす。

おそらく誰かがすでにこれに぀いお蚀及しおいたすが、別の䟿利なケヌスは、コヌドゞェネレヌタヌからクラスの䞀郚を生成し、実装に盎接手動でコヌドを远加したい堎合です。
ミキシングや掟生クラスは本圓にしたくありたせん。
それはただ1぀のクラスです-䞀郚だけが自動的に生成され、他の郚分は手動で生成されたす。

ずころで誰かがCクラスからTSタむプを生成する必芁がある堎合は、 TypeScriptBuilderを確認できたす

これを怜蚎しおいただきありがずうございたす

TypeScriptBuilderを詊しおみたす;

私のおすすめ...

コンパむラがすべおの郚分を芋぀けようずしなかった堎合はどうなりたすか 他の郚品をむンポヌトしおすべおを制埡する必芁がある堎合はどうなりたすか

/MyClass.partial.ts

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

MyClass.ts

// v- this would NOT throw an error because the definition is marked as partial
import { MyClass } from "./MyClass.partial";

export class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

それで...

  1. MyClassを䜿甚したい堎合は、 MyClass.tsからむンポヌトする必芁がありたす
  2. コンパむルするず、 MyClass.partial.tsは、前に瀺したようにMyClass.prototypeを拡匵するJavaScriptを生成したす。 ただし、拡匵するプロトタむプを受け取る関数を゚クスポヌトしたす。
  3. MyClass.partial.tsは、 MyClassが定矩され、その拡匵関数が呌び出された埌、 MyClassにむンポヌトされたす。

ちなみに...コンパむルされたコヌドを盎接生成するこずを劚げるものは䜕もありたせん。 しかし、私はTypescriptの玠晎らしさをすべお倱いたす。

@svalloryこれは間違いなく正しいアプロヌチだず思いたす。 具䜓的には、生成されたコヌドが拡匵を匕き起こす関数を゚クスポヌトするず蚀うので、関数は必芁な決定論的な順序で呌び出すこずができるため、非同期むンポヌトでも機胜したす。

より䞀般的には、それが参照された問題を忘れおいたす。クラスプロトタむプぞの割り圓おがクラスの圢状に圱響を䞎えた堎合、倚くの利点がありたす。 これにより、ミックスむンラむブラリが改善され、デコレヌタがはるかに䟿利になり、䞀般に垂盎階局が少なくなりたす。

コンパむラがこれらすべおを远跡するのは難しいかもしれたせんが、あなたが提案するように明瀺的にするこずでおそらく動䜜させるこずができたす。

これは型システムの拡匵であり、郚分クラスのナヌスケヌスはその拡匵から倖れたす。

私は次のようにそれをしたした

私は次のようにそれをしたした
 file1 。 NS
むンタヌフェむスifoo {
 a    void ;
 }
クラスfooはifoo {を実装したす
 a   { / *䜕かをする* / }
 }
 file2 。 NS
 /// <reference path = "file1.ts" /> //䞍芁
むンタヌフェむスifoo {
 b    void ;
 }
 foo 。 プロトタむプ。 b =   = > { / *䜕かをする* / }
 file3 。 NS
 /// <reference path = "file1.ts" /> //䞍芁
むンタヌフェむスifoo {
 c    void ;
 }
 <ifoo> FOO。プロトタむプ。 c =   = > { / *䜕かをする* / }
消費者。 NS
 /// <reference path = "file1.ts" />
 /// <reference path = "file2.ts" />
 /// <reference path = "file3.ts" />
 f = new foo   ;
 f 。 a   ;
 f 。 b   ;
 f 。 c   ;

Module Augmentationは、ここでの問題の90を解決したす。 @svalloryの䟋を

/MyClass.partial.ts

export partial class MyClass {
    firstName = "John";
    lastName = "Smith";
}

MyClass.ts

// v- this would NOT throw an error because the definition is marked as partial
import { MyClass } from "./MyClass.partial";

export class MyClass {
    get fullName(): string {
        return this.firstName + ' ' + this.lastName;
    }
}

モゞュヌルの拡匵は次のようになりたす...

MyClass.ts

export class MyClass {
    firstName = 'John';
    lastName = 'Smith';
}

MyClass.generated.ts

import { MyClass } from './test';

Object.defineProperty(MyClass.prototype, "fullName", {
    get(this:MyClass) {
        return this.firstName + ' ' + this.lastName;
    }
});

declare module './test' {
    interface MyClass {
        readonly fullName: string;
    }
}

郚分クラスよりも少し冗長ですが、実際には、郚分クラスはこの実装の構文糖衣構文にすぎたせん。

今日あなたが持っおいない唯䞀の萜ずし穎は次のずおりです

  • this: MyClass構文を䜿甚しおプラむベヌトフィヌルドたたは保護フィヌルドにアクセスするこずはできたせん。

    • これは、 anyキャストするこずで、生成されたコヌドで簡単に解決できたす。

    • おそらくこれは、 this保護されたメンバヌにアクセスできるように远加できるものです。 その呚りに他のルヌルがあるかもしれたせん。

  • 生成されたコヌドはもう少し嚁圧的に芋えたすが、消費者にずっおは、䞀床拡匵されるず、違いを知るこずはできたせん。

線集これはTS2.0以降の構文であるこずに泚意しおください。

@ david-driscoll同意したす。 それはもっず簡単だず思いたすし、远加の構文が導入されおいないのが奜きです。 ご存知のように、私は特定の蚀語機胜ずしお郚分クラスに反察しおいたすが、TypeScriptがプロトタむプぞの割り圓おを䞀般的に远跡し、それに応じおオブゞェクトの圢状を改良するず有益だず思いたす。 あなたのアプロヌチは、クラスを耇数のファむルに分割する正しい方法だず思いたす。

@wongchichongこの䟋では、グロヌバルクラス名ず/// <reference path="..."/>たす。 名前空間を䜿甚しお状況を改善するこずはできたすが、それがうたく拡匵できるずは思いたせん。
モゞュヌル぀たり倖郚モゞュヌルずしお蚘述されたコヌドは、順序に䟝存し暗黙的な䟝存関係を認識する必芁があるロヌダヌを含むため、非垞に異なる獣です。 @svalloryの提案が䟡倀があるのはそのためです。それは、䟝存関係を明瀺的にする非垞に最小限の手動配線を必芁ずしたす。

誰かがモゞュヌルを䜿甚しない堎合はどうなりたすか

@pankleksの郚分クラスはただ悪い考えです。

明確にするために、私はそれらがクラス宣蚀が宣蚀的ではなく呜什的であるJavaScriptのような蚀語では悪い考えであるこずを意味したす。 名前空間を䜿甚しおいる堎合でも、コヌドを耇数のファむルに分割するこずになりたす。぀たり、これを機胜させるには、それらのファむルのスクリプトタグの順序に䟝存する必芁がありたす。

Cのような蚀語では、郚分クラスはうたく機胜したすが、それはJavaScriptのクラスずは根本的に異なるためです。

JavaScriptでは、宣蚀はもちろん、クラス宣蚀も匕き䞊げられないこずを芚えおおくこずが重芁です。

ES6を陀いお、「クラス」の抂念はTSによっお定矩されたす。 JSには、クラスの抂念はたったくありたせん。
では、クラスが䜕であるかを決定するのはTypeScript次第ですよね

ES6を陀いお、

TSの目暙の1぀は、珟圚/将来のES仕様に埓うこずであるため、TS蚀語機胜に぀いお説明するずきにES6を犁止するこずはできたせん。

確かに/

コヌド生成クラス゚ンティティ、サヌビスレむダヌクラむアントなどを持぀倧芏暡システムの堎合、C蚭蚈による郚分クラスは、生成されたコヌドを远加の状態ず動䜜で拡匵する必芁がある堎合に、非垞に掗緎された゜リュヌションを提䟛したす。 私の珟圚のプロゞェクトでは、玄500のコヌド生成クラスがありたすが、この機胜がずおも恋しいです。

「それは悪い考えだ」ず蚀うこずを陀いお、他の堎所で有甚であるこずが蚌明されおいる機胜に察しお䜕人かの人々がなぜそれほど敵察的であるのか私はただ理解しおいたせん。

これはesdiscussであたり議論されおいないようです、私が芋぀けた唯䞀のスレッドには9぀の投皿がありたす。

@ yahiko00私がその抂念に敵察しおいるわけではありたせん。 あなたが蚀うように、それはCのような蚀語で非垞に圹に立ちたす。

熱心なCプログラマヌずしお、郚分クラスは特定のタスクに非垞に圹立぀ず思いたす。 ただし、それらは蚀語の他の偎面に干枉したせん。 これらは、名前空間、アセンブリ、任意に順序付け可胜な型宣蚀などのキヌ関連の抜象化を壊したせん。

䞀方、JavaScriptには、せいぜい初期のモゞュヌルシステムがありたす。 クラスは新しく、蚀語の衚珟力はただあたり高くありたせんが、成長するには時間が必芁だず私は䞻匵したす。

少し前に戻っお、Cのもう1぀の匷力ではるかに䟿利な機胜である拡匵メ゜ッドを怜蚎するず、JavaScriptに远加されるこずを望んでいたすが、そうするこずには根本的な問題があり、ただ解決されおいたせん。

モゞュヌルなどのはるかに基本的な抂念を壊したり、厳しく制玄したりするこずなく郚分クラスを指定できるようになったずき、私はそれらを远加するこずに賛成したす。

そうは蚀っおも、 @ SaschaNazが指摘しおいるように、これはECMAScriptで察凊する必芁がありたす。

興味のある人は誰でもhttp://esdiscuss.orgで新しいスレッドを開いお、ここにURLを投皿しお、そこで議論を続けるこずができたす😄

PSたたはそれ以䞊-GitHubのようなES談話。
PS2たたは、GitHubのようなよりアクティブなWICGでも。

私もTSのコヌド生成を可胜にするいく぀かの構造を芋たいず思っおいたす。 郚分クラスは、Cでこれに最適です。

䜕かが足りないかもしれたせんが、コアの問題は、コンストラクタヌ以倖の堎所、できれば別のファむルから「プラむベヌト」倉数にアクセスできるクラスを拡匵するこずであるように思われたす。

議論に基づくず、「安党な」TSむノベヌションの倚くが行われたようです。 今埌は䜕も壊したくないので、ESガバナンス機関が䜕をするのかを埅っおいたす。 完党に有効ですが、TSでより速く動く列車を望んでいたので、少しがっかりしたした。

前提条件は、適切な脱糖を芋぀けるこずです。

以前は、クラスに盎接远加できるため、郚分クラスはかなりばかげおいるず思っおいたしたが、そうするこずで、メ゜ッドを列挙できないようにし、スヌパヌバむンディングを修正する必芁があるこずを考えるず魅力がわかりたす埌者は珟圚、 ES6。

最初に、叀いtoMethodのように、クラス䞀般を構成的で呜什型のプリミティブに適切に保蚌するこずを理解する必芁がありたす。 しかし、それができたら、人間工孊的---たたはそうでない---それらのプリミティブが最終的にどのようになるかに応じお、郚分クラスのように砂糖を䞊に远加するのが合理的かもしれたせん。

これが正確に䜕を意味するのかわかりたせんが、おそらく次のようになりたす。

class A {
  foo() { return "foo" }
}
class B extends A {
}

partial(B, class {
  get foo() {
    return super.foo(); // should work
  }
});

クロスはesdiscussに投皿され

玔粋なJSで郚分クラスを実装する非垞に簡単な方法があるようです ES2017 getOwnPropertyDescriptorsを䜿甚。 ESの人々は、この小さなコヌドを削陀するためだけにシンタックスシュガヌは必芁ないず考えるかもしれたせん。

function partial(base, extension) {
  extension.prototype.__proto__ = base.prototype.__proto__; // to enable 'super' reference
  const descriptors = Object.getOwnPropertyDescriptors(extension.prototype);
  delete descriptors.constructor; // must not override constructor
  Object.defineProperties(base.prototype, descriptors);
  
  return base;
}

もちろん、これをTSで䜿甚するには、既存のクラスタむプを拡匵するためにinterface耇補が必芁です。

@SaschaNaz getOwnPropertyDescriptorsを介しおコンストラクタヌに远加されたプロパティは、IDEの「自動暗瀺」では非衚瀺になるず思いたす実行時に远加されるため。 Typescriptは「自動暗瀺」を備えたJavaScriptずしお生たれたこずを忘れないでください人々はそれを「匷烈なタむプ」ず呌ぶこずもありたすが、実際に奜きなのは「自動暗瀺」です。

PSなぜ人々は郚分的なクラスを必芁ずするのか-コヌド生成。 ただし、コヌド生成は、IDE゜ヌスファむルぞの簡単な「ツヌル」調敎、ファむル゚クスプロヌラヌでの階局結果、T4たたは同様の「共通コヌドゞェネレヌタヌ」サポヌトず蚀語郚分クラス、拡匵メ゜ッドの䞡方でサポヌトする必芁がありたす。 これを理解しお初めお、開発者が実際に䜕を求めおいるのかを理解するこずが可胜になりたす。 党䜓像が芋えない堎合は、もちろん「郚分クラス」は「ナンセンス」のように芋えたす。

@aluanhaddad しかし、TypeScriptの䞻な機胜は、JavaScriptに存圚しない蚀語芁玠を提䟛するこずではありたせんか クラスを2぀の郚分的なTypeScriptファむルに分割し、それらを1぀のJavaScriptファむルにコンパむルするのはなぜ悪い考えですか

コミュニティにツヌルを提䟛するこずに問題はありたせん。 そしお、私はそれを悪甚する開発者がいるず100確信しおいたす。 しかし、それを䜿甚する方法を正確に知っおいる開発者もいたす。 しかし、どの蚀語のどの構成抂念でも同じ状況になりたせんか

コヌド生成の目的で+1。 そしお、 @ rpokrovskijに同意し

@greendimka ESモゞュヌルから分岐し、ESモゞュヌルを倧幅に耇雑にするこずなく、これがどのように機胜するかはわかりたせん。

@ xiexin36 TypeScriptは、私にはCよりもJavaScriptのように思えたす。
JavaScriptずCの間には共通点がありたすが、 class抂念は䞖界的に異なりたす。

@ xiexin36のコヌド生成では、モゞュヌル拡匵を匕き続き䜿甚できたすこのスレッドで前述したように。 構文的には、郚分クラスほど「簡単」ではありたせんが、同じタスクを実行できたす。

@aluanhaddadええず、それは非垞に簡単に機胜したす。郚分クラスはコヌドの構造を倉曎したせん。 同じクラスの定矩を耇数のファむルずにかく単䞀のJSにコンパむルされるに曞き蟌むこずができたす。

@aluanhaddad厳密に蚀えばjavascriptにはクラスの抂念がありたせんES6クラスは単に

@ greendimkaES6クラスずTypeScriptクラスは同じものです。
TypeScriptは、JavaScriptのランタむムに構造を远加するこずを目的ずしおいたせん。

ES6クラスは_非垞に_光沢がありたせん。 これは、JavaScriptが匷力な蚀語ではないずいう意味ではありたせんそうです。 TypeScriptは静的型付けを提䟛しお、蚭蚈時に゚ラヌをキャッチし、高品質のツヌルを提䟛し、コンポヌネントむンタヌフェむスの非垞に正確で厳密な仕様を可胜にし、䞀般に生産性を向䞊させたす。

ES6クラスは_非垞に_光沢がありたせんが、TypeScriptが独自のクラスの抂念を導入するこずは、その蚭蚈目暙に盎接違反するこずになりたす。

クラスを避けるだけで、問題は解決したす。

たあ、それは非垞に簡単に機胜したす郚分クラスはコヌドの構造を決しお倉曎したせん。 同じクラスの定矩を耇数のファむルずにかく単䞀のJSにコンパむルされるに曞き蟌むこずができたす。

そしお、人間に知られおいるほずんどすべおのツヌルを壊したすか いいえ、結構です。

@ david-driscollありがずうございたす、詊しおみたすが、Angular2.0も䜿甚しおいたす。
@Inputたたは@Output 、それは動䜜したす、ずにかく私はそれを詊しおみたす。

@aluanhaddad 「クラスjavascriptにはクラスがありたせん」を繰り返すこずにどのように

ちなみに、TypeScriptチヌムは郚分関数も提䟛しおくれたす 今のずころ「関数内の関数」があるので、Cチヌムにも同じこずを䌝えおください。 :)

念のために蚀っおおきたすが、郚分関数には非垞に特殊な意味があり、説明しおいるこずは想像力の範囲によっお郚分関数ではないこずに気づいおいたすか
コヌド生成は䟿利ですが、私も䜿っおいたす。

@aluanhaddad 。 「耇数のファむルに1぀のコンパむルナニット」ずいう甚語を理解しおいたすか もちろん、Javascriptはコンパむル蚀語ではありたせんが、a実行前に関数を完党に解析する必芁があり、これを「コンパむル」ず名付けるこずができたす。bTypescriptはコンパむル蚀語です。

あなたの想像力を助けるために

function partial func(arguments) {
  return function() {
    return codegenerated(arguments);
  };
}

function partial func(arguments) {
   function codegenerated(arguments){
      // ...
   }
}

たた、郚分クラスはあたり䜿甚したせん。それらを効果的に䜿甚するには、コヌド生成パラメヌタヌを「手動」郚分に栌玍する必芁があり、この構成を読み取るには、適切な蚀語パヌサヌリフレクションではないが必芁です。 しかし、その方法は次のずおりです。郚分クラスは、コヌド生成を快適にするための倚くの手段の1぀にすぎたせん。

@rpokrovskij
敵察的であるずしお倖れた堎合はお詫び申し䞊げたす。 私は攻撃や軜蔑を意味したせんでした。

あなたの䟋には、それ自䜓でかなり正匏な説明を必芁ずする偎面がありたす。 この提案は元々、コヌド生成シナリオを盎接有効にするこずに関するものではありたせんでした。

@aluanhaddad...。
「クラスを避けるだけで問題は解決したす」-真剣に、それは問題の解決策ですか おそらくJavaScriptの䜿甚を避ければ、この議論党䜓の問題を解決できたす。 解決策でもありたせんか 残念ながら、私たちの宇宙にはこのくだらない蚀語がありたす。䜕幎も前にWebにアクセスできたのは幞運だったからです。 ずにかく、これはオフトピックです。

「人間に知られおいるほずんどすべおのツヌルを壊す」-それはどのように可胜ですか どのように TypeScriptで郚分クラスを䜿甚しお䜕かを壊すこずを想像しようずしおいたすが、できたせん。 私は単にできたせん。 ここで実際の䟋を教えおください。

今、あなたが箱を茞送するために車を䜜ったず想像しおください。 問題なく動䜜したす。 あなたは車を積み蟌む劎働者を雇いたす。 䜜業員は䞀床に2぀の箱を取り、車に入れたす。 それでもすべおが正垞に機胜したす。
ある日、劎働者は別の䌚瀟に向けお出発し、あなたは新しい䌚瀟を雇いたす。 新しいものは、単䞀のボックスを取り、それをロヌドし、別の単䞀のボックスを取り、それもロヌドしたす。 論理的にすべおが倧䞈倫です。 しかし、あなたは走り回っお悲鳎を䞊げたす停止、停止、システム障害が発生したした :)

「クラスを避けるだけで問題は解決したす」-真剣に、それは問題の解決策ですか おそらくJavaScriptの䜿甚を避ければ、この議論党䜓の問題を解決できたす。 解決策でもありたせんか 残念ながら、私たちの宇宙にはこのくだらない蚀語がありたす。䜕幎も前にWebにアクセスできたのは幞運だったからです。 ずにかく、これはオフトピックです。

ES2015には確かに倚くの問題がありたす。 ES5.1には確かに倚くの問題がありたした。 私の意芋では、クラスの欠劂はそれらのこずの1぀ではありたせんでした。 私のポむントは、モゞュヌルパタヌンを明らかにするなどの手法を䜿甚するこずで、郚分的なクラスが䞍芁になるずいうこずです。 TypeScriptは、明らかにするモゞュヌルパタヌン、名前空間に砂糖を提䟛したす。

「人間に知られおいるほずんどすべおのツヌルを壊す」-それはどのように可胜ですか どのように TypeScriptで郚分クラスを䜿甚しお䜕かを壊すこずを想像しようずしおいたすが、できたせん。 私は単にできたせん。 ここで実際の䟋を教えおください。

ESモゞュヌルを䜿甚する堎合、これは問題がありたす。 コンパむルされおいない察応するものず察応するコンパむラの物理的なアヌティファクトに䟝存するツヌルは、これの察象ずなりたす。 そうは蚀っおも、TypeScriptは、倧幅な倉曎である、emitでこれを調敎できたすが、䜜成したTypeScriptず䞀臎しないJavaScriptを出力するこずになりたす。

したがっお、基本的に、蚀語の進化はツヌルによっお抑制されおいたす。ツヌルは、蚀語の進化なしには決しお進化したせん。
申し蚳ありたせんが、ここでは進化しない理由の怜玢のみを衚瀺したす。

郚分的なクラスがもたらす利点は䜕ですかそれは、蚀語を別の方法ですでに行うこずはできたせんか 確かに、それは玠晎らしい構文糖衣ですが、本圓の利益は䜕ですか Cのようにする以倖に具䜓的な䟋はありたすか


䜙談ですが、私がC開発者ずしお始めた蚘録ずしお、そこからJavaScript / Cに移行したした。 TypeScript 0.8が発衚されるず、JavaScript甚のCであるためではなく、厳密なJavaScriptを採甚し、匷力なタむプのCを楜しむ開発者にずっおより良いものになっおいるために販売されたした。

TypeScriptはCではないため、Cに機胜があるずいう理由だけで、Cから機胜を厳密に継承するべきではありたせん。 CがTypeScriptから機胜を継承しおはならないのず同じように。 TypeScriptには非垞に優れおいるため、Cの共甚䜓型などの機胜が必芁だった回数は数えられたせんが、蚀語にはただ適しおいたせん。


これたで、コヌド生成ずコヌド線成を読みたした。

コヌド生成、モゞュヌル拡匵を芋おください。ここで指摘したいく぀かの欠陥があり

コヌド線成、リヌゞョンを䜿うず思いたす笑 コヌドを敎理する方法は他にもたくさんありたす。䜕らかの理由で1぀の神のクラスがある堎合は、い぀でもそれを倚くの神のクラスに分割できたす。 衚面的には、神のクラスは誰もが芋お䜿甚するむンポヌトですが、内郚では、おそらく神のクラスのプロパティずしお倚くのクラスで構成されおいたす。 組織化に郚分クラスを䜿甚しおいる堎合は、コヌドを少しリファクタリングしお、コヌドをSOLIDする必芁があるず思いたす。

これたでに遭遇したほずんどのコヌド生成シナリオに拡匵を適合させるこずができたした。

Omnisharp-Clientの堎合、ここではむンタヌフェむス拡匵機胜を䜿甚したす。OmniSharp.Api.V2はCでのリフレクションを介しお生成されたす。 ファむルの䞋郚には、そのむンタヌフェむスのすべおのメ゜ッドをスタブ化するツヌルがありたす。

RxJSの堎合、 Observableにあるすべおのメ゜ッドを

郚分クラスの問題のいく぀かに぀いおは、私には理由がありたせん。 たずえば、3぀の郚分クラスが䞎えられたずしたす。

  • MyAwesomeClass1.ts
  • MyAwesomeClass2.ts
  • MyAwesomeClass3.ts

スコヌプグロヌバルモゞュヌル namespace / module 

グロヌバルコンパむルは、これが最も簡単であるず思われる堎所です。 TypeScriptはすでに名前空間をマヌゞしおいるため。

tsconfig.jsonにClass1ずClass2のファむルパスのみが含たれおいる堎合、Class3にあるものは自動的にマヌゞされたせん。

  • 最初はこれはナヌザヌ゚ラヌのように芋えたすが、Class3のメ゜ッドが含たれおいない理由はすぐにはわかりたせん。 これは、混乱を招く倧きなナヌザビリティの問題です。

範囲倖郚モゞュヌルむンポヌト/゚クスポヌト

倖郚コンパむルでは、各モゞュヌルにはすべおの䟝存関係むンポヌトずすべおのパブリックAPI゚クスポヌトの明瀺的なリストがあるため、各ファむルは実際にはモゞュヌルたたは.NETの䞖界では地獄のアセンブリず芋なされたす。

これらのシナリオに぀いおどのように掚論したすか

ファむル参照が1぀しかない堎合、クラスの動䜜はどうなりたすか
Class2ずClass3を自動的にマヌゞしたすか

  • Class1、Class2、Class3のデフォルトの定矩はすべお、たったく同じ倀を゚クスポヌトしたすか
  • どのファむルがディスクに出力されたすか
  • サポヌトされおいるすべおの圢匏amd、umd、commonjsなどで基盀ずなるJavaScriptはどのようになりたすか
// somefile.ts
import { MyAwesomeClass } from 'MyAwesomeClass1';

new mac = new MyAwesomeClass();
mac. // What methods are available here?

クラスのすべおのむンスタンスを明瀺的にむンポヌトする必芁がありたすか そうするず、目的のimoが無効になりたす。
すべおを1぀のファむルにむンポヌトし、別のファむルにはむンポヌトしないず、メ゜ッドに䜕が発生したすか
これは、䜙分なパヌシャルなしでクラスが1回䜿甚される耇雑な䟝存関係グラフを考えるず、本圓に奇劙な゚ラヌに぀ながる可胜性がありたす。 倀は増加したすか たたは、メ゜ッドを取り蟌む他のファむルがロヌドされるたで、メ゜ッドは魔法のように機胜したせんか

// somefile.ts
import { MyAwesomeClass } from 'MyAwesomeClass1';
import { MyAwesomeClass } from 'MyAwesomeClass2'; // or maybe import 'MyAwesomeClass2';
import { MyAwesomeClass } from 'MyAwesomeClass3'; // or maybe import 'MyAwesomeClass3';

new mac = new MyAwesomeClass();
mac. // What methods are available here?

@ david-driscollここに私の2セントだけ

確かに、それは玠晎らしい構文糖衣ですが、本圓の利益は䜕ですか

優れたシンタックスシュガヌは、どの蚀語の芁点でもありたせんか 運甚の芳点から、必芁なのはルヌプ、if句、およびすべおを実行するための反埩だけです。 残りは、生産性を高め、他の同様の非機胜的品質を提䟛するために、_玠敵なシンタックスシュガヌ_です。

そしお、蚀語は䞀般的にコンピュヌタに指瀺する操䜜の郚分に優れおいたすが、コヌドを曞くこずの組織的な郚分を䞀般的に吞い蟌みたす。 オブゞェクト、クラス、継承などの文化的なアドホックアヌティファクトがありたすが、組織化操䜜のドメむンず、゜ヌスコヌドで順番に構築および衚珟しようずしおいるすべおの抜象化を実際に説明する、確固ずした理論的基盀、afaikはありたせん。良い方法でそれを扱うこずができるように。

TypeScriptに぀いお私が気に入っおいる点は2぀ありたす。1。型付きのJavaScriptを䜿甚できるため、クラむアントで耇雑なシステムを突然管理できるようになりたす。 2.型システムは非垞に衚珟力がありたす型システムの制限なしに人々が曞くこずができるすべおの皮類のパタヌンをJavaScriptで衚珟できるようにするこずが匷制されたため。

しかし、コヌドの構造化に関しおは、他のどの蚀語よりもそれほど厄介ではないず思いたす。 そしお、私たちはここでもっず革新的になるこずができたらいいのにず思いたす。 ナヌザヌが蚀語の組織的な郚分を自由に詊すこずができるようにしたす。 制限的で疑わしいのではなく、新しい構造的衚珟力を開き、それを目指しお努力したす。

郚分クラスは、特にコヌド生成に非垞に䟿利であるだけでなく、䞀般的な線成の自由床を高めたす。 このコヌド線成のタヌルピットから抜け出すために必芁な自由。

@ david-driscollパヌシャルを持぀こずのポむントは䜕ですか さお、もう䞀床コヌド生成。
提案された゜リュヌションの䜕が問題になっおいたすか これは回避策です。 さらに別の回避策そしおかなり汚い回避策。 私たちはすでに、回避策でいっぱいのくだらない蚀語javascrtiptを持っおいたす。 javascriptの開発者は、䞻なタスクに぀いお考える代わりに、回避策に぀いお考えるこずに倚くの時間を費やしおいたす。 あなたの提案した哲孊で、私たちはTypeScript蚀語党䜓を捚おるこずができたす。 サプラむズ、サプラむズ型システム党䜓を、回避策を䜿甚しお玔粋なJavaScriptでシミュレヌトできるためです。 回避策を䜿甚しお䜕かをシミュレヌトできるのに、なぜより衚珟力のある蚀語Typescriptなどを気にするのですか 同じこずが20行で曞かれおいるのに、なぜ1行のコヌドを曞くのでしょうか。 曞かれたコヌドの数行に基づいお絊䞎を取り戻したす 短くお衚珟力豊かなコヌドは猫甚ですよね

いいえTypeScriptにパヌシャルを含める芁求は、Cにパヌシャルがあるずいう考えに基づいおいたせん。 TypeScriptには、他の蚀語にあるので、それを持っおいるずいう理由だけで䜕かがあるべきだずは思いたせん。

そしお最埌になぜあなたは䜕かを䜿わなければ-誰もそれを必芁ずしないず思いたすか

@greendimka私は敵意をシヌルド。 私は単にシナリオを理解しようずしおいるだけです。あるいは、率盎に蚀っお完党に可胜であるこずに気付いおいないシナリオがある堎合は

私はTypeScriptチヌムに所属しおおらず、単なる支持者ですが、チヌムはここではかなり沈黙しおいるこずを芚えおおいおください。 チヌムは、圌らが䜕か特別なこずを蚀うこずがあるずき、非垞にうたくチャむムを鳎らすかもしれたせん、そしお圌らがそうするこずを遞ぶならば、私は圌らに任せたす。

TypeScriptチヌムが保持しおいる䞻芁なテナントの1぀は、TypeScriptをECMAScriptの方向ず同期させ、JavaScriptが進化しおいる党䜓的な方向から逞脱する可胜性のある特定の機胜を䜜成しないようにするこずです。

私がそれを䜿わないずいうわけではありたせんおそらくそれが存圚した堎合。 問題は、この問題の珟状では、郚分クラスには譊告がある可胜性があるため、すぐに実装されるかどうかは疑わしいようです。 a䟡倀の高い利害関係者にずっお必須の機胜になるか、b提案がTC39の埌の段階に進むたで、おそらくしばらくはこのたたです。

ModuleAugmentationを回避策ずは考えおいたせん。 これにより、型システムを拡匵でき、このスレッドで詳しく説明されおいるコヌド生成シナリオの倚くが可胜になりたす。 これは、他の蚀語機胜ぞの䞀歩です。

  • 醜いですか 絶察に、すべおの地獄のように醜い。 ぀たり、コヌドを生成しおいる堎合、違いは䜕ですか クラスを拡匵する方法に぀いお心配する必芁があるのは、生成ツヌルだけです。 コヌド生成ツヌルを実行し、モゞュヌルを含めるず、完党なむンテリセンスやコンパむル゚ラヌなどが発生したす。

  • 完璧ですか それからは皋遠い ミックスむンを蚀語レベルでサポヌトする必芁がある、はるかに䞀般的なシナリオがありたす。 たた、具䜓的な提案はありたせんが、ここで提案されおいるず思いたす。

@ david-driscoll、非垞に倱瀌でごめんなさい。 私は本圓に前向きな進歩の偎に立぀傟向がありたす。

静的実装を郚分クラスに配眮できるように、これが必芁です。

これがすぐに実珟するようには芋えないので、私たちが芋぀けた回避策を提案したいず思いたす。 このようなコメントがいく぀かありたすが、私はこれらの詳现を読んでいるものを芋たせんでした。

生成されたTypeScriptコヌドを拡匵できるようにするコヌド生成シナリオで䜿甚するPartialsが必芁です。 ただし、盞互䟝存性のあるモデルを生成しおいるため、クラスからの継承は埓来の意味ではうたく機胜したせん。 他のクラスを参照する生成されたクラスは、参照されるオブゞェクトの正しいタむプではなく、正しいむンスタンスタむプを䜜成するための耇雑なファクトリパタヌンになりたす。

生成されたクラスを基本クラスに倉曎するこずになりたしたが、クラス宣蚀のみでした。 次に、新しい基本クラスから継承するスタブクラスを䜜成したした。 次に、これらの新しいクラスを拡匵するず、基本クラスからすべおのコンテンツを継承したす。

䟋えば
クラスPersonを生成した堎合、PersonBaseを生成したす。 生成されたすべおのコヌドはこのクラスに入りたす。 たた、PersonBaseを拡匵する空のクラスPersonを生成したす。 このクラスは䞀床だけ生成されたす。 次に、生成されたすべおのコヌドをPersonBaseに配眮し、すべおのカスタムコヌドを手動でPersonに配眮したす。 生成されたPersonぞの参照はすべお、PersonBaseではなくPersonずしお残りたす。 このようにしお、すべおのIntelliSenseが匕き続き機胜したす。

ファむル1基本クラス

module ViewModels {
    export class PersonBase {
        // Generated members
        public anotherPerson: Person;
        constructor(){
            // Generated constructor code
        }
    }
}

ファむル2実際のクラス

module ViewModels {
    export class Person extends PersonBase {
        // Custom methods
        public NewVariable: string = "NewVar";
        constructor() {
            super();
            // Custom constructor code
        }
    }
}

これにより、生成されたコヌドに関する郚分的なクラスの問題が解決されたした。 アむデアを思い぀いたアンドリュヌ・スコットに称賛を送りたす。

コヌドゞェネレヌタヌを䜿甚しおコヌドを生成しおいるので、これも本圓に必芁です。それにいく぀かの倉曎を加える必芁がありたす。 郚分クラスを䜿甚するず、埌で倉曎を再床远加しなくおもコヌドを再生成できたす倧きくおも耇雑な堎合もありたす。

ただ蚀及されおいないず思う郚分的なクラスがあるずいう重芁な理由がありたす。それは、JSをTSに埐々に移行するこずです。 Javascript、特にES6より前のクラスでは、クラスは次のようになりたす。

Foo.prototype.someFunction = function() {/*....*/}

たた、これらは特別な凊理なしで耇数のファむルに分散できたす。 このようなコヌドベヌスを最新のTypeScriptに倉換するには、珟圚、クラスのすべおのメンバヌが同じファむルに含たれるように関数を移動する必芁がありたす。これは、かなり䟵襲的な倉曎になる可胜性がありたす。 郚分クラスでは、ロヌカル線集のみを䜿甚しお移行を実行できたす。

@RyanCavanaughここで芁求されるものはすべお、他のTypeScript構文で構文的に凊理できるず

ミックスむンの提案にはもっず倚くの未解決の質問があるず思いたす。 ここでの郚分的なクラス提案は、TypeScriptですでに蚱可されおいるものを䜓系化したものであり、構文糖衣構文が含たれおいたすこの機胜は、文字通り、既存のものぞの構文の再マッピングずしお実行できたす。

では、TypeScriptでこれを行うにはどうすればよいでしょうか
File1.ts

// Imagine this file is code generated and could be regenerated during development
export partial class Contact
{
    firstName: string;
    lastName: string;
    partial OnInit( args: any ) : void;
    constuctor( args: any )
    {
        this.OnInit( args );
    }
}
export class Address
{
    addr: string;
    city: string;
    state: string;
    zip: string;
}

File2.ts

// See where I'm going with this? This file would be hand edited and allows me to specify associations and children.
partial class Contact
{
    Addresses: string[] = [];
    partial OnInit( args: any ) void
    {
        this.firstName = args.firstName;
        this.lastName = args.lastName;
        this.Addresses.push( new Address() );
    }
}

䞊蚘をトランスパむルするず、Contact甚に1぀のJSクラスが出力されたす。

var Contact = (function () {
    function Contact() {
         this.Addresses = [];
   }
   Contact.prototype.constuctor = function (args) {
       this.OnInit( args );
   };
   Contact.prototype.OnInit = function (args) {
       this.firstName = args.firstName;
       this.lastName = args.lastName;
       this.Addresses.push(new Address());
   };
   return Contact;
})();

var Address = (function () {
    function Address() {
    }
    return Address;
})();

最埌に、Contactずいう名前の1぀のクラスが必芁であり、2぀の別々のクラスを3番目のクラスにサブクラス化する必芁がないこずに泚意しおください。

@cosmoKenney

これが機胜するものの䟋です。 partialほど構文的には問題ありたせんが、機胜し、非垞に機胜的な゜リュヌションです。

// address.ts
export class Address
{
    addr: string;
    city: string;
    state: string;
    zip: string;
}
// contact.impl.ts
import { Address } from './address';

// Class implementation, do the things here that are not code generated
export class Contact {
    firstName: string;
    lastName: string;
    addresses: Address[];
    constructor(args: any) {
        this.onInit(args);
    }
}
// extending the interface here
// define methods you know will need in the constructor only
// This only applies to the constructor however
export interface Contact {
    onInit(args: any): void;
}
// contact.partial.ts
import { Contact } from './contact.impl';

// Implement the extended contract here
Contact.prototype.onInit = function(this: Contact, args: any) {
    this.addresses = args.addresses.concat();
    // do stuff;
};

// Adding another method (not part of the extended interface)
Contact.prototype.somethingAwesome = function(this: Contact) {
    // do awesome stuff here
};

// Tell TypeScript "I added this here!!!!"
declare module './contact.impl' {
    interface Contact {
        somethingAwesome();
    }
}
// contact.ts
import { Contact } from './contact.impl';
import './contact.partial';

// Bring it all together (perhaps there are more than one partial class?)
export { Contact };
// main.ts
import { Contact } from './contact';

// use the contact!
const contact = new Contact(['my', 'args']);
const {firstName, lastName} = contact;
contact.somethingAwesome();

あるいは、むンタヌフェヌスをコヌド生成し、それを実装するむンタヌフェヌス拡匵機胜を䜿甚するこずもできたす。

新しいMixin機胜を䜿甚する方法もあるかもしれたせんが、私はただそれに぀いお深く掘り䞋げおいないので、適切な答えを出すこずができたせん。

@ david-driscollうわヌ。 頭が爆発した。

コミュニティは、問題を吹き飛ばすこずなく郚分的なクラスをサポヌトするだけのフォヌクで終わるのではないかず思いたす。
これたでのずころ、郚分的なクラスに察する実際の議論は聞いたこずがありたせん。 怠惰を正圓化する理由はほんのわずかです。

@greendimka

コミュニティは、問題を吹き飛ばすこずなく郚分的なクラスをサポヌトするだけのフォヌクで終わるのではないかず思いたす。
これたでのずころ、郚分的なクラスに察する実際の議論は聞いたこずがありたせん。 怠惰を正圓化する理由はほんのわずかです。

ここで䜕を蚀おうずしおいるのかわからない。 しかし、コミュニティ内の党䜓的な感芚が、既存の蚀語機胜を䜿甚しお同じ結果を達成できるずいうこずである堎合、それを行う方法のいく぀かの䟋が必芁です。 @ david-driscollが䞊に投皿したものは、私の理解をはるかに超えおいたす。 そしお、問題を完党に解決しおいないようです。 実際、私が蚀えるこずから、圌は私の意図を誀解しおいた。
私の䞻な関心事は、pojoやモデルクラスのようなクラスのスカラヌプロパティをコヌド生成するこずです。 ただし、別のファむルたたは同じファむルで、プラむマリクラス定矩内に関連付けプロパティを远加できないようにする必芁がありたすこれにより、新しくコヌドで生成されたプラむマリ定矩を元の定矩に貌り付けるこずができたす。
たずえば、䞊蚘のContactクラスは、firstNameずlastNameで生成されたコヌドを取埗したす。 しかし、私の別の定矩では、Addressオブゞェクトのコレクションの定矩ず初期化を远加したす。
私のコヌドゞェネレヌタヌは、関連付けではなくクラスの属性のみを認識しおいるため、davidの䟋で行われたように、アドレスコレクションをコヌド生成するこずはできたせん。

@cosmoKenneyアドレスがどこにあるべきかは完党には明確ではありたせんでした。 文脈を間違えるこずを蚱しおください。 私はただ遞択肢を䞎えるのを手䌝おうずしおいたす。 郚分クラスのようにコンパむラに䜕かを入れずに同様の動䜜を可胜にする機胜はたくさんありたす。これらには、䞡方のモゞュヌルシステム内郚/倖郚を実装するための倚くの远加の考慮事項ず朜圚的な問題がありたす。

あなたの堎合、抜象基本クラスを生成するか、むンタヌフェヌス生成が機胜する堎合、他のクラスはそれを継承したす。 その埌、クラスが生成されたずいう事実はただ隠されおいたす。

NS

// address.partial.ts
export interface IAddress
{
    addr: string;
    city: string;
    state: string;
    zip: string;
}

// address.ts
import { IAddress } from './address.partial';

export class Address
{
    constructor(args: any) {

    }
}
export interface Address extends IAddress{}

// contact.partial.ts
import { IAddress } from './address.partial';

export interface IContact {
    firstName: string;
    lastName: string;
    addresses: IAddress[];
}

// contact.ts
import { Address } from './address';
import { IContact } from './contact.partial';

// Class implementation, do the things here that are not code generated
export class Contact {
    addresses: Address[] = [];

    constructor(args: any) {
        this.firstName = args.firstName;
        this.lastName = args.lastName;
        this.addresses.push( new Address("address?") );
    }

    public somethingAwesome() {
        //
    }
}
export interface Contact extends IContact {}

// main.ts
import { Contact } from './contact';

const contact = new Contact(['my', 'args']);
const {firstName, lastName} = contact;
contact.somethingAwesome();

@cosmoKenney @ david-driscollは興味深い゜リュヌションを提䟛したすが、それでも実際の郚分クラスの䜿いやすさに欠けおいたす。 私の個人的な実隓が瀺しおいるように、開発者はこの方法で䜜成された「郚分」を䜿甚したせん。 これは優れた回避策ですが、パヌシャルの䜿いやすさず快適さはありたせん。

珟時点では、TypeScriptコンパむラが内郚でどのように機胜するかわかりたせん。 私はそれがすべおの゜ヌスファむルを読み取り、それらを進め、JSファむルを出力するず仮定するこずしかできたせん。 もしそうなら-私はいく぀かの゜ヌスファむルから単䞀のクラスを読み取るこずに問題は芋られたせん。 1぀のクラスの2぀以䞊の゜ヌスファむルが競合するコヌドを提䟛する堎合同じプロパティが2回定矩されおいる堎合、コンパむラは単に䟋倖をスロヌしたす。 構文的に無効なコヌドを蚘述した堎合ず同じように。

@ greendimka 、@ david-driscoll
私はDavidの䟋を䞊からコンパむルしようずしたしたが、tsはそれが奜きではありたせん

C:\TestProjects\TypeScriptFakePartialClassTest>tsc -m amd address.partial.ts address.ts contact.partial.ts contact.ts main.ts
address.ts(4,14): error TS2300: Duplicate identifier 'Address'.
address.ts(10,18): error TS2300: Duplicate identifier 'Address'.
contact.ts(7,14): error TS2300: Duplicate identifier 'Contact'.
contact.ts(11,14): error TS2339: Property 'firstName' does not exist on type 'Contact'.
contact.ts(12,14): error TS2339: Property 'lastName' does not exist on type 'Contact'.
contact.ts(20,18): error TS2300: Duplicate identifier 'Contact'.
main.ts(5,8): error TS2459: Type 'Contact' has no property 'firstName' and no string index signature.
main.ts(5,19): error TS2459: Type 'Contact' has no property 'lastName' and no string index signature.

さらに、 @ greendimkaは、これが耇雑すぎお倧芏暡なアプリケヌションで䜕癟回も䜿甚できないこずに同意したす。

@greendimkaコンパむラがどのように機胜するかはわかりたせんが、タスクを過小評䟡しないでください。 JavaScriptは.NETではなく、モゞュヌルはグロヌバルに利甚できたせん文字通りむンポヌトする必芁がありたす

これが実装されるのを芋たいのですが、このタスクでは、次のように慎重に怜蚎する必芁のあるいく぀かのこずが発生したす。

  • クラスの䞀郚をファむルAに定矩し、䞀郚をファむルBに定矩する堎合、倉換埌にクラス党䜓を含める必芁があるのはどれですか 新しいものを生成する必芁がありたすか
  • 郚分的なものを含むすべおのファむルが同じクラスを゚クスポヌトする必芁がありたすか
  • それらの远加のメむンファむルが必芁な堎合、埪環䟝存を回避するにはどうすればよいですか
  • クラス自䜓よりも倚くのものをモゞュヌルに゚クスポヌトするずどうなりたすか
  • 名前の競合チェック

等々...

@greendimka以䞋の私の回答を参照しおください:(線集これは@WoLfulusを察象ずしおい

クラスの䞀郚をファむルAに定矩し、䞀郚をファむルBに定矩する堎合、倉換埌にクラス党䜓を含める必芁があるのはどれですか 新しいものを生成する必芁がありたすか

ファむルA.jsに完党な定矩があり、ファむルBがスタブオフされおいれば完党に嬉しいです。 たぶん、猶詰のコメントで。 ずにかく私たちのほずんどはバンドルしおいるので、バンドルされる無数の.jsファむルは、最終的には本質的に埌から考えたものになりたす。

郚分的なものを含むすべおのファむルが同じクラスを゚クスポヌトする必芁がありたすか

これは、最初の質問に察する私の回答によっおほが答えられたす。

それらの远加のメむンファむルが必芁な堎合、埪環䟝存を回避するにはどうすればよいですか

わからない。 このシナリオを認識するのはモゞュヌルロヌダヌの仕事ではありたせんか

クラス自䜓よりも倚くのものをモゞュヌルに゚クスポヌトするずどうなりたすか

これには問題はありたせん。 蚀い換えるず、B.tsに郚分的な定矩ず他のいく぀かの非郚分的なクラスの䞡方がある堎合、B.jsには、䞊蚘の定型コメントず非郚分的なクラスの定矩を含める必芁がありたす。 シンプルだず思いたす。

名前の競合チェック

どのようにしお名前の競合が発生したすか クラスを意味する堎合、「partial」キヌワヌドはそれを解決したす。 しかし、他の2぀のファむルが䞡方ずも同じ名前でクラスを定矩しおいるが、「partial」キヌワヌドがない堎合、コンパむラヌは重耇タむプに぀いお゚ラヌを出力するはずです-珟圚のように。 しかし、同じ名前のプロパティたたはメ゜ッドを定矩する同じクラスの2぀の郚分的な定矩に぀いお話しおいる堎合、コンパむラは、珟圚のように、重耇するメンバヌに぀いお゚ラヌを出力する必芁がありたす。

@ WoLfulus 、 @ cosmoKenneyはよく答えたした。 最初の質問AファむルずBファむルに぀いおでそれを改善するために蚀語蚭蚈者ずしお、ルヌルを定矩する特暩がありたす。 ぀たり、ファむルAにはそのようなコヌド「partialclass X」があり、ファむルBにはそのようなコヌド「partialfileXclass X」があり、fileX.jsが生成されたす。

@cosmoKenney

それらの远加のメむンファむルが必芁な堎合、埪環䟝存を回避するにはどうすればよいですか
わからない。 このシナリオを認識するのはモゞュヌルロヌダヌの仕事ではありたせんか

TypeScriptにはモゞュヌルロヌダヌがありたせん。

@greendimka

コミュニティは、問題を吹き飛ばすこずなく郚分的なクラスをサポヌトするだけのフォヌクで終わるのではないかず思いたす。
これたでのずころ、郚分的なクラスに察する実際の議論は聞いたこずがありたせん。 怠惰を正圓化する理由はほんのわずかです。

それは良い考えではありたせん。 たずえば、動的むンポヌトが远加されたずきにフォヌクをどのように維持するかを怜蚎したしたか
たた、郚分的なクラスに察しお倚くの議論がなされおきたした。 TypeScriptファむルずJavaScriptファむルの間の゜ヌス間の察応を砎るこずは、蚀語の重芁な信条に反したす。 機胜が考慮されるためには、郚分クラスよりも無限に䟡倀のあるシナリオを可胜にする必芁があるず思いたす。 それでも拒吊される可胜性がありたす。

@ WoLfulus 、 @ cosmoKenneyはよく答えたした。 最初の質問AファむルずBファむルに぀いおでそれを改善するために蚀語蚭蚈者ずしお、ルヌルを定矩する特暩がありたす。 ぀たり、ファむルAにはそのようなコヌド「partialclass X」があり、ファむルBにはそのようなコヌド「partialfileXclass X」があり、fileX.jsが生成されたす。

私はあなたがあなたのメッセヌゞを䌝えおいるずは思わない。 それは、あなたがどんな蚀語ででも自分自身を衚珟するこずに遭遇するどんな制限も完党に恣意的な理由で存圚するように感じるように聞こえたす。
たた、 @ WoLfulusの質問には、少なくずも私の満足には答えられたせんでした。

フレヌムスヌツを着甚

TL; DRこれは起こっおいたせん。 コメント番号189でここにいお、䞍承認を登録したい堎合は、最初にスレッド党䜓を読んでください。これを远加しない理由は䞊蚘で詳しく説明されおいたす。

この状況の解釈は次のずおりです。

  • TypeScriptには、TS固有のクラス機胜コンストラクタヌプロパティ宣蚀、メンバヌ初期化子、非ファむナラむズされたデコレヌタヌ、アクセス修食子、 implementsなどがすでに倚すぎお、実際には「ES6 +型」であるこずが意図されおいたした。 。 その䞀郚は私たちのせいであり私たちの元の蚭蚈の方向性は䞀般的にOOPでした、その䞀郚はES6のせいですクラスの提案は5幎前にかなり動き回り
  • 明らかに、JavaScriptの未来はモゞュヌルです。 郚分クラスは、「グロヌバルスヌプ」モデルでのみ意味があり、適切に機胜したす。 耇数のモゞュヌルにたたがる郚分的なクラスを蚱可するこずは、ロヌドの順序が予枬できないため、灜害のレシピです。 グロヌバルのみのナニバヌスでのみうたく機胜する機胜を远加するこずは、時間の有効掻甚ではありたせん。
  • Cにはそれがありたすが、Cを再発明するためにここにいるわけではありたせん。 真剣に
  • 「生成されたコヌド」シナリオは、メリットに説埗力がありたせん。 郚分クラスのもっずもらしいemitは、プロパティ初期化子ずコンストラクタヌコヌドを1぀の宣蚀に制限したす。これは、ナヌザヌコヌドず生成されたコヌドの䞡方に初期化子たたはコンストラクタヌロゞックが必芁になる可胜性があるため、 .Designer.csスタむルのセットアップの倧倱敗になりたす。 。
  • JSには、ミックスむン、 Object.assignなど、他にも倚くの構成メカニズムがありたす。Cでこの機胜を実珟するシナリオは、JSには存圚しない制玄によっお匕き起こされたした。
  • 珟圚の回避策interface + prototype.method = ...ちょうどだけでなく、生成されたコヌドのシナリオを有効にするんpartial classでしょう。 そのコヌドを手で曞くのは奇劙ですが、コヌドを別の方法で生成するのに問題はありたせん。したがっお、分割ファむルで生成されたコヌドセットアップが問題を解決する唯䞀の方法であるず本圓に思う堎合私は懐疑的です、その方法を利甚できたす。
  • ES6は、クラスの「必須」のアヌビタヌであるず考えおいたす。 TypeScriptには、型なしのJavaScriptよりも郚分的なクラスが必芁になるずいう特別なこずは䜕もありたせんCプログラマヌにずっお魅力的です。 したがっお、郚分的なクラスを远加するために実際に公園からそれをノックアりトするシナリオがある堎合、そのシナリオはTC39プロセスを通じおそれ自䜓を正圓化できるはずです。 それが牜匕力を獲埗した堎合、私たちはそれに入力を入れお喜んで怜蚎したすが、これは誰のレヌダヌにも茉っおいないようです。

これに぀いお

むンタヌフェむス+ prototype.method = ...の珟圚の回避策は、郚分クラスず同じように、生成されたコヌドのシナリオを有効にしたす。

䜕床も蚀及したように、必芁なこずを達成するための非郚分的、非Cの方法があるので問題ありたせん。そしお、実際の䟋を求めおください。 david-driscollは非垞に圹に立ちたしたが、コンパむルされないコヌドを投皿したした。 したがっお、たずえば、䞊蚘のように、姓、名のみのスカラヌプロパティを䜿甚しおクラスをコヌド生成できるず思われる堎合は、それで問題ありたせん。 他のタむプのコレクションをクラスのプロパティずしお手動でコヌディングする方法が必芁です。 しかし、そのセットの初期化を凊理する方法も必芁です。

@cosmoKenneyあなたは正しいコヌドをコピヌしたサむトですか 2番目の䟋では、同じクラス名の代わりにむンタヌフェむスがありたした。 必芁に応じお、コヌドのzipを添付できたす。 むンタヌネット䞊のランダムなファむルが悪い可胜性があり、私が悪意のあるものを投皿しおいるずあなたに思わせたくなかったので、私はただ躊躇したした🙂

これを聞いお申し蚳ありたせんが、私はここで行われた蚭蚈䞊の決定を尊重したす。 それでよろしければ、いく぀か質問がありたす。

TypeScriptには、実際には「ES6 +タむプ」を意図したものに察しお、TS固有のクラス機胜コンストラクタヌプロパティ宣蚀、メンバヌ初期化子、非ファむナラむズされたデコレヌタヌ、アクセス修食子、実装などがすでに倚すぎたす。 その䞀郚は私たちのせいであり私たちの元の蚭蚈の方向性は䞀般的にOOPでした、その䞀郚はES6のせいですクラスの提案は5幎前にかなり動き回り、機胜がうたくいかなかった。 さらに別のTS固有のクラス機胜を远加するこずは、ラクダの背䞭にあるもう1぀のストロヌであり、可胜であれば避ける必芁がありたす。

これを考慮するず、JSの玔粋なタむピングず、TSが提䟛する他の蚀語構造ずを、組織的およびコヌド的に明確に区別するこずが可胜でしょうか。 私は、タむピングず远加の蚀語機胜の䞡方が倧奜きです。 消費者/開発者ずしお、私はTSがJSにないものを远加するずいう事実に぀いおはあたり気にしたせん。 玠晎らしいものをください。TC39がそれを望たないのなら、私は気にしたせん。

TSがこれらのものを盞互にカプセル化する堎合、眮き換えられるのではなく、再利甚が容易になり、SoundScriptなどのプロゞェクトによっおフォヌクおよび構築される可胜性がありたすか

そしお、他のプロゞェクトがこのタむピングに基づいお構築され、JSが提䟛するよりも優れた/他の蚀語構造を提䟛するこずができたす。

明らかに、JavaScriptの未来はモゞュヌルです。 郚分クラスは、「グロヌバルスヌプ」モデルでのみ意味があり、適切に機胜したす。 耇数のモゞュヌルにたたがる郚分的なクラスを蚱可するこずは、ロヌドの順序が予枬できないため、灜害のレシピです。 グロヌバルのみのナニバヌスでのみうたく機胜する機胜を远加するこずは、時間の有効掻甚ではありたせん。

本圓か モゞュヌルがJavaScriptの自然な郚分になるこずは確かですが、元のコヌド本䜓はどうでしょうか。 私はnamspacesが倧奜きで、適切に行われればスヌプはありたせん。 すべおを1぀のファむルにコンパむルしおいるので、モゞュヌルロヌダヌは必芁なく、ほずんどの堎合、非同期モゞュヌルロヌドも必芁ありたせん。 https://github.com/Microsoft/TypeScript/issues/420のように提案されたものは、名前空間でのみ可胜であり、関連性がありたす。 モゞュヌルだけを䜿うべきなので、このようなこずは起こらないず蚀っおいるのですか 名前空間は非掚奚ぞの道を進んでいたすか

@ david-driscollありがずうございたす、あなたはすでに十分に助けおくれたした。 @RyanCavanaughは問題を閉じ続け、

たた、郚分クラスずは䜕かに぀いお倚くの誀解が芋られたす。 これは本圓に単玔な構成であり、誰もがこれを䞍釣り合いに吹き飛ばしおいたす。
https://msdn.microsoft.com/en-us/library/wa80x488.aspx

これを考慮するず、JSの玔粋なタむピングず、TSが提䟛する他の蚀語構造ずを、組織的およびコヌド的に明確に区別するこずが可胜でしょうか。 私は、タむピングず远加の蚀語機胜の䞡方が倧奜きです。 消費者/開発者ずしお、私はTSがJSにないものを远加するずいう事実に぀いおはあたり気にしたせん。 玠晎らしいものをください。TC39がそれを望たないのなら、私は気にしたせん。

それは蚀語の曞き盎しであり、みんなのコヌドを壊したす。

たた、「Just give me awesome stuff」は、TypeScriptの蚭蚈目暙ずは根本的に異なりたす。 すばらしいものが必芁で、JavaScriptずの敎合性を気にしない堎合は、 CoffeeScript 、 Dart 、 Haxeなどの別の蚀語を遞択する必芁がありたす。 もちろん、TypeScriptの採甚ほどうたくいかない理由があるかもしれたせん...

問題を閉じ続け、回避策があるず述べおいる人は、おそらく回避策の䟋を提䟛する必芁がありたす

partial解決するものには倚くのナヌスケヌスがありたす。 ほずんどすべおの蚀語構成には、それが有効な倚くのナヌスケヌスがありたすが、正圓な理由から、遞択する必芁がありたす。

「私は緑の車が倧奜きです」のように、特定の蚀語機胜を求め続けたすが、問題の栞心に到達しおいたせん。なぜ車は緑である必芁があるのですか あなたがあなたの車がなぜ緑である必芁があるかを説明したか、それがあなたの本圓の必芁性を提䟛する限り、あなたがあなたの車がどんな色であるかを実際に気にしないずいう事実にオヌプンであるならば。

正圓な理由で自動車䌚瀟がグリヌンカヌを生産しないこずを決定したずいう理由だけで、あなたがあなたの車を塗り盎す方法をあなたに教えるこずがラむアンの矩務であるずあなたが感じる理由がわかりたせん。

ああ、TypeScript 2.2で远加されたミックスむンクラスは、あなたの本圓のニヌズであるず私が思うこずを達成するための良い方法です

interface Base {}

interface Constructor<T> {
    new (...args: any[]): T;
    prototype: T;
}

interface PartialClass {
    foo(): void;
}

function PartialClass<B extends Constructor<Base>>(base: B): B & Constructor<PartialClass> {
    return class extends base {
        foo() {
            console.log('foo');
        }
    };
}

class MyBase {
    bar() {
        console.log('bar');
    }
}

const MyPartialBase = PartialClass(MyBase);

const instance = new MyPartialBase();

instance.bar();
instance.foo();

@kitsonkミックスむンは同じものではありたせん。

  • ミックスむンは、既存のクラスに远加できる自己完結型のナニットです。
  • パヌシャルクラスは、同じクラスの䞀郚であるかのように、他のパヌシャルからメンバヌにアクセスできたす。

挔習ずしお、ミックスむンを䜿甚しお次のコヌド分割を実装しおみおください。

partial class Point {
  readonly x: number;
  readonly y: number;
}

partial class Point {
  translate(dx: number, dy: number): Point {
    return new Point(this.x + dx, this.y + dy);
  }
}

挔習ずしお、ミックスむンを䜿甚しお次のコヌド分割を実装しおみおください

さお、芁点に戻りたしょう...では、蚀語機胜を指摘する代わりに、䟋でどのような問題に察凊しようずしおいたすか TypeScriptでの回避策は簡単なので、次のようになりたす。

class Point {
  readonly x: number;
  readonly y: number;
  translate(dx: number, dy: number): Point {
    return new Point(this.x + dx, this.y + dy);
  }
}

そしお、私たちが完党䞻矩者である堎合でも、すべおのナヌスケヌスではなくしたす

interface PointBase {
    x: number;
    y: number;
}

interface Constructor<T> {
    new (...args: any[]): T;
    prototype: T;
}

interface TranslatePointPartial {
    translate(dx: number, dy: number): TranslatePointPartial;
}

function TranslatePointPartial<B extends Constructor<PointBase>>(base: B): B & Constructor<TranslatePointPartial> {
    return class TranslatePointPartial extends base {
        translate(dx: number, dy: number): TranslatePointPartial & PointBase {
            return new TranslatePointPartial(this.x + dx, this.y + dy);
        }
    };
}

class Point {
    readonly x: number;
    readonly y: number;
}

const MyPoint = TranslatePointPartial(Point);

const instance = new MyPoint();

instance.x;
instance.y;
instance.translate(1, 2);

@ Elephant-Vessel

これを考慮するず、JSの玔粋なタむピングず、TSが提䟛する他の蚀語構造ずを、組織的およびコヌド的に明確に区別するこずが可胜でしょうか。

珟時点では、2぀を解きほぐす方法がわかりたせん。 理論的には、構文的にTypeScriptに倉換されたCoffeeScriptの蚀語を蚘述し、その高氎準蚀語を䜿甚しお、TSの型システムを䜿甚しながら、新しい構文機胜を远加するこずもできたすが、それではこれたでのずころしか埗られたせん。 それが目暙である堎合は、代わりに、他の倚くのグリヌンフィヌルドのコンパむルからJSぞの蚀語の1぀を遞択する方が良い遞択のように思われたす。

モゞュヌルだけを䜿うべきなので、このようなこずは起こらないず蚀っおいるのですか 名前空間は非掚奚ぞの道を進んでいたすか

確かに、名前空間はどこにも行きたせん。 これらは、すでに広く䜿甚されおいるパタヌンの単なる名前であり、ES6モゞュヌルの䞖界ではただ十分に意味がありたす。 モゞュヌルはたすたす人々がコヌドを敎理する方法であり、倚くの倧きな副次的な利点がありたす。 その䞖界では郚分的なクラスはほずんど意味がないず蚀っおいるだけであり、それず互換性のない根本的に新しい組織パタヌンを远加するのは奇劙なこずです。 䞖界が反察方向に動いおいお、誰もが「負荷に副䜜甚のあるグロヌバルスクリプトは玠晎らしい、みんながお互いのprototypeパヌティヌをする」のようだったずしたら、私たちは違った気持ちになるかもしれたせん。

@RyanCavanaugh

おそらくそうです...おそらくあたり意味がありたせん...しかし、私が䜕床も蚀ったように、このスレッドでも、郚分クラスはすべおコヌド生成を簡単にするこずだず思いたす...それが私が芋る䞻な利点ですそれらからTSの機胜の䟡倀がありたす...私ず私は他の倚くのこずを想定する必芁がありたすが、それは単なる掚枬であり、珟圚私のCコヌドから倧量のTSコヌドを生成しおいたす...しかし、問題は生成されたものを安党に拡匵する方法になりたすTSコヌド??? これは郚分的なクラスで答えるのがはるかに簡単な質問です...珟圚、生成されたTSコヌドファむルにカスタムコヌドを保持するためにハックに頌っおいたす...

ありがずう

ここでも同じこずですが、CAPIのタむプスクリプト「プロキシ」を生成し、これらのオブゞェクトをタむプスクリプトで簡単に拡匵できるようにしたいず考えおいたす。

私はJSスペシャリストではないので、䜕かが足りないに違いありたせん。なぜなら、クラスの宣蚀を耇数のTSファむルに分割できるコンパむル埌に1぀のJSファむルに1぀のクラス宣蚀しかない理由がわからないからです。 JSの䞖界にずっおの問題。 私が芋る限り、最初から1぀のファむルに曞き蟌たれおいるかのように、JSにずっおは透過的です。 ぀たり、郚分クラスを䜿甚するかどうかに関係なく、JS出力はたったく同じになりたすが、開発者にずっおJSオブゞェクトの拡匵性のコストを防ぐこずができたす。

@RyanCavanaugh

私が個人的に蚀及したいもう1぀のこずは、異なるTSファむルで郚分クラスを䜿甚しおES6モゞュヌルを䜜成するずきに発生する可胜性のあるパッケヌゞングのゞレンマを䜕らかの方法で解決するようにTSコンパむラに䟝頌しおいないこずです...少なくずも私には完党に理にかなっおいたすES6モゞュヌル甚に耇数のTSファむルを単䞀のjsファむルにコンパむルしたす...繰り返したすが、郚分クラスはコヌド生成を倧幅に支揎したす...ツヌルが信頌できる拡匵性でモデルの倧郚分を䜜成できるようにしたす...

@kitsonk

「私は緑の車が倧奜きです」のように、特定の蚀語機胜を求め続けたすが、問題の栞心に到達しおいたせん。なぜ車は緑である必芁があるのですか あなたがあなたの車がなぜ緑である必芁があるかを説明したか、それがあなたの本圓の必芁性を提䟛する限り、あなたがあなたの車がどんな色であるかを実際に気にしないずいう事実にオヌプンであるならば。

いいえ、私はもう新機胜を求めおいたせん。 蚀語は私が望むこずを達成できるず䜕床も蚀われおきたした。 必芁なものの䟋をCで提䟛したしたが、圹立぀䟋では、必芁な堎所に到達する方法をただ確認しおいたせん。

正圓な理由で自動車䌚瀟がグリヌンカヌを生産しないこずを決定したずいう理由だけで、あなたがあなたの車を塗り盎す方法をあなたに教えるこずがラむアンの矩務であるずあなたが感じる理由がわかりたせん。

ラむアンはここでモデレヌタヌのようで、問題を解決しおいたす。 それが理由です。 圌が蚀語の暩嚁である堎合、母囜語の機胜を䜿甚しおそれを行う方法の䟋を提䟛せずに、私の必芁性を理解し、この芁求を华䞋する努力をする前に、おそらく圌は問題を閉じるべきではありたせん。 コンパむル時の゜リュヌションが欲しいず述べたした。 そしお、私はかなり優秀な開発者であり、しばらくの間、倚くの異なるあいたいな蚀語でプログラミングを行っおきたしたが、ミックスむン構文にはただ本圓に苊劎しおいたす。 耇雑で理解しにくいものがどのように蚀語に取り入れられたかはわかりたせんが、Cから借甚しおいるため、郚分的なクラス構文の優雅さを誰もが拒吊しおいるようです。

ラむアンはここでモデレヌタヌのようで、問題を解決しおいたす。 それが理由です。 圌が蚀語の暩嚁であるなら、おそらく圌は私の必芁性を理解する努力をする前に問題を閉じるべきではありたせん

🀔

@RyanCavanaugh 、あなたが助けようず努力したこずを私は知っおいたす。 そしおこの時点で、私はミックスむンを詊すこずに移っおいたす。 たたは単に継承、あるいは私はこのプロゞェクトを成し遂げるためにずおも急いでいるので、ゞェネリックでこれを行う方法を芋萜ずしおいたす。 うヌん...
継承ず呜名により、私は次のこずができたす。

class AddressBase // this is a code generated class
{
    public address: string;
    public city: string;
    public state: string;
    public zip: string;

    constructor( jsonFromService: any )
    {
        this.OnInit( jsonFromService );
    }

    OnInit( jsonFromService: any )
    {
        // could use Object.assign here
        this.address = jsonFromService.address;
        this.city = jsonFromService.city;
        this.state = jsonFromService.state;
        this.zip = jsonFromService.zip;
    }
}

class ContactBase // this is also a code generated class
{
    public firstName: string;
    public lastName: string;

    constructor( jsonFromService: any )
    {
        this.OnInit( jsonFromService );
    }

    OnInit( jsonFromService: any )
    {
        // could use Object.assign here
        this.firstName = jsonFromService.firstName;
        this.lastName = jsonFromService.lastName;
    }
}

// classes that extend the functionality of the code generated classes:
class Address extends AddressBase // subclass simply because I don't want to have to use AddressBase all over my codebase, and then refactor if I ever extend the class
{
}

class Contact extends ContactBase
{
    public Addresses: Address[] = []; // THIS is the customization/extension that cannot be code generated.

    OnInit( jsonFromService: any )
    {
        // note that jsonFromService receives a dto with a array of address info
        super.OnInit( jsonFromService );

        for ( let addr of jsonFromService.Addresses )
        {
            this.Addresses.push( new Address( addr ) );
        }
    }
}

そしお、それは私にずっおはうたくいきたす。 それはそれほどきれいではなく、コヌドで生成されたクラスに、コヌドで䜿甚したくない名前を匷制したす。 しかし、再びそれは機胜したす。

珟時点では、郚分クラスに匷く反察しおいる人は、郚分クラスの抂念を誀解しおいるだけで、郚分クラスは郚分クラスではないものだず思っおいるように感じたす。

明確にするために郚分クラスは構文構造であり、同じ単䞀クラスの定矩を耇数の物理ファむルに分割できたす。 ここでのキヌワヌドは「同じ」ず「単䞀」です。

TypeScriptのドキュメントには、郚分クラスの誀った定矩が蚘茉されおいたす最初の段萜はhttps://www.typescriptlang.org/docs/handbook/mixins.html 。

実際の郚分クラスの抂念の䟋

ファむル "Point.generated.ts"

partial class Point {
   readonly x: number;
   readonly y: number;
}

ファむル "Point.codeByHand.ts"

partial class Point {
  constructor(x: number, y: number) {
      this.x = x;
      this.y = y;
  }

  translate(dx: number, dy: number): Point 
  {
      return new Point(this.x + dx, this.y + dy);
  }
}

それらは「Point.js」にコンパむルされたす-そしお名前はファむルの名前からではなく、クラスの名前から来たす

var Point = (function () {
    function Point(x, y) {
        this.x = x;
        this.y = y;
    }
    Point.prototype.translate = function (dx, dy) {
        return new Point(this.x + dx, this.y + dy);
    };
    return Point;
}());

ミックスむンは、「郚分クラス」ずしお䜿甚される堎合そしお、ドキュメント内のこの甚語は誀甚されおいるず匷く信じおいたす、実際には倚重継承を衚しhttps://en.wikipedia.org/wiki/Multiple_inheritance 。

したがっお、ご芧のずおり、実際の郚分クラスず倚重継承ずいう2぀の異なるツヌルに぀いお説明したす。 これらは2぀の異なるツヌルです。 そしお、他のツヌルず同様に、独自のアプリケヌション領域がありたす。 蚀い換えれば、倧工は朚槌が利甚できないずきに朚槌の代わりにハンマヌを䜿甚するかもしれたせんが、ハンマヌは適切な道具ではありたせん。

私芋、この議論には未来がないので、やめるべきです。 実際の郚分クラスの技術的な問題はただ芋圓たりたせんが、少なくずも今のずころ、チヌムは実際にそれらを実装するこずを望んでいたせん。

TSチヌムは、可胜であればTS固有の機胜を実装するこずを望んでいたせん。 もっず話し合いたい堎合は、ここがより良い堎所です https 

TC39偎に、メヌルベヌスのリポゞトリではなく、このこずに぀いお話し合うためのGitHubリポゞトリがあるこずを願っおいたす/

@greendimka

珟時点では、郚分クラスに匷く反察しおいる人は、郚分クラスの抂念を誀解しおいるだけで、郚分クラスは郚分クラスではないものだず思っおいるように感じたす。

明確にするために郚分クラスは構文構造であり、同じ単䞀クラスの定矩を耇数の物理ファむルに分割できたす。 ここでのキヌワヌドは「同じ」ず「単䞀」です。

ここの誰もが郚分クラスの定矩を誀解しおいるずは思いたせん。おそらくJavaScriptのクラスの定矩を誀解しおいるず思いたす。

JavaScriptクラスは、他の広く䜿甚されおいる蚀語で芋られるクラスずたったく同じであるずいう印象を受けおいる堎合は、他の人が誀解しおいるように芋えるかもしれたせん。

ただし、このディスカッションで䜕床も蚀われおいるように、少なくずも1回は明瀺的に蚀ったこずがあるず思いたす。JavaScriptクラスは、必須の宣蚀型構造ではありたせん。

これらは、ステヌトメントが実行されるたで存圚したせん。

それらの定矩は突然倉異に䟝存しおいたす。

これにより、継承に関しおは、すでに脆匱で順序に䟝存しおいたす。

これは䜕床も続く可胜性がありたす...

@cosmoKenney

耇雑で理解しにくいものがどのように蚀語に取り入れられたかはわかりたせんが、Cから借甚しおいるため、郚分的なクラス構文の優雅さを誰もが拒吊しおいるようです。

私はそれが正しいずは本圓に思いたせん。 誰もがCを愛しおおり、Javaプログラマヌも倧奜きです😛。TypeScriptは、違いがあるために違いはありたせん。

@aluanhaddad

JavaScriptでのクラスの定矩を誀解しおいるのではないかず思いたす...

匕甚以䞋の堎合TypeScriptに぀いお話しおいたす。
私が蚀ったようにJavaScriptの構造にコンパむルされるTypeScriptで実際の郚分クラスを実装する技術的な問題は芋られたせん。

@greendimka

匕甚以䞋の堎合TypeScriptに぀いお話しおいたす。
私が蚀ったようにJavaScriptの構造にコンパむルされるTypeScriptで実際の郚分クラスを実装する技術的な問題は芋られたせん。

この満足床の問題は、TypeScriptクラスのようなものはありたせん。

ああ少幎 䞀郚の人々は理由ずしお䜕かを䜿甚したす。
わかりたした。TypeScriptにはクラスがありたせん。 たたはTypeScriptクラス。 たたは䜕でも。 なんでもいい。

぀たり、JavaScriptクラスです。 私は時々衒孊者であるこずに眪を犯したすが、どの機胜を簡単に远加できるかを議論する前に、クラスずいう甚語の定矩に同意する必芁があるため、この区別を非垞に具䜓的に行っおいたす。

私たちがクラスに぀いお話すずき、私たちが同じこずを意味するのではなく、それが認知的䞍協和を匕き起こし、盞互理解を劚げるず思いたす。

私たちがクラスに぀いお話すずき、私たちが同じこずを意味するのではなく、それが認知的䞍協和を匕き起こし、盞互理解を劚げるず思いたす。
完党に同意する

実際、このトピックの最初の投皿は、芁求された内容を完党に説明しおいるため、この議論には将来性がありたせん:)

@greendimkaはい、TypeScriptには郚分的なクラスがないように思われるため、将来性はありたせん。 私の考えでは、それは良いこずです。

しかし、誀解や誀解は良いこずではないので、私はただあなたず話し合っおいたす。

残念ながら、あなたも興味がないようです

A. JavaScriptがクラスずは䜕かを説明するず、気が倉わっお、簡単に郚分化できるこずに同意するようになるかもしれたせん。

B. JavaScriptクラスずは䜕かに぀いお他の人から孊び、反察の芖点を理解する必芁がありたす。

これは残念だず思いたすが、よろしければこれ以䞊お話ししたせん。

私はいかなる議論にも反察しおいたせん。 しかし、ここでは、郚分クラスは実装されない少なくずも珟圚はず䜕床か述べられおいたす。 ですから、他のこずに集䞭したほうがいいず思いたす。 たぶん、TypeScriptは将来倉曎される可胜性がありたす。
AずBに関連しお。私はJavaScriptが嫌いです。 しかし、私はそれを非垞によく知っおおり、もちろん、クラスがその䞭でどのように「衚される」かを知っおいたす。 しかし、この党䜓的な議論のポむントは、JavaScriptを倉曎するこずではなく、「䜎レベル」のJavaScriptコヌドを生成する高次蚀語ずしおのTypeScriptの機胜を向䞊させるこずでした。
TypeScriptをC ++に、JavaScriptを機械語に眮き換えるず想像しおみおください。 マシンコヌドには、C ++に存圚するほずんどの抂念が欠けおいたす。 しかし、C ++はそれが原因で進化を停止する必芁がありたすか もちろん違いたす。 䞀郚の叀いコンパむラはコンパむルできないため、進化を停止する必芁がありたすか もちろん、いいえ-開発者に新しい機胜を提䟛し、圌らに䌝えたすそれは新しいコンパむラで動䜜したす-あなた開発者はそれを䜿甚するかどうかを決定したす。

@aluanhaddad
男ああ男。 方皋匏のJavascript郚分を気にするのは誰ですか TypeScriptは䞊のレむダヌですが、それを衚珟したい堎合もありたす。 叀い4GLず3GLの議論を芚えおいたすか TypeScriptはJavascriptに察するものであり、4GLは3GLに察するものです。 たた、TypeScriptは匷力な型を持぀ES6であるため、郚分クラスはTypeScriptのロヌドマップの範囲倖であるずいう議論はLAMEです。 Mixin、Generics、Modules、Name Spaces、TypeCastingを入手したした。 では、パヌシャルクラスでさらに䞀歩進んでみたせんか

郚分クラスに必芁なのは、単䞀のTypeScriptクラスのさたざたな定矩すべおを1぀の最終的な䜎レベルの3GLJavascriptクラス定矩に統合できるようにするシンタックスシュガヌだけです。 最終的なJavaScriptクラス定矩に圱響はないはずですよね Javascriptぞの倉換の最終成果物がこの議論の䞀郚でさえあるのはなぜですか 真剣に。

@cosmoKenney 「型を備えたES.nextだけ」は、JavaScript開発者を倉換する倧きなセヌルスポむントです。 もっず䜕かが必芁な堎合は、間違った蚀語を芋おいるこずになりたす。 代わりにScala.jsを詊しおみ

線集ES.nextでは、郚分クラスをカスタムモゞュヌルロヌダヌで実装できるずいう興味深いこずに気づきたした。 䜿甚する堎合

import {MyClass} from './myclass.*'

ロヌダヌは、ワむルドカヌドに䞀臎する任意のファむルから゚クスポヌトされたすべおのMyClass定矩を単䞀のクラスにマヌゞし、それを提䟛できたす。

@spion私はあなたがそれらをES.next郚分クラスずしお非垞に正しく参照しおいる方法が奜きです。 ブラりザなどのESモゞュヌルロヌダヌ、たたはSystemJSなどのロヌダヌポリフィルは、郚分クラスをサポヌトしたす。
TypeScriptレベルでこの機胜を远加する際の䞻な問題の1぀は、ロヌダヌやパッケヌゞャヌなどの既存のツヌルが砎損するこずです。 䞀方、ECMAScriptで指定されおいる堎合、これらのツヌルはすべお機胜を実装し、TypeScriptはこれらのツヌルすべおずの互換性を維持したす。

Scala.jsに関しおは間違いなくあなたに同意したす

@cosmoKenney

Mixin、Generics、Modules、Name Spaces、TypeCastingを入手したした。 では、パヌシャルクラスでさらに䞀歩進んでみたせんか

TypeScriptに芋られるミックスむンは、TypeScriptが_types_するECMAScriptデザむンパタヌンです。

ゞェネリックは型システムの機胜であるため、適甚されたせん。

モゞュヌルはECMAScriptの機胜です。

名前空間は、ECMAScriptデザむンパタヌンの構文糖衣構文であり、圢匏化されおいたす。

TypeCastingはTypeScriptには存圚したせん。

@aluanhaddadなぜこれを実行時のものずしお䜜り続けるのですか モゞュヌルロヌダヌず、トランスパむルずは䜕の関係もないすべおのもの。

+1

@cosmoKenney

@aluanhaddadなぜこれを実行時のものずしお䜜り続けるのですか モゞュヌルロヌダヌず、トランスパむルずは䜕の関係もないすべおのもの。

それは正しくありたせん。

SystemJSずWebpackの゚コシステムを芋るず、そうでないこずがわかりたす。

さらに䌝統的で堅実なgulpワヌクフロヌは、入力ファむルず出力ファむルの間の察応に䟝存しおいたす。

+1

ツヌルを䜿甚しお基本クラスのほずんどを生成しおいるためモデルに倉曎があった堎合に自動化するため、郚分クラスが必芁です。 次に、郚分クラスを䜿甚しお、別のファむルのクラスに機胜を远加し、ツヌルクラスを自動生成するによっお䞊曞きされないようにしたす。

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