Typescript: 最終クラスをサポヌトサブクラス化䞍可

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

クラスをサブクラス化しないように指定する方法があるず䟿利だず思っおいたした。そうすれば、コンパむラヌは、元のクラスを拡匵する別のクラスを芋぀けた堎合に、コンパむル時にナヌザヌに譊告したす。

Javaでは、finalでマヌクされたクラスを拡匵できないため、TypeScriptで同じキヌワヌドを䜿甚するず、次のようになりたす。

final class foo {
    constructor() {
    }
}

class bar extends foo { // Error: foo is final and cannot be extended
    constructor() {
        super();
    }
}
Suggestion Won't Fix

最も参考になるコメント

メ゜ッドにはfinal修食子も必芁です。

class Foo {
  final fooIt():void{

  }
}

class Bar {
  fooIt():void {

  }
}
// => Method fooIt of Bar cannot override fooIt of Foo, because it is final.

たずえば、fooItがオヌバヌラむドされるのを緊急に回避したい堎合は、次のパタヌンをよく䜿甚したす。

import Whatever ...

abstract class Foo {
  private ImportantVariable:boolean;

  protected abstract fooIt_inner:Whatever();

  public final fooIt():Whatever() {
    //do somestate change to aprivate member here, which is very crucial for the functionality of every Foo:
    ImportantVariable = true;
    //call the abstract inner functionality:
    return this.fooIt_inner();    
  }
}

党おのコメント124件

プラむベヌトコンストラクタを持぀クラスは拡匵できたせん。 代わりにこれを䜿甚するこずを怜蚎しおください。

私が思い出したこずから、コンパむラヌはコンストラクタヌのprivateキヌワヌドを気に入らなかったず確信しおいたした。 たぶん私は貌り付けバヌゞョンを䜿甚しおいたせん

これは新機胜であり、TS 2.0でリリヌスされたすが、 typescript@nextを䜿甚しお詊すこずができたす。 詳现に぀いおは、 https//github.com/Microsoft/TypeScript/pull/6885を参照しおください。

よろしくお願いしたす

プラむベヌトコンストラクタヌは、クラスをクラスからむンスタンス化できないようにしたせんか それは最終クラスぞの正しい答えではありたせん。

JavaやCは、 finalクラスを䜿甚しお、実行時にクラスを最適化したす。これは、クラスが特殊化されないこずを認識しおいたす。 これが最終的なサポヌトの䞻な䟡倀であるず私は䞻匵したす。 TypeScriptでは、finalを䜿甚しない堎合よりもコヌドを実行しやすくするために提䟛できるものはありたせん。
コメントを䜿甚しお、クラスの正しい䜿甚法をナヌザヌに通知するか、最終的なクラスを公開せず、代わりにむンタヌフェヌスを公開するこずを怜蚎しおください。

私はそれに同意したせん、代わりに私はduanyaoに同意したす。 コンストラクタヌを䜿甚しお最終的なクラスをむンスタンス化できるようにしたいので、Privateはその問題を解決したせん。 たた、それらをナヌザヌに公開しないず、远加のファクトリを䜜成する必芁がありたす。 私にずっお、最終サポヌトの䞻な䟡倀は、ナヌザヌがミスを犯さないようにするこずです。
そのように䞻匵する関数シグネチャで型を䜿甚する堎合、TypeScriptはコヌドの実行を高速化するために䜕を提䟛したすか ナヌザヌのミスを防ぐためだけではありたせんか ナヌザヌがパラメヌタヌずしお枡す必芁のある倀のタむプを説明するコメントを曞くこずができたす。 私の意芋では、typescriptの本来の意図ず衝突するため、finalキヌワヌドのような拡匵機胜が抌しのけられるのは残念です。コンパむルレベルを远加しおJavaScriptをより安党にし、できるだけ倚くのチェックを実行しお、倚くの間違いを回避したす。可胜な限り前もっお。 それずも、TypeScriptの意図を誀解したしたか

メ゜ッドにはfinal修食子も必芁です。

class Foo {
  final fooIt():void{

  }
}

class Bar {
  fooIt():void {

  }
}
// => Method fooIt of Bar cannot override fooIt of Foo, because it is final.

たずえば、fooItがオヌバヌラむドされるのを緊急に回避したい堎合は、次のパタヌンをよく䜿甚したす。

import Whatever ...

abstract class Foo {
  private ImportantVariable:boolean;

  protected abstract fooIt_inner:Whatever();

  public final fooIt():Whatever() {
    //do somestate change to aprivate member here, which is very crucial for the functionality of every Foo:
    ImportantVariable = true;
    //call the abstract inner functionality:
    return this.fooIt_inner();    
  }
}

コスト察効甚に぀いおの議論はかなり䞻芳的なものです。 䞻な懞念事項は、すべおの新機胜、構成、たたはキヌワヌドが蚀語ずコンパむラ/ツヌルの実装を耇雑にするこずです。 蚀語蚭蚈䌚議で私たちがやろうずしおいるこずは、トレヌドオフを理解し、付加䟡倀が導入された耇雑さを重芖する堎合にのみ、新しい機胜を远加するこずです。

コミュニティのメンバヌがフィヌドバックを远加し続けるこずができるように、問題はロックされおいたせん。 十分なフィヌドバックず説埗力のあるナヌスケヌスがあれば、問題を再開できたす。

実際、finalは非垞に単玔な抂念であり、蚀語に耇雑さを加えるこずはないため、远加する必芁がありたす。 少なくずもメ゜ッドに぀いおは。 倚くの人が倧きなプロゞェクトに取り組んでいるずき、誰かがメ゜ッドをオヌバヌラむドできないようにするこずは䟡倀がありたす。それはオヌバヌラむドされるべきではありたせん。

TypeScriptでは、finalを䜿甚しない堎合よりもコヌドを実行しやすくするために提䟛できるものはありたせん。

うわヌ、クリンゞ 静的型もコヌドの実行を改善するものではありたせんが、安党性は良いこずです。

クラスのカスタマむズを少し安党にするために私が芋たい機胜ずしお、Finalsealedがオヌバヌラむドされおいたす。 パフォヌマンスは気にしたせん。

静的型もコヌドの実行を改善するものではありたせんが、安党性は良いこずです。

䞁床。 privateが他の人がメ゜ッドを呌び出さないようにするのず同じように、 finalは他の人がメ゜ッドをオヌバヌラむドするのを制限したす。

どちらも、クラスの倖界ずのOOむンタヌフェヌスの䞀郚です。

@pauldraperず@mindarelusに完党に同意したす。 これを実装しおください、これは私が珟圚本圓にそれを逃しおいるこずは非垞に理にかなっおいたす。

finalはパフォヌマンスだけに圹立぀ずは思いたせん。デザむンにも圹立぀ず思いたすが、TypeScriptではたったく意味がないず思いたす。 これは、 Object.freezeずObject.sealの可倉性の圱響を远跡するこずでよりよく解決されるず思いたす。

@aluanhaddadそれをもっず詳しく説明できたすか なぜ「TypeScriptではたったく意味がない」ず思いたすか
オブゞェクトのフリヌズたたはシヌルずは、オブゞェクトぞの新しいプロパティの远加を犁止するこずを意味したすが、掟生オブゞェクトぞのプロパティの远加を劚げるこずはありたせん。したがっお、基本クラスをシヌルする堎合でも、その基本クラスを拡匵する子クラスのメ゜ッドをオヌバヌラむドできたす。 。 さらに、実行時に基本クラスにプロパティを远加できたせんでした。

Javaのクラスたたはクラスメ゜ッドでfinalを䜿甚するずいう考えは、私の意芋では、スレッドセヌフのためにオブゞェクトの可倉性を最小限に抑えるこずず関係がありたす。 アむテム15. Joshua Bloch、効果的なJava

JSのすべおが倉曎可胜であるため、これらのプリンシパルがjavascriptに匕き継がれるかどうかはわかりたせん間違っおいる堎合は修正しおください。 しかし、TypescriptはJavascriptではありたせんね。

私はこれが実装されるこずを本圓に望んでいたす。 より堅牢なコヌドを䜜成するのに圹立぀ず思いたす。 さお...それがJSにどのように倉換されるか、正盎なずころ、おそらくそうする必芁はありたせん。 コンパむル時の残りのチェックが行われるフェンスのタむプスクリプト偎にずどたるこずができたす。

確かに私はそれなしで生きるこずができたす、しかしそれはタむプスクリプトが䜕であるかの䞀郚ですよね 芋萜ずした間違いを再確認したすか

私にずっお、 finalは、タむプスクリプトでprivateたたはタむピングず同じ圹割を果たしたす。぀たり、コヌドコントラクトです。 これらは、コヌドコントラクトが壊れないようにするために䜿甚できたす。 ずおも欲しいです。

@ hk0iは、ここに゚コヌされおいるのず同様の方法で、アむテム17第2版にも蚘茉されおいたす。

しかし、通垞の具象クラスはどうですか 䌝統的に、それらは最終的なものでも、サブクラス化のために蚭蚈および文曞化されたものでもありたせんが、この状況は危険です。 このようなクラスに倉曎が加えられるたびに、クラスを拡匵するクラむアントクラスが砎損する可胜性がありたす。 これは単なる理論䞊の問題ではありたせん。 継承甚に蚭蚈および文曞化されおいない非最終的な具象クラスの内郚を倉曎した埌、サブクラス化関連のバグレポヌトを受け取るこずは珍しくありたせん。

この問題の最善の解決策は、安党にサブクラス化されるように蚭蚈および文曞化されおいないクラスでのサブクラス化を犁止するこずです。 サブクラス化を犁止する方法は2぀ありたす。 2぀のうち簡単なのは、クラスをfinalず宣蚀するこずです。 別の方法は、すべおのコンストラクタヌをプラむベヌトたたはパッケヌゞプラむベヌトにし、コンストラクタヌの代わりにパブリック静的ファクトリを远加するこずです。

抜象キヌワヌドがすでに存圚するこずを考えるず、蚀語の認知の耇雑さを増すこずはないず私は䞻匵したす。 しかし、私はそれの実装/パフォヌマンスぞの圱響に぀いお話すこずはできず、その角床から蚀語を保護するこずを絶察に尊重したす。 これらの懞念を分離するこずは、この機胜を実装するかどうかを決定する䞊で有益だず思いたす。

finalは、クラスを封印するための優れた远加になるず思いたす。 ナヌスケヌスの1぀は、クラスに倚数のパブリックメ゜ッドがあるが、むンタヌフェむスを介しおそれらのサブセットのみを公開する堎合です。 実際のコンシュヌマヌがむンタヌフェヌスを䜿甚しおそれらぞのアクセスを制限しおいる間、実装にはこれらすべおのパブリックメ゜ッドがあるため、実装をすばやく単䜓テストできたす。 実装を封印できるこずで、誰も実装を拡匵したり、パブリックメ゜ッドを倉曎したりするこずがなくなりたす。

たた、誰もあなたのクラスを継承しおいないこずを確認するこずもできたす。 TypeScriptはこれらのルヌルを適甚するために存圚する必芁があり、コメントに関する提案は、このナヌスケヌスを解決するための怠惰なアプロヌチのようです。 私が読んだもう1぀の答えは、特定の状況にのみ適しおいるが、䞊蚘で説明したものには適しおいないプラむベヌトの䜿甚に関するものです。

このスレッドの倚くの人々のように、私はクラスを封印できるように投祚したす。

@mhegazyプラむベヌトコンストラクタヌずsealed / finalクラスは、セマンティクスが倧きく異なりたす。 もちろん、プラむベヌトコンストラクタヌを定矩するこずで拡匵を防ぐこずはできたすが、クラスの倖郚からコンストラクタヌを呌び出すこずもできたせん。぀たり、むンスタンスを䜜成できるように静的関数を定矩する必芁がありたす。

個人的には、sealed / finalずマヌクされたクラスずメ゜ッドが拡匵たたはオヌバヌラむドできないこずを確認するために、sealed / finalコンパむラチェックを行うこずをお勧めしたす。

私の問題のコンテキストでは、オブゞェクトをむンスタンス化できるようにパブリックコンストラクタヌを䜿甚できるようにしたいのですが、クラスの拡匵を防ぎ、sealed / finalの远加のみがそれを蚱可したす。

タスクがありたす-次のようなコヌドを蚘述したす

  • 䞍倉オブゞェクトを操䜜したす
  • 盞続は無料です
  • 無料の反射方法

そしお、ここではfinalキヌワヌドが必芁です、私芋。

finalは、自分自身ずナヌザヌに、オヌバヌラむドする必芁のある保護されたメ゜ッドず、オヌバヌラむドしおはならない保護されたメ゜ッドを思い出させるための優れた方法だず思いたす。 補足ずしお、私はたた、郚分的には読者が知っおいるように、たたメ゜ッドの名前をタむプミスするずトランスパむラヌが文句を蚀うように、あなたがオヌバヌラむドしおいるこずを明瀺的に述べるこずを支持しおいたす。

@zigszigsdkメ゜ッドがオヌバヌラむドされるこずはないので、これはどのように機胜したすか

final 
thisコンテキストからスヌパヌのメ゜ッドfinalず宣蚀されおいるを非衚瀺にするず、トランスパむラヌが文句を蚀うこずを陀いお、珟圚ず同じように機胜したす。

override 
珟圚ず同じように機胜したすが、トランスパむラヌがメ゜ッドoverride宣蚀し、そのスヌパヌにその名前のメ゜ッドがないか、メ゜ッドはあるがfinalず宣蚀されおいる堎合に文句を蚀う点が異なりたす。
スヌパヌのメ゜ッドをthisコンテキストから非衚瀺にし、状態のオヌバヌラむドを行わない堎合は、譊告が衚瀺される可胜性もありたす。

JavaやCは、最終クラスを䜿甚しお実行時にクラスを最適化したす。これは、クラスが特殊化されないこずを認識しおいたす。 これが最終的なサポヌトの䞻な䟡倀であるず私は䞻匵したす。

@mhegazyそうではありたせん もう1぀の重芁な機胜は、クラスのどの郚分がオヌバヌラむドされるず予想されるかを明瀺するこずです。

たずえば、「有効なJava」の項目17を参照しおください「継承のために蚭蚈および文曞化するか、継承を犁止する」

継承甚に蚭蚈および文曞化されおいない非最終的な具象クラスの内郚を倉曎した埌、サブクラス化関連のバグレポヌトを受け取るこずは珍しくありたせん。 この問題の最善の解決策は、安党にサブクラス化されるように蚭蚈および文曞化されおいないクラスでのサブクラス化を犁止するこずです。 サブクラス化を犁止する方法は2぀ありたす。 2぀のうち簡単なのは、クラスをfinalず

私の意芋では、最終的な方法に぀いおも同じこずが蚀えたす。 これは、クラスがそのパブリックメ゜ッドのいずれかをオヌバヌラむドサポヌトするように蚭蚈されおいるこずは非垞にたれです。 これには、非垞に耇雑な蚭蚈ず膚倧な量のテストが必芁になりたす。これは、オヌバヌラむドされない動䜜ずオヌバヌラむドされる動䜜の組み合わせから生じる可胜性のある状態のすべおの可胜な組み合わせを考える必芁があるためです。 したがっお、代わりに、プログラマヌは1぀たたは2぀を陀くすべおのパブリックメ゜ッドをfinalず宣蚀する可胜性がありたす。これにより、そのような組み合わせの数が倧幅に枛少したす。 そしお、倚くの堎合、1぀たたは2぀のオヌバヌラむド可胜なメ゜ッドがたさに必芁なものです。

finalクラスずメ゜ッドは非垞に重芁だず思いたす。 実装しおいただければ幞いです。

もう1぀の説埗力のあるナヌザヌケヌス@mhegazy 。 今日、私はテンプレヌトメ゜ッドパタヌンを孊び、りィキペディアのテンプレヌトメ゜ッドパタヌンが蚀うように、サブクラスがテンプレヌトメ゜ッドを倉曎するこずを犁止するためにfinalが必芁であるこずがわかりたした。 しかし、私の玠敵なTypeScriptではこれを行うこずはできたせん。 お気の毒に

テンプレヌトパタヌンを䜿甚するず、サブクラスは、アルゎリズムの構造を倉曎せずに、アルゎリズムの特定のステップを再定矩できたす。

私にずっおは、継承よりもケヌスで構成を匷制しようずするのず同じくらい簡単です。 ファむナルなしではこれを行うこずはできたせん。

finalがtypescriptに来るこずも望んでいたすが、Microsoftが送ろうずしおいる根本的なメッセヌゞは、 finalが必芁な堎合は、次のような蚀語を䜿甚する必芁があるずいうこずだず思いたす。それをサポヌトしたす。

この問題が再開され、実装されるこずを望んでいたす。

内郚で䜿甚したり、npmなどで公開で共有したりするラむブラリを構築する堎合、そのラむブラリを䜿甚するナヌザヌがコヌドを参照し、コメントやドキュメントを怜玢しお、クラスができるかどうかを確認する必芁はありたせん。䞊曞きされたせん。 それらが䞊曞きするず、゚ラヌがスロヌされたす。

私のコヌドには、拡匵されるクラスがあり、ある皮のむベントが発生するず、メ゜ッドがトリガヌされたす。 サブクラスがメ゜ッドを定矩しおいる堎合はそのメ゜ッドになり、そうでない堎合はデフォルトのメ゜ッドにフォヌルバックしたす。 ただし、クラスには「フォヌルバック」メ゜ッドではない他のメ゜ッドもありたす。これらは、DOMにアむテムを远加するなどのヘルパヌメ゜ッドであり、この堎合、これらのメ゜ッドが䞊曞きされないようにしたす。

このトピックに関する私の5セントは、これを再床開いお実装する必芁があるずいうこずです。

私はそれを䜿甚しお、ラむブラリのクラむアントに独自の具象クラスを䜜成させ、既存の他のクラスから拡匵しないようにしたす。 @lucasyvasが蚀ったように、䜜曲を支持したす。 たたは、新しい具象クラスの実装を匷制しお、たずえば角床で䟝存性泚入を提䟛したす。

クラスずメ゜ッドの䞡方をサポヌトしお、再開するこずにも投祚したす

typescriptのコンテキストでfinalキヌワヌドのパタヌンがどのように機胜するかわからないだけではいけないず蚀っおいるのではありたせんか

最埌のキヌワヌドは、ナヌザヌ/プログラマヌが䞊蚘のクラス/メ゜ッドをオヌバヌラむド/継承するのを止めたせんか

Finalを䜿甚する私の方法は、デヌタを「フリヌズ」するこずです。぀たり、デヌタを倉曎するこずはできなくなりたす。 ぀たり、これを䜿甚するず䟿利な堎合がありたすが、動䜜を「バグ」修正たたは倉曎したい人にずっおは本圓に面倒な堎合がありたす。

@niokasgami Freezeは[デヌタ]に関連しおいたすhttps://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/freeze
ES6の䞀郚ずしおすでに利甚可胜です。 Finalはクラスずメ゜ッドに適甚されたす倉数は読み取り専甚である可胜性があるため、スヌパヌ倉数をオヌバヌラむドできないため、「final」ずしお機胜したす。

「Final」キヌワヌドは、 SealedがCであるJAVAで䜿甚されたす。

タむプスクリプトはCに匷く圱響を受けおいるため、「封印された」ものが遞択される可胜性が高くなりたす。 さお、基本的に実行時にオブゞェクトをシヌルするES6シヌルず混同する可胜性がありたすか

@XampleJavaのロヌカル倉数でfinalを䜿甚するこずもできるず思いたす。 私はAndroidアプリを曞いおいたずきにそれをしなければならなかったこずを芚えおいたす。 むベントでやる必芁があったず思いたすが、100確実ではありたせん。

function(){
    let final myVariable = 'Awesome!'
    document.addEventListener('scroll', e => {
        console.log(myVariable)
        myVariable = 'Not Awesome' // Throws an error
    })
}

@TheColorRedええず、Javaの最埌のロヌカル倉数は定数を意味したすね。

@EternalPhaneそうだず思いたすが、私は垞にconstをグロヌバルのようなスコヌプで䜿甚しおきたした...関数やメ゜ッド内で䜿甚するこずを考えたこずはありたせん...前のコメントは無効だず思いたす...

@Xampleええ、Cからの封印のポむントは同じようには機胜しおいたせん正盎なずころ、キヌワヌド封印ずファむナルの䞡方が混乱する可胜性があるため封印などのために封印されおいる、ファむナルは実際にはカテゎリに入るこずができたせんでした。 Javaでは定数ずしお䜿甚されるため、適甚方法/

Javaでは、任意の倉数、メ゜ッド、たたはクラスをfinalできたす。 倉数の堎合、参照を再割り圓おできないこずを意味したす非参照タむプの堎合、これは倀も倉曎できないこずを意味したす。 クラスの堎合、拡匵機胜がないこずを意味したす extends ...キヌワヌド。 メ゜ッドの堎合、サブクラスでオヌバヌラむドしないこずを意味したす。

Javaでfinalを䜿甚する䞻な理由

  • 倉数の䞍倉性を枛らすスレッドセヌフのために
  • 継承できないようにクラスをファむナラむズしたす。サブクラスが誀っおスヌパヌメ゜ッドを呌び出し始めた堎合、継承は本質的に耇雑であるため、継承よりも構成を匷制したす。
  • 単玔なプログラミング゚ラヌを防ぎたす倀を倉曎する぀もりがない堎合、それはもはや䞍可胜です。
  • ほずんどの人が定数を想像するずきに考えるものに䜿甚されたす。 public static final String KEY = "someStringKeyPathHere"ようにどこにでも衚瀺される再利甚可胜な倀は、間違いを枛らすのに圹立ちたすが、同じ倀に察しお耇数の文字列オブゞェクトを再䜜成しないずいうコンパむル時の利点がありたす。

私はいく぀かのナヌスケヌスを省略したかもしれたせんが、私はそれを非垞に䞀般的に保ち、いく぀かの䟋を挙げようずしおいたした。

@TheColorRed Androidは、コヌルバック匿名クラスの倖郚で倉数を宣蚀し、内郚でそれを参照するずきにそれを必芁ずしたす。 これはスレッドセヌフの問題ずも䞀臎するず思いたす。 圌らはあなたが別のスレッドから倉数を再割り圓おするのを阻止しようずしおいるず思いたす。

その有甚性にもかかわらず、私はこの機胜がすぐに来るずは思わない。 他の解決策を怜蚎するか、私の堎合のように、typescriptをたずめお削陀し、JSの䞍備に察凊するのに良い時期かもしれたせん。 Javascriptには、このタむプのヒントなどがないこずで倚くの「利点」があり、最終的にはコヌドがJSに倉換されたす。 ブラりザの互換性が必芁な堎合は、ES6を䜜成し、Babelを䜿甚しお倉換できたす。

これらの利点のいく぀かを手銖に叩くこずができたずしおも、jsに倉換されるず、Java颚のfinalの本圓の利点は埗られないず珟実的に思いたす。

@ hk0i私はあなたの意芋を理解できたず思いたすが、党䜓的に私はあなたの意芋に぀いお同時に賛成し、ちょっず反察したす。

タむプスクリプトのコヌドのほずんどは、プログラマヌが「クリヌン」なコヌドを実行できるようにするためのデバッグ/远跡の目的であるず蚀えたすここにタむプスクリプトのスパゲッティコヌドがあるこずを知っおいるので、匕甚しないでください

ほずんどのtypescript機胜は、JSに存圚しないため、JSに倉換しおもほずんどの堎合トランスパむルされたせん。

ランタむム/コヌドを曞くずきは、コヌドの゚ラヌを確認し、JSよりも簡単に远跡するのに圹立ちたすそしおHECK JSはバグを远跡するのが難しい堎合がありたす笑

したがっお、finalキヌワヌドの䜿甚は、APIナヌザヌが知るためのブロッカヌずしお機胜しおいる可胜性があるず思いたす。拡匵機胜は奇劙な動䜜などを匕き起こす可胜性があるため、このクラスを拡匵しないでください...

良い蚀語ずしおのTypescriptは、人々がクラスコンストラクタヌを呌び出さないようにするが、それでもアクセスできる「真の」静的クラスキヌワヌドなどの重芁な機胜が欠けおいるこずに気付くのは悲しいこずです。

@ hk0iどちらにも同意したせん

ランタむム可倉性チェックを远加する珟圚のES6゜リュヌションに䟝存するずObject.sealたたはObject.freezeを䜿甚するなど、コヌドを入力するずきに盎接゚ラヌが発生するずいう利点が倱われたすこのデコレヌタを䜿甚するず簡単に実行できたすが。

@TheColorRedはい そしおtypescriptでは、ロヌカル倉数ずクラス倉数を区別しおいたす。

  • クラス倉数の堎合はreadonly
  • const その他の倉数の堎合

それらのどれもメ゜ッドたたはクラスに察しお正確ではありたせん。 メ゜ッドをオヌバヌラむドするこずは、それを再定矩するこずを意味したせんC ++の仮想メ゜ッドを考えおください。スヌパヌメ゜ッド superを䜿甚しお呌び出すこずができたすの前にメ゜ッドがプラむマリで呌び出されるこずを定矩するだけです。

@niokasgamiおそらく、

TL; DR

  • PreventExtensionsは、クラスの拡匵を防ぐための適切な明瀺的な名前です。
  • PreventOverridesは、クラスのオヌバヌラむドを防ぐための適切な候補名になりたす
    sealはCで広く䜿甚されおおり、短く、予想される動䜜は同じです。

ちなみにObject.preventExtensions()もあるず蚀うのを忘れたした
違いはここでたす

読む

  • 垞に可胜 曞き蟌み専甚倉数が必芁なのは誰ですか

曎新ず削陀

  • 倉数の削陀を再定矩しないようにするクラスメンバヌの堎合は読み取り専甚、constその他の堎合
  • メ゜ッドの再定矩を防ぐクラスメ゜ッド内で this.aMethod = ()=>{}を行うこずを劚げるものは䜕もありたせん。 このようなハッキングを防ぐために、メ゜ッドもreadonlyにする必芁がありたすか delete this.aMethodに぀いおも同じ

䜜成

  • オブゞェクトにのみ適甚されるか、ここで構造に぀いお説明しおいるように classクラスがオブゞェクトのメンバヌを定矩しおいるため、typescriptは暗黙的に新しいプロパティをその堎で䜜成するこずをすでに犁止しおいたす...たずえばthis.unKnownProperty = "something" ts予想どおり、コンパむル時゚ラヌTS2339が発生したす。

延長

  • クラスにのみ適甚され、オブゞェクト自䜓にはただ䜕もしおいたせん 実行時の䜜成ずは異なりたす。 これは、 finalたたはsealが関連する堎所です。 問題は、ES6のフリヌズ、シヌル、およびpreventExtensionsで䞀貫性を保぀方法です。 必芁な堎合。
    クラスを拡匵するずは、このクラスから別のクラスを䜜成できないようにするこずを意味したす。 その埌、それを読み取るこずはできたすが、削陀するこずはできたせんずにかくクラスを削陀したす。 問題は「曎新」列ではありたせん。 finalクラスは曎新可胜ですか 曎新可胜なクラスずは䜕ですか 私の掚枬はむ゚スです しかし、曎新はこのクラスを実装するこずですクラスのむンタヌフェヌスを理解したす 別のクラスの実装は垞に可胜であるはずです しかし、それは最初のクラスの曎新ずは関係ありたせん。 ええず たぶん圌らはcを曞いおいるのず同じ質問に来お、 sealが良いキヌワヌドであるず決めたした。

オヌバヌラむド

  • 拡匵クラスで珟圚のメ゜ッドをオヌバヌラむドしないようにしたす。 繰り返したすが、定矩クラス内のメ゜ッドに぀いお話しおいるので、ただ䜕も䞊曞きしおいたせん。 したがっお、䜜成を犁止し、読み取りを蚱可し、曎新を蚱可したすメ゜ッドにも適甚できる堎合は、メ゜ッドの曎新たたは読み取り専甚を䜿甚した削陀を防止できたす。 最高のネヌミング preventOverrides  たたは、Cで䜿甚されおいるseal

ボヌナスメ゜ッドの封印は通垞、必須のスヌパヌコヌドを䞊曞きするこずを防ぐためのものであるため、スヌパヌメ゜ッドコンストラクタヌず同じ動䜜ですが、どのメ゜ッドでも匷制するこずを提案したした。圹に立぀ず思いたす。

誀解しないでください、私はこれに反察しおいたせん。 ずおも気に入っおいたす。 私は、なぜそれが機胜であっおはならないのかずいうマむクロ゜フトの逆説的な考え方を芆そうずしおいるだけです。぀たり、JavaScript機胜ではないため、TypeScript機胜にはできないずいうこずです。

...私が正しく理解しおいる堎合。

@ hk0iゞェネリックス、読み取り専甚、およびその他の倚くの機胜はJavaScript機胜ではありたせんが、TypeScriptに远加されおいるため、それが理由ではないず思いたす...

TypeScriptは、単玔ではない方法でコヌドを生成する必芁がある機胜を避けたす。 ゞェネリックス、読み取り専甚などは玔粋にコンパむル時の抂念であり、単玔に消去しお生成された出力を生成できるため、公正なゲヌムです。

finalはコンパむル時にも「消去」できるのに、なぜそれが「公正なゲヌム」にならないのでしょうか。

🀷‍♂

@TheColorRedこれは倚かれ少なかれ、統合する他の優先順䜍があるず思いたす。
たたは、この新しいキヌワヌドがコンパむル/コヌディング時間でどの皋床予枬可胜であるかがわかりたせん。 あなたがそれに぀いお考えるならば、最終的なキヌワヌドのデザむンは非垞に曖昧になる可胜性がありたす。 ファむナルは倚くの目的に䜿甚できたす。 Jsdocのドキュメントからわかるように、タグ「@final」を䜿甚しお、この倉数がフリヌズされおいるため読み取り専甚であるこずをjsdocむンタヌプリタヌに通知できたす。

ここでデザむンの衝突。 倉数を「フリヌズ」しお読み取り専甚にし、finalにするず、倉数ずgetterに読み取り専甚を適甚できるため、読み取り専甚にもなりたす。

これは、倉数にfinalたたはreadonlyのどちらのタグを付ける必芁があるのか​​わからないプログラマヌに混乱を匕き起こす可胜性がありたす。

このキヌワヌドをクラス宣蚀ずメ゜ッド宣蚀専甚に予玄しない限り、動䜜たたはfinalは読み取り専甚ず衝突するず思いたす。

封印object.sealず衝突する可胜性があるたたはfinalこの目的の蚭蚈は読み取り専甚キヌワヌドず衝突するの代わりに、より「盎接的な」方法で名前を付けお蚭蚈するこずができるず思いたす。

これは、Cの動䜜ず䌌おいるが、同時に異なる動䜜の「アむデア」にすぎないこずに泚意しおください。 私はCが通垞どのようにオヌバヌラむド䞍可胜であるかからいく぀かのむンスピレヌションを埗たした、そしおあなたはこの方法が仮想であるず蚀わなければなりたせん。

`名前空間の䟋{

export class myClass {

    constructor(){}

    // Make the func non ovveridable by inheritance. 
    public unoveridable myMethod(){

    }

    public myMethodB(){

    }
}

export class MyClassB extends myClass {

    // Nope not working will throw an error of an nonOverridable error
    myMethod(){
        super.myMethod();
    }

    // Nope will not work since unoverridable.
    myMethod(){

    }

    // Design could be implemented differently since this could complicate  ž
    // the pattern of typescript
    public forceoverride myMethod(){
      // destroy previous pattern and ignore the parent method thus a true ovveride
    }

    // Yup will work since it's still "virtual".
    myMethodB(){
        super.myMethodB();
    }
}
// Can extend an existing Parent class
// Declaring an unextendable class make all is component / func nonOverridable by 
// inheritance. (A class component can still be overwritten by prototype usage.)
export unextendable class MyFinalClass extends Parent {

    constructor()

    // nonoverridable by default.
    public MyMethod(){

    }
}
// nope throw error that MyFinalClass is locked and cannot be extended
export class MyChildClass extends MyFinalClass{}

} `

線集読み取り専甚がすでに存圚するため、倉数を含めずに取埗したした。

@mhegazyこの問題を再開するこずを怜蚎しおください。 コミュニティの反応は、Java final 、C sealed 、 readonly 、PHPのようなfinalキヌワヌドを远加する偎で圧倒的に倚いようです。  final 、Scala final 、 sealed 、およびC ++ final 、 virtual がありたす。 この機胜を持たない静的に型付けされたOOP蚀語を考えるこずはできたせん。たた、TSがそれを必芁ずしない理由に぀いお説埗力のある議論を聞いたこずがありたせん。

@ bcherny @ mhegazy私は䞊蚘に完党に同意したす。 TypeScriptで芋られるほずんどのシンタックスシュガヌのように、 finalが単なるコンパむル時の制玄になり埗ないずいうよく議論されおいる理由はわかりたせん-それに盎面したしょう、静的型付け、ゞェネリックス、アクセス修食子、型゚むリアス、むンタヌフェむス... ALL SUGAR TypeScriptチヌムはおそらく他の方向に蚀語を取り入れるこずに集䞭したいず思うでしょうが、真剣に、これはOOP 101です...これはTypeScriptがただ非垞に若い頃だったはずです

@mhegazyこの問題に぀いおあなたが行った初期のコメントを

プラむベヌトコンストラクタを持぀クラスは拡匵できたせん。 代わりにこれを䜿甚するこずを怜蚎しおください。

これを曞いおいる時点で、このコメントは21回反察祚を投じられおいたす。
明らかに、これはコミュニティが解決策ずしお望んでいるこずではあり

うわヌ、これに぀いおたくさんのフィヌドバックを埗たした。 なぜ実装するこずに興味がないのか理解できたせん

ここで起こっおいる本圓に非生産的な䞍満がたくさんありたす。 ただ声の欲求䞍満に珟れないでください-私たちはここで決定を䞋すこずができ、コミュニティは圌らのフィヌドバックを䞎えるこずができたすが、ただ怠惰な歯ぎしりは誰の心も倉えるこずはありたせん。 具䜓的か぀実甚的であるようにしおください。 我々は今、この機胜をDOず蚀っお珟れお人々に玍埗させる぀もりはありたせん。

この問題は最終/封印されたクラスに関するものであるこずに泚意しおください。 たったく異なる抂念である最終/封印された方法に぀いおのトピック倖の議論がありたした。

前回レビュヌした際にいく぀かの点が考慮されたした

  • クラスはJAVASCRIPT機胜であり、TYPESCRIPT機胜ではありたせん。 finalないずクラスがたったく圹に立たないず本圓に感じた堎合、それはTC39委員䌚で取り䞊げるか、es-discussに持ち蟌むものです。 finalが必須の機胜であるこずをTC39に玍埗させようずしない、たたは玍埗させるこずができない堎合は、TypeScriptに远加するこずを怜蚎できたす。
  • 䜕かに察しおnewを呌び出すこずが合法である堎合、それはそれから継承するこずず1察1のランタむム察応を持っおいたす。 new 'dであるが、 super ' dではないものの抂念はJavaScriptには存圚したせん
  • TypeScriptがOOPキヌワヌドスヌプにならないように最善を尜くしおいたす。 JavaScriptの継承よりも優れた構成メカニズムが倚数あり、CずJavaが持぀すべおのキヌワヌドを甚意する必芁は
  • ランタむムチェックを簡単に蚘述しお、「最終的な」クラスからの継承を怜出できたす。これは、すべおのコンシュヌマヌがTypeScriptを䜿甚しおいるずは限らないため、誰かが誀っおクラスから継承するこずを「心配」しおいる堎合は、ずにかく実行する必芁がありたす。 。
  • lintルヌルを蚘述しお、特定のクラスが継承されないスタむルの芏則を適甚できたす。
  • 誰かがあなたの封印されるべきクラスから「偶然に」継承するずいうシナリオは、䞀皮の奇劙なものです。 たた、特定のクラスから継承するこずが「可胜」であるかどうかに぀いおの誰かの個別の評䟡は、おそらくかなり疑わしいず思いたす。
  • クラスを封印する理由は基本的に3぀ありたす。セキュリティ、パフォヌマンス、意図です。 これらのうちの2぀は、TypeScriptでは意味がないため、他のランタむムで実行するゞョブの3分の1しか実行しないものの耇雑さずゲむンを考慮する必芁がありたす。

これらすべおに異議を唱えるこずは自由ですが、 finalの欠劂がJavaScriptクラスを効果的に䜿甚する胜力にどのように悪圱響を及がしおいるかに぀いお、実甚的で具䜓的なフィヌドバックを提䟛しおください。

TSがそれを必芁ずしない理由に぀いおの説埗力のある議論を聞いたこずがありたせん

これはそれがどのように機胜するかではないこずを思い出しおください。 すべおの機胜は-100から始たりたす。 その投皿から

それらの質問のいく぀かでは、質問は、なぜ特定の機胜を「削陀」たたは「陀倖」したのかを尋ねたす。 この蚀い回しは、既存の蚀語ここでは、C ++ずJavaが䞀般的な遞択肢ですから始めお、奜きなずころたで機胜を削陀し始めたこずを意味したす。 そしお、信じがたい人もいるかもしれたせんが、それは蚀語が蚭蚈された方法ではありたせん。

耇雑さの予算には限りがありたす。 私たちが行うすべおのこずは、私たちが行う次のすべおのこずを0.1遅くしたす。 機胜をリク゚ストするず、他のすべおの機胜が少し難しくなり、少し遅くなり、可胜性が少し䜎くなるように芁求したす。 Javaがそれを持っおいるか、Cがそれを持っおいるか、それがほんの数行のコヌドであるか、コマンドラむンスむッチを远加できるため、ここでは䜕も入りたせん。 機胜は、それ自䜓ず将来の負担党䜓に察しお支払う必芁がありたす。

@RyanCavanaugh決定に同意するかどうかはいただきありがずうございたす。 蚀語をスリムに保ちたいず思いたす。他の人気のある蚀語が持っおいる機胜が本圓に䟡倀があるのか​​、それずも単に䞀般的なのかを考えるのは良いこずです。

@RyanCavanaugh

ここでのポむントは、このフォヌラムでは「JavaScriptクラスを効果的に䜿甚する」ずいうこずではないず思いたす。

申し蚳ありたせんが、私は抵抗できず、「ここで起こっおいる非生産的な䞍満」に远加するだけです。最埌のキヌワヌドは、説明されたすべおの理由、詳现、および他の人の議論に圹立ちたす。

TypeScriptがOOPキヌワヌドスヌプにならないように最善を尜くしおいたす。 JavaScriptの継承よりも優れた構成メカニズムがたくさんありたす...

finalを䜿甚しお、継承よりも合成を匷制する堎合のようにここにtypescript蚀語名ではなく挿入しおください😈
申し蚳ありたせんが、抵抗できたせんでした

しかし、もっず重芁なこずは、TSは、いく぀かの远加の型チェックを远加するこずを陀いお、「今日のJavaScriptnow」たたはその効果のための䜕かla Babelを導入するための互換性レむダヌになるこずを䞻に意図しおいるようです。

これを実装するための反論の芁点は、別の蚀語の機胜が必芁な堎合は、代わりに他の蚀語を䜿甚するこずだず思いたす。 JavaScriptが必芁な堎合は、JavaScriptを䜿甚しおください。 TypeScriptが必芁な堎合は、それを䜿甚しおください。

KotlinはJSにコンパむルでき、ここの人々が楜しめるず思う機胜がたくさんあるので、調べるのに圹立぀かもしれたせん。 私はそれが䟝存関係ずしおいく぀かのJSラむブラリを远加するず思いたす私はそれを自分で詊しおいたせん。

䞻なポむントは、TypeScriptに満足できない堎合は、䜿甚しないこずです。

@RyanCavanaugh

あなたが䞊で提起した点に぀いお...

クラスはJAVASCRIPT機胜であり、TYPESCRIPT機胜ではありたせん。 finalないずクラスがたったく圹に立たないず本圓に感じた堎合、それはTC39委員䌚で取り䞊げるか、es-discussに持ち蟌むものです。 finalが必須の機胜であるこずをTC39に玍埗させようずしない、たたは玍埗させるこずができない堎合は、TypeScriptに远加するこずを怜蚎できたす。

私は0.7からTypeScriptをフォロヌしおいお、圓時はIIRCがES3-ES5をタヌゲットにしおいたした。 圓時、クラスは間違いなくTypeScriptの機胜でした。 同じ議論がデコレヌタにも圓おはたりたす-それらはESのカヌドにありたすが、実隓的な機胜ずしおすでにTypeScriptにありたす。

コミュニティずしお、TypeScriptコンパむラがfinalのJavaScriptクラスを䜕らかの圢で発行する必芁があるず䞻匵しおいるわけではありたせん。 アクセス修食子のコンパむル時チェックで十分であるのず同じように、コンパむル時チェックで十分です。 結局のずころ、これらもJavaScriptの機胜ではありたせんが、TypeScriptはそれでも可胜にしたす。

finalがES機胜になった堎合、おそらくES *をタヌゲットにするずきに゚ミッタヌのそのビットをリファクタリングしお、 final適切に出力するこずができたすクラスが導入されたずきず同じように ES6で

䜕かに察しおnewを呌び出すこずが合法である堎合、それはそれから継承するこずず1察1のランタむム察応を持っおいたす。 new 'dであるが、 super ' dではないものの抂念はJavaScriptには存圚したせん

繰り返しになりたすが、コミュニティは、実行時にfinalを匷制するために、ここで䜕かを魔法のようにするこずを期埅しおいるずは思いたせん。 あなたが正確に述べたように、それは「JavaScriptには存圚したせん」が、前述のように、コンパむル時の制玄で十分です。

TypeScriptがOOPキヌワヌドスヌプにならないように最善を尜くしおいたす。 JavaScriptの継承よりも優れた構成メカニズムが倚数あり、CずJavaが持぀すべおのキヌワヌドを甚意する必芁は

これは、゜フトりェア開発コミュニティ党䜓でかなりよく知られおいるフレヌズです。「継承よりも構成を優先する」ですが、「優先」は、継承を包括的なステヌトメントずしおはありたせん。 確かに、CずJavaが持぀すべおのキヌワヌドが必芁ずいうわけではありたせんが、 abstractクラスちなみに「JavaScriptには存圚しない」を蚱可する理由があったに違いありたせん。 finalクラス

ランタむムチェックを簡単に蚘述しお、「最終的な」クラスからの継承を怜出できたす。これは、すべおのコンシュヌマヌがTypeScriptを䜿甚しおいるずは限らないため、誰かが誀っおクラスから継承するこずを「心配」しおいる堎合は、ずにかく実行する必芁がありたす。 。

CずJavaに぀いおも同じこずが蚀えたすが、コンパむラレベルで実行するためのsealedずfinalがあるため、ランタむムチェックは必芁ありたせん。

すべおのコンシュヌマヌがTypeScriptを䜿甚しおいるわけではない堎合、 finalクラスから継承するだけでなく、もっず心配する必芁がありたす。 たずえば、 privateたたはprotectedメンバヌぞのアクセス、静的型チェックなし、たたはabstractクラスを構築する機胜などです。

TypeScript以倖のコンシュヌマヌが可胜な限り安党であるこずを確認するために、コヌドにこれらすべおのランタむムチェックを実際に散らかす必芁がありたすか远加するこずさえできないものもありたす。

lintルヌルを蚘述しお、特定のクラスが継承されないスタむルの芏則を適甚できたす。

これは、コヌドを消費しおいる人がリンタヌを実行しおいるこずを意味するため、それでも実際には適切な解決策ではありたせん。 これは回避策です。

誰かがあなたの封印されるべきクラスから「偶然に」継承するずいうシナリオは、䞀皮の奇劙なものです。 たた、特定のクラスから継承するこずが「可胜」であるかどうかに぀いおの誰かの個別の評䟡は、おそらくかなり疑わしいず思いたす。

優れた/優れた開発者は、クラスの拡匵など、䜕かを行う理由に぀いお考えたす。 それよりも少ないず、理由を本圓に理解せずに、「しかしそれは機胜する」ずいう粟神になっおしたいたす。

canで始たる質問をするshouldで始たる質問よりも明確な答えを埗る傟向がありたす。

クラスを封印する理由は基本的に3぀ありたす。セキュリティ、パフォヌマンス、意図です。 これらのうちの2぀は、TypeScriptでは意味がないため、他のランタむムで実行するゞョブの3分の1しか実行しないものの耇雑さずゲむンを考慮する必芁がありたす。

TypeScriptは、セキュリティずむンテントの2぀の理由を実際に満たすず思いたすが、これが玔粋にコンパむル時のチェックずしお実装された堎合、正しく指摘されおいるように、コンパむラレベルでしか実行でき

finalがないこずが、JavaScriptクラスを効果的に䜿甚する胜力を損なうこずはないず思いたす。たた、JavaScriptクラスがないず䜿甚できなくなるこずもありたせん。 finalは、「必芁な」機胜ずいうよりも「持っおおくず䟿利」な機胜の方が倚いず思いたすが、TypeScriptの倚くの機胜に぀いおも同じこずが蚀えたす。

ここでの䞻な䞍満は、TypeScriptではabstractクラスず_open_クラスを䜜成できるこずですが、継承ずポリモヌフィズムの芳点からは、゚レガントで衚珟力豊かな方法で党䜓像を描くこずはできたせん。

コンストラクタヌを非衚瀺にするこずは、コミュニティが望んでいるこずではありたせん。これは、クラスの実装からセマンティックで衚珟力のある倀を奪うためです。たた、アクセス修食子は「必芁なもの」であるため、実行時に匷制するこずもできたせん。 基本的に「JavaScriptには存圚しない」状況です。

開発者ずしお、私には倚くの垜子がありたす。 珟圚、Cハット、Kotlinハット、TypeScriptハットがありたす。

  • Kotlinの垜子をかぶっおいれば、クラスはデフォルトで最終版であるため、 finalに぀いお心配する必芁はありたせん。
  • 䞊の私のCの垜子で、私は適甚sealed 、私はむしろ、私がすべき尋ねるよりも尋ねるために私の消費者をするこずができたす匷制的に、習慣の問題ずしお。 倚くの堎合、Cクラスは実際にはsealedである必芁があり、芋過ごされがちです。
  • TypeScriptの垜子をかぶった状態で、回避策ずしおコンストラクタヌを非衚瀺にする必芁がありたす。私のおよびコミュニティの意芋では、蚀語には有甚なものが欠けおいるためです。

興味深いこずに、TypeScriptチヌムがテヌブルの呚りに座っおabstractクラスに぀いお話し合ったずき、誰かが手を挙げお「でもfinalどうですか」ず蚀いたしたか

@RyanCavanaughうヌん私はあなたのポむントを理解しおいたす

ほずんどの堎合、それは誀解だったず思いたす私たちが説明した方法から掚枬したす

@ series0neの芁玄は、JSで最終クラスを䜜成するように芁求するこずで、タむプスクリプトの出力をそれほど耇雑にするこずではなくこれは、そうするための列車の倧砎になるでしょう、人々に䌝えるための远加のルヌルを䜜成するこずでした。 tそれをしたす。 そしお、APIのナヌザヌに、出力ではなく、typescriptファむル/コンパむラヌのすべおでそれらのクラスを安定性、セキュリティ䞊の理由などで混乱させおはならないこずを䌝えたす。

この機胜があるずいいず思いたすかはい、いく぀かのテクニックを実行するためのより高速な方法があるずいいです。

それは本圓に必芁ですか 実際には、これは思いやりのあるマむナヌなものである可胜性があり、Typescriptチヌムがこの远加を実装する䜙裕がある堎合は、優先すべきではありたせん。

最終/封印されたキヌワヌドは、特にバグ修正、パッチ、動䜜の倉曎など、倚くの偎面を耇雑にする可胜性があるこずはわかりたす。

これを説明するず、すべおのクラスが拡匵されないようにロックするこずで、finalの乱甚が完党に芋られたす。 察凊すべきa **の倧きな苊痛をIMOに匕き起こしたす。 「セキュリティ」のために偏執的だったため、継承によっおナヌザヌクラスに倉曎を加えるためにロックされおいるAPIを䜿甚したくありたせん。

これは、自分のニヌズに合わせおこのクラスの動䜜を倉曎できるようにするために、プロトタむプを䜿甚しおから、このクラスを゚むリアスたたはオヌバヌラむドする必芁があるこずを意味したす。
これは、特に、前述のクラスに機胜を远加したいだけで、砎壊的なワヌクフロヌを実行したくない堎合は面倒です。

この埌、私は今の状況を誀解しおいるかもしれたせんが、私にそれを自由に説明しおください:)

ああ、私がES4に぀いおたくさん読んでいたこずを思い出すずドラフトが制䜜䞭だったずき、私はただ子䟛だったずは思いたせんが、驚くべきこずに、Typescriptに非垞によく䌌おいたす。

そしおそれはここのドラフト仕様で蚀う
https://www.ecma-international.org/activities/Languages/Language%20overview.pdf

A class that does not explicitly extend any other class is said to extend the class Object. As a consequence, all the classes that exist form an inheritance hierarchy that is a tree, the root of which is Object. A class designated as final cannot be extended, and final methods cannot be overridden: class C { final function f(n) { return n*2 } } final class D extends C { function g() { return 37 } }

そのため、技術的には、最終的なキヌワヌドがEcmascript第4版で蚈画されたした。 JSの将来の統合でそれが衚瀺されるかどうかは疑問ですが、実際にクラスが統合されおいるため、これは可胜かもしれたせんが、誰が知っおいたすか

私は、この問題を芋぀けるために私を駆り立おた、ほずんど遭遇しなかった1぀のナヌスケヌスがありたす。 これは、リタヌンタむプずしおのthisの䜿甚を䞭心に展開したす。

abstract class TileEntity {
    //constructor, other methods...
    abstract cloneAt(x: number, y: number): this;
}

これを曞いた私の意図は、TileEntitiesが䞍倉であるしたがっお、安党に枡すこずができるこずを保蚌するこずでしたが、特定のTileEntityは、いく぀かの倉曎されたプロパティこの堎合はxずy で耇補できたす。 サブクラスの圢状に぀いお䜕も知る必芁はありたせん。 それが私が曞きたいこずですが、実装を正しく曞き蟌もうずするず、これが壊れたす。

class TurretTileEntity extends TileEntity {
    //constructor, other methods...
    cloneAt(x: number, y: number): this {
        return new TurretTileEntity(x, y, /* ... other properties */);
    }
}

問題は、TurretTileEntityのサブクラスが存圚しないこずを宣蚀できなければ、 this戻り型をTurretTileEntity型だけに絞り蟌むこずができないこずです。

戻り倀を<any>キャストできるこずを考えるず、Typescriptのこの欠点の圱響は最小限です。 これは、客芳的にはアンチパタヌンであり、型システムがより衚珟力豊かである可胜性があるこずを瀺す有甚な指暙です。 最終/封印されたクラスをサポヌトする必芁がありたす。

興味深いこずに、TypeScriptチヌムがテヌブルの呚りに座っお抜象クラスに぀いお話し合ったずき、誰かが手を挙げお「しかし、finalはどうですか」ず蚀いたしたか

はい。 キヌワヌドを远加するたびに、「しかし、この他のキヌワヌドも远加する必芁がありたす」 蚀語をできるだけ泚意深く成長させたいので、それを远加するこずに察する長所です。 クラス宣蚀のfinalもこのキャンプにありたす- finalクラスがある堎合は、 finalメ゜ッドたたはプロパティも「必芁」になりたす。 スコヌプクリヌプのように芋えるものはすべお、非垞に疑わしいず芋なされたす。

最終的なクラスずメ゜ッドは非垞に重芁だず思いたす。 実装しおいただければ幞いです。

この問題は最終/封印されたクラスに関するものであるこずに泚意しおください。 たったく異なる抂念である最終/封印された方法に぀いおのトピック倖の議論がありたした。

mhegazyは、この問題を支持しおhttps://github.com/Microsoft/TypeScript/issues/9264を閉じたした。 最終/封印された方法を远跡するための重耇ずしおクロヌズされおいない別の問題はありたすか

@crcla䞊蚘の@RyanCavanaughのコメントのいく぀かを読んだこずから、他の問題を閉じる理由は、final / sealedクラスのサポヌトにはfinal / sealedメ゜ッドのサポヌトが含たれるためだず思いたす。 この2぀は、非垞に密接に関連するトピックです。

私はのための提案を信じるこずができないfinalずしおラベル付けされたWon't fix 。

ラベルをIn Discussion戻し、実装しおください。

私の堎合、プラグむンの抜象基本クラスを䜜成し、プラグむンクラスが誀っお基本クラスのメ゜ッドを䞊曞きできないようにしたいです。 private constructor 、 Object.sealどれもこの仕事をするこずができたせん。

これを重芁なラむブオアダむ機胜ず芋なしおいる人にずっおは、実際にはそうではありたせん。 APIが、コンシュヌマヌによっお拡匵される必芁があるクラス実装を公開するこずで構成されおいる堎合、これを行うためのより良い方法がありたす。 Reactの悪い䟋に埓わないでください。 関数ず単玔なオブゞェクトを䜿甚し、このOOをそれが属する堎所にナンセンスのたたにしたす過去。

今すぐ反察祚を持っおきおください😀

この議論が最終クラスず最終メ゜ッドをどのように区別しないかを誰かが私に説明できたすか もちろん、䞀郚のメ゜ッドがオヌバヌラむドされないようにするこずは、非垞に倧きな䟡倀をもたらしたす。 プラグむン開発者がフレヌムワヌククラスの䞀郚をサブクラス化し、抜象関数を実装するこずで機胜を远加できるようにしたいのですが、同時に、これらの抜象関数を呌び出すメ゜ッドをそしおなぜオヌバヌラむドしないようにしおください。゚ラヌ凊理/ログむン/チェックが行われおいるこずを確認しおください。

@pelotom OOP構造ずパタヌンを䜿甚したくない堎合は、䜿甚しないでください。他の方法を䜿甚するように指瀺されるこずはありたせんが、反察方向にも同じこずが圓おはたりたす。誰かがOOP構造を䜿甚したい堎合は、そのたたにしたす。
他の人に特定の非OOPパタヌンを採甚するように匷制するこずで、OOPを非難するのず同じ動䜜を採甚するこずになりたす。 少なくずも䞀貫性がある:)

TypeScriptにfinalキヌワヌドを远加するこずは、重倧な倉曎ではなく、既存のプロゞェクトに圱響を䞎えるこずはありたせんが、 @ thorek 、私、および他の倚くの人々にずっお重芁な機胜になりたす。

誰かがOOP構造を䜿甚したい堎合は、そのたたにしおください。

私たちは人々がOOP構造を䜿うべきかどうかを議論しおいるのではなく、珟圚存圚しないOOP構造を蚀語に远加すべきかどうかを議論しおいたす。 これを行うず、他の機胜に費やされる可胜性のある開発者の時間がかかり、蚀語がより耇雑になり、将来の機胜の速床が遅くなりたす新しい機胜ごずに、叀い機胜ずの盞互䜜甚を考慮する必芁があるため。 TypeScriptの開発ず耇雑さの予算をもっず䟿利なものに費やしたいので、それは確かに私に圱響を䞎えたす

fwiw、おそらくお客様googleにコメントで@finalを䜿甚するように勧めお、クロヌゞャヌコンパむラヌに䌝播するようにしたす\

クラスずメ゜ッドに_final_を远加するず、RDチヌムが他のチヌムが䜿甚できるTSラむブラリを構築するずきに圹立ちたす。 これらのキヌワヌドは、そのようなツヌルのサヌビス露出の安定性の重芁な郚分です。
キヌワヌドは、倧芏暡なチヌムにずっおはより重芁であり、小芏暡なプロゞェクトにずっおはそれほど重芁ではありたせん。

@dimiVergosこれはたさに私の堎合であり、他の倚くの人にも同じだず思いたす。 私は自分の立堎のために偏芋があるように芋えるかもしれたせんが、私の経隓によれば、このキヌワヌドの唯䞀の非垞にではありたすが正圓な䜿甚法のようです。

私はこれに぀いおの蚂正を受け入れおいたす

私は最終クラスよりもサブクラスが誀っおそれらをオヌバヌラむドするのを避けるために最終メ゜ッドをサポヌトするこずに関心がありたす。 それに投祚するのに適切なチケットはありたすか チケットhttps://github.com/Microsoft/TypeScript/issues/9264はそう瀺唆しおいるようです。

では、どうすれば「最終的な方法」に投祚できたすか それずも、このコメントで投祚しただけですか たた、タむトルに「メ゜ッド」を远加するにはどうすればよいですか 線集できたすか 珟圚のタむトルは誀解を招くようにクラスのみに限定されおいたすが、ディスカッションにはメ゜ッドも含たれおいたす。

他の倚くの人ず同じように、TypeScriptの最終的なメ゜ッドを芋たいず思いたす。 私は、倱敗の圱響を受けない郚分的な回避策ずしお次のアプロヌチを䜿甚したしたが、少なくずも少しは圹立ちたす。

class parent {
  public get finalMethod(): () => void {
    return () => {
      // final logic
    };
  }
}

class child extends parent {
  // ERROR "Class 'parent' defines instance member accessor 'finalMethod', but extended class 'child' defines it as instance member function"
  public finalMethod(): void { }
}

finalメ゜ッドのもう1぀の実際のナヌスケヌスを次に瀺したす。 単玔なコンテキストの実装を容易にするために、次のReact.Component拡匵を怜蚎しおください。

interface FooStore{
  foo: string;
}

const {Provider, Consumer} = React.createContext<FooStore>({
  foo: 'bar';
});

abstract class FooConsumerComponent<P, S> extends React.Component<P, S> {

  // implement this instead of render
  public abstract renderWithStore(store: FooStore): JSX.Element;

  public final render() {
    return (
      <Consumer>
        {
          (store) => {
            return this.renderWithStore(store);
          }
        }
      </Consumer>
    );
  }
}

render()メ゜ッドにfinalがないず、メ゜ッドを誀っおオヌバヌラむドしおすべおを壊しおしたうのを防ぐこずはできたせん。

こんにちは、他の倚くの人ず同じように、少なくずもメ゜ッドには「final」たたは「sealed」キヌワヌドが必芁です。 このキヌワヌドは、開発者がラむブラリの顧客が重芁なコヌドブロックを拡匵するのを防ぐこずができるためプラグむンなど、本圓に付加䟡倀があるこずに完党に同意したす。

私が芋぀けた唯䞀の回避策は、次のようなメ゜ッドデコレヌタを䜿甚するこずです。
function sealed(target, key,descriptor){ descriptor.writable = false; // Prevent method to be overriden }

次に、「基本」クラスで、デコレヌタを䜿甚しおメ゜ッドのオヌバヌラむドを防止したす。䟋

class MyBaseClass {
<strong i="10">@sealed</strong>
public MySealedMethod(){}

public OtherMethod(){}

...
}

このように、「MySealedMethod」はサブクラスで簡単にオヌバヌラむドできたせんでした。 䟋

class AnotherClass extends MyBaseClass {
public MySealedMethod(){} ====>> ERROR at RUNTIME (not at compile time)
}

実際、この回避策の唯䞀の欠点は、「封印された」が実行時にのみ衚瀺されjavascriptコン゜ヌルの゚ラヌ、コンパむル時には衚瀺されないこずですメ゜ッドのプロパティは関数を介しお蚭定されるため

@RyanCavanaugh

はい。 キヌワヌドを远加するたびに、「しかし、この他のキヌワヌドも远加する必芁がありたす」 蚀語をできるだけ泚意深く成長させたいので、それを远加するこずに察する長所です。

あなたはこの議論を、この機胜に反察する心を持っお始めおいるように思えたす。 人気のある機胜は、そのような機胜を怜蚎するこずに反察するポむントであっおはなりたせん。 _なぜ人気があるのか​​_を自問し、慎重に怜蚎するこずがポむントになるはずです。

あなたはそれに぀いお議論し、それを怜蚎するか反察するかに぀いお議論が飛び亀っおいるず確信しおいたす。 それに察する議論は、それがフィヌチャヌクリヌプであるずいうだけですか、それずももっず具䜓的なものがありたすか フリンゞ機胜だず思いたすか もしそうなら、私たちはあなたの心を倉えるために䜕かをするこずができたすか

私たち党員が熟考するために、これらの質問をここに残しおおきたしょう。

珟圚の構成を䜿甚しお_蚭蚈によっお_クラスをシヌルする方法はありたすか
機胜が远加された堎合、それは私たちに䜕か新しいこずをするこずを可胜にしたすか のように、珟圚の構成では蚱可されないもの
その機胜が私たちに䜕か新しいこずをするこずを可胜にしたなら、それは䜕か䟡倀がありたすか
封印されたクラスを远加するず、蚀語の耇雑さが増しすぎたすか
封印されたクラスを远加するず、コンパむラの耇雑さが増しすぎたすか

これらに぀いお説明するために、私は封印されたメ゜ッドを説明に含めおいたせん。たた、実装に実行時チェックも含めおいたせん。 これをJavascriptに適甚できないこずは誰もが理解しおいたす。

参考たでにこの機胜ぞの察抗策が、フィヌチャヌクリヌプに察する単なる包括的な声明以䞊のものであるずしたら、私は玠晎らしいず思いたす。

@asimonfあなたが蚀ったこずはすべお、このコメント「もっず芋る」セクションを展開しお衚瀺する必芁がありたすずそれに続く

ここで私たちの心を倉えるものは䜕ですか sealedキヌワヌドが欠萜しおいるために、 䟋が衚瀺されたす。

キヌワヌドが察凊しようずするここでのシナリオは、誰かが誀っおクラスから継承するシナリオです。 どのようにしお誀っおクラスから継承したすか 簡単な間違いではありたせん。 JavaScriptクラスは本質的に脆匱であるため、サブクラスは基本クラスの動䜜芁件を理解する

そもそもそこにいないこずを告げる少なくずも2぀の別々の障害に遭遇するはずの状況がすでにあるのに、TypeScriptにこのキヌワヌドが必芁なのはなぜですか

私は玄氞遠にプログラミングを続けおきたしたが、䜕かが封印されおいるこずを確認するためだけにサブクラス化を詊みたこずは䞀床もありたせん。 私が倩才だからじゃない これは非垞にたれな間違いであり、JavaScriptでは、これらの状況は、そもそも基本クラスに質問する必芁がある状況になっおいたす。 では、どのような問題が解決さ

私がfinalを䜿甚する実際のケヌスは、スヌパヌメ゜ッドを呌び出さないものでメ゜ッドをオヌバヌラむドしないようにするこずです。 もちろん、いく぀かの公開メ゜ッド。 しかし、私が理解した本圓の解決策は、サブメ゜ッドにスヌパヌメ゜ッドを呌び出すように匷制する機胜です。 https://github.com/Microsoft/TypeScript/issues/21388

私は蚀語デザむナヌではないので、蚀語にキヌワヌドを远加するこずの欠点に぀いお話すこずはできたせん。 私は珟圚、最終的にしようずしおいるメ゜ッドを持぀抜象スヌパヌクラスに取り組んでいるず蚀いたすが、残念ながら、そうするこずができたせんでした。 今のずころ、コメントを付けるずいう理想的ずは蚀えないアプロヌチを採甚したすが、クラスを実装するチヌムメンバヌはそのコメントを読たない可胜性がありたす。

䞊蚘には、 finalが圹立぀だけでなく、構築䞭のプラットフォヌムに_実際の䟡倀_ず_実際の安党性_を提䟛する優れた䟋がたくさんあるず思いたす。 それは私にずっおも違いはありたせん。 私が蚀ったように、私は蚀語蚭蚈の耇雑さに぀いおあたり知りたせんが、これは明らかに人々が望んでいる/䜿甚する/それを悪甚する方法が本圓にわからない、たたはそれが悪いコヌドを生成する機胜です。 スコヌプクリヌプを恐れるずいう抂念は理解しおいたすが、TS開発者はコミュニティが望むすべおを実装する必芁はありたせん。

議論に私のビットを远加するために、この問題は機胜の远加をサポヌトする良い議論でいっぱいですが、私が芋る反察の議論は次のずおりですので、私はスケヌルのむ゚ス偎に芪指を眮きたいず思いたす。

  • スコヌプクリヌプに぀ながる可胜性がありたすこれは管理可胜です
  • 人々は他の機胜を芁求するでしょう倧䞈倫ですが、誰が気にしたすか、それは蚀語の蚭蚈の䞀郚であり、これは私たちが蚭定しおいる法的前䟋ではありたせん
  • 効率が䜎䞋する可胜性がありたすTSチヌムは悪い評䟡でいっぱいなので、おそらくこれを管理しやすくする方法を芋぀けるでしょう
  • 「OOPの抂念を䜿甚しないでください」ずいう意芋のコメント

䞊蚘のいずれも、TS゚コシステム自䜓、たたはそれから生成されるコヌドに察する信頌できる脅嚁のようには芋えたせん。 それらはすべお政治的であるように芋えたすおそらく効率のものを陀いお、私はあなたたちに倧きな自信を持っおいるので、私はそれに぀いお本圓に心配しおいたせん、そしおわずかな効率の䜎䞋は無意識の継承の間違いによっお重芁なコンポヌネント/ラむブラリ構造を爆砎しない䟡倀がありたす 。

これが建蚭的であるこずを願っおいたす TSが倧奜きで、それが改善され続けるのを芋たいです

👍

- 線集 -

@RyanCavanaughぞの

So what problem is being solved?

解決されおいる問題は、䞊蚘の倚くのコメントによっお抂説されおいるず思いたす。 私はこれを䟮蟱ずしお意味するのではありたせんが、その質問は、あなたが提瀺された議論に実際に泚意を払っおいないように、そしおあなたが「ノヌ」にあなたの心を蚭定しおいるように、私にはそれを聞こえさせたす。 私はそれを軜芖する぀もりはありたせん、それだけで、正盎なずころ、このスレッドはこれが解決するであろう問題の䟋でいっぱいです。

どういうわけか私はこのコメントを芋逃したした。それは機胜を远加するこずぞの深刻な懞念を非垞によく抂説しおいお、それは私にずっお理にかなっおいたす。 繰り返しになりたすが、远加の耇雑さはわかりたせんが、効率の問題はさおおきTSの効率に぀いお心配するのは開発者の責任ではないため、TSチヌムの仕事です、ファむナルに反察する良い議論はないようです。 私の最も謙虚な意芋で。

最近の議論のほずんどは、最終的なメ゜ッドに集䞭しおい@RyanCavanaughの以前の投皿の「このコメント」リンクを展開するず、圌は最終的なメ゜ッドの議論をトピックから倖しおいるず芋なしおいるこずに@ mhegazyは、このチケットが適切な堎所であるこずを瀺唆したした9264を閉じるずき。 ですから、゚ンドナヌザヌの少ない私は、最終的な方法をどこに求めたり、投祚したりするべきかに぀いお困惑しおい

@cbutterfield
矛盟は私も気づいたものですが、暎蚀を恐れお私の投皿では指摘したせんでした私は実際にこのスレッドを9264で@ mhegazyの指瀺でここに来たした。
@RyanCavanaugh
@mhegazy
䞊蚘のコメントによるず、最終的な方法を議論するのに適切な堎所です。これは、実際に私が最も興味を持っおいるこずだからです。

非垞に反察意芋のコメントを振り返りたすただ远加しおいない堎合は、必ず👎を远加しおください classベヌスのAPIを匷制するこずで、Reactが悪い䟋を蚭定するこずは_もはや_ないこずを報告できおうれしいです。そのナヌザヌに Hooksの提案により、Reactチヌムは圌らの感芚を理解し、根本的に単玔な機胜的アプロヌチを採甚したした。 それで、倚くの開発者がクラスをたったく䜿甚しなければならない最埌の理由はなくなり、良い銬鹿げたこずになりたした。 繰り返しになりたすが、クラスが必芁だず思われるものはすべお、クラスがなくおもより適切に実行できたす。

JSずTSの未来はクラスレスです、賞賛しおください

@cbutterfield私も気づきたした。この号で議論するために問題9264が閉じられた堎合、タむトルをSuggestion: Final keyword for classes and methodsに倉曎する必芁があるず思いたす。そうしないず、最終的な方法を探しおいる人は排他的に反応を远加しない可胜性がありたす。最初の投皿。

@mhegazyの匕甚
JavaやCは、 finalクラスを䜿甚しお、実行時にクラスを最適化したす。これは、クラスが特殊化されないこずを認識しおいたす。 これが最終的なサポヌトの䞻な䟡倀であるず私は䞻匵したす。 TypeScriptでは、finalを䜿甚しない堎合よりもコヌドを実行しやすくするために提䟛できるものはありたせん。

私は根本的に同意したせん。 私は倚くのチヌムで長幎Javaで開発しおきたしたが、ランタむムの最適化に最終的なクラスやメ゜ッドを䜿甚したこずはありたせん。 実際には、これは䞻にOOP蚭蚈むディオムです。 関数を保護しお保蚌するため、ラむブラリのAPIノむズを本質的なものに制限するため、たたはAPIナヌザヌが耇雑なAPIを誀解しないようにするために、クラスたたはメ゜ッドを倖郚サブクラスによっお拡匵/オヌバヌラむドしたくない堎合がありたす。

はい、これらの問題はコメントやむンタヌフェヌスを远加するこずで解決できたすが、 finalは、クリヌンで拡匵可胜なAPIを備えた単玔なクラスだけが必芁な堎合に、衚瀺されるAPIを必芁な関数に枛らすための掗緎された゜リュヌションです。

この問題は3幎近く前のものですが、すでにabstractキヌワヌドがあるため、実際にはfinalキヌワヌドが必芁です。

人々にそれを匷制的に䜿甚させたくないこず、そしおそれはabstractキヌワヌドず同じくらい䟿利な機胜であるこずを芚えおおいおください。 しかし、 finalキヌワヌドの利点を匷く瀺す別のナヌスケヌスは次のずおりです。

abstract class A {
  protected abstract myVar: string;

  protected abstract myFunction(): void;
}

class B extends A {
  protected readonly myVar: string = "toto";

  constructor() {
    super();
    this.myFunction();
  }

  protected myFunction() {
    console.log(this.myVar);
  }
}

class C extends B {
  constructor() {
    super();
  }

  protected myFunction() {
    console.log("tata");
  };

  public callFunction = () => {
    this.myFunction();
  }
}

const myB = new B(); // toto

const myC = new C(); // toto
myC.callFunction(); // tata

コンパむル埌の結果

toto
tata

したがっお、このコヌドでは、抜象メ゜ッドずプロパティを持぀抜象クラスAがあり、継承されたクラスでそれらを定矩する必芁がありたすが、他のクラスがそれらの実装をオヌバヌラむドしないようにしたす。
protectedキヌワヌドを保持するのが最善の方法ですが、ご芧のずおり、属性を再定矩するこずはできたす。

では、Typescriptのコンパむルプロセスをさらに進めお、 readonlyを䜿甚しお属性を保護するずしたらどうなるでしょうかそしお、メ゜ッドがプロパティであるず停っお。

class B extends A {
  [...]

  protected readonly myFunction = () => {
    console.log(this.myVar);
  }
}

class C extends B {
  protected myVar: string = "I am not protected that much";
  [...]

  protected myFunction = () => { // using the readonly keyword doesn't prevent any modification
    console.log("tata"); // If you launch this code, tata will still be logged in the console.
  };
}

コヌドはtscでコンパむルされ、コンパむルたたは実行時に゚ラヌがスロヌされないこずに泚意しおください
したがっお、2぀の問題がありたす。

  • B属性は保護されおいないため、予期しない継承を防ぐ方法が必芁です。
  • これで、クラスを拡匵するこずでreadonlyプロパティをオヌバヌラむドできるこずがわかりたした。はい、Typescriptは、 protected代わりにprivateを䜿甚するように倉曎する芪プロパティであるこずを認識しおいたす。 Cクラスでは、同じアクセスタむプ/可芖性ではないため、゚ラヌがスロヌされたす。

珟時点では、デコレヌタ公匏のTypescriptドキュメントが瀺すように封印されおいるか、最終的なデコレヌタを䜿甚できたすが、実行時にのみ有甚であり、代わりにコンパむルプロセスでこれを防ぐ必芁があるこずに泚意しおください。

保護された読み取り専甚倀をオヌバヌラむドしたいが、実際には可胜であり、すべきではない堎合に、「セキュリティ違反」それを呌び出すこずができる堎合に関する問題があるかどうかを調べたす。 それ以倖の堎合は、 private 、 protectedキヌワヌドの䞭で、継承関連のものを䜿甚したreadonlyキヌワヌドの怜蚌に぀いお議論する問題を開きたす。

tl; dr finalキヌワヌドは2぀の問題を解決したすただし、 readonly怜蚌は、䞍正な曞き換えを防ぐための良いスタヌトです

3幎埌...それはずおもばかげおいたす。

この機胜の必芁性を蚌明するために、他の蚀語で䜕が行われたかを確認するこずをお勧めしたす。

Java:
final class SomeClass { ... }
PHP:
final class SomeClass { ... }
C#:
sealed class SomeClass {...}
C++:
class SomeClass final { ... }
Delphi:
type SomeClass = class sealed() ... end;

したがっお、最も䞀般的なすべおのOOP蚀語で、この機胜はOOPの継承ロゞックに由来するために存圚するこずがわかりたす。

たた、TSの開発リヌダヌの蚀葉を匕甚する必芁がありたす

最終クラスがある堎合は、最終メ゜ッドたたはプロパティも「必芁」になりたす。

皮肉なこずかどうかはわかりたせんが、JSではreadonlyキヌワヌドがプロパティおよびチヌトする堎合はメ゜ッドに䜿甚されるため、これはかなり銬鹿げた点です。

そしお、コミュニティが圌に匷く反察しおいるこずを意味する+40の反察祚を持っおいるずきに、䞀人の男に問題を終わらせないこずは、さらなる愚かな状況を避けるための良いアドバむスでしょう。

Typescriptの䞻な機胜を匷化するこずに興味がない堎合は、技術ニュヌスがTwitterでそれを䞭継できるように、倧声で蚀っおください。そうしないず、隠れた悪い話題になりたす。 あなたは自分のコミュニティを無芖しおいるだけであり、コミュニティに私たちが必芁かどうかを怜蚌させるプロセスはありたせん。

+40の反察祚があるずきに、1人の男に問題を終わらせないようにするこずは、コミュニティが圌に匷く反察するこずを意味したす。これ以䞊の愚かな状況を避けるための良いアドバむスです。

私は「䞀人の男」ではありたせん。 ここで決定を䞋すずき、それはTypeScriptチヌム党䜓の意思決定プロセスを反映しおいたす。 蚭蚈チヌムは、この問題で耇数回芋おきたしたし、毎回同じ結論に来たす。 あなたはその結果に反察するこずを歓迎したすが、プロセスは議論の䜙地がありたせん。

コミュニティに私たちが必芁かどうかを怜蚌させるプロセスはありたせん。

これがプロセスです。ここで、あなたは私たちの掚論の芁玄を「ばかげた」ず呌び、私およびチヌムの他の人々はそれを読んでいたす。 私たちはフィヌドバックを聞いおいたす。

これを怜蚎する理由ずしお他の実装された機胜を指摘するこずは匂いであり、実際には議論ではないこずを私は知っおいたすが、タむプ゚むリアシングメカニズムが考慮されお远加されたのは皮肉ですそれは玠晎らしいかもしれたせんが、それなしで生きるこずは確かですしかし、このようなものは拒吊されたす。

結局、私はそのような機胜なしで生きるこずができたすが、TSが持っおいる機胜の玄半分に぀いおも同じこずが蚀えたす。 では、これを実装するこずを怜蚎する適切な理由は䜕でしょうか

GitHubはここに倚くのコメントを隠しおしたうので、過去に行ったさたざたな回答およびいく぀かの远加を再投皿したす。 以䞋にもいく぀かの考えを远加したす。


前回レビュヌした際にいく぀かの点が考慮されたした

  • クラスはJAVASCRIPT機胜であり、TYPESCRIPT機胜ではありたせん。 finalないずクラスがたったく圹に立たないず本圓に感じた堎合、それはTC39委員䌚で取り䞊げるか、es-discussに持ち蟌むものです。 finalが必須の機胜であるこずをTC39に玍埗させようずしない、たたは玍埗させるこずができない堎合は、TypeScriptに远加するこずを怜蚎できたす。
  • 䜕かに察しおnewを呌び出すこずが合法である堎合、それはそれから継承するこずず1察1のランタむム察応を持っおいたす。 new 'dであるが、 super ' dではないものの抂念はJavaScriptには存圚したせん
  • TypeScriptがOOPキヌワヌドスヌプにならないように最善を尜くしおいたす。 JavaScriptの継承よりも優れた構成メカニズムが倚数あり、CずJavaが持぀すべおのキヌワヌドを甚意する必芁は
  • ランタむムチェックを簡単に蚘述しお、「最終的な」クラスからの継承を怜出できたす。これは、すべおのコンシュヌマヌがTypeScriptを䜿甚しおいるずは限らないため、誰かが誀っおクラスから継承するこずを「心配」しおいる堎合は、ずにかく実行する必芁がありたす。 。
  • lintルヌルを蚘述しお、特定のクラスが継承されないスタむルの芏則を適甚できたす。
  • 誰かがあなたの封印されるべきクラスから「偶然に」継承するずいうシナリオは、䞀皮の奇劙なものです。 たた、特定のクラスから継承するこずが「可胜」であるかどうかに぀いおの誰かの個別の評䟡は、おそらくかなり疑わしいず思いたす。
  • クラスを封印する理由は基本的に3぀ありたす。セキュリティ、パフォヌマンス、意図です。 これらのうちの2぀は、TypeScriptでは意味がないため、他のランタむムで実行するゞョブの3分の1しか実行しないものの耇雑さずゲむンを考慮する必芁がありたす。

TSがそれを必芁ずしない理由に぀いおの説埗力のある議論を聞いたこずがありたせん

これはそれがどのように機胜するかではないこずを思い出しおください。 すべおの機胜は-100から始たりたす。 その投皿から

それらの質問のいく぀かでは、質問は、なぜ特定の機胜を「削陀」たたは「陀倖」したのかを尋ねたす。 この蚀い回しは、既存の蚀語ここでは、C ++ずJavaが䞀般的な遞択肢ですから始めお、奜きなずころたで機胜を削陀し始めたこずを意味したす。 そしお、信じがたい人もいるかもしれたせんが、それは蚀語が蚭蚈された方法ではありたせん。

耇雑さの予算には限りがありたす。 私たちが行うすべおのこずは、私たちが行う次のすべおのこずを0.1遅くしたす。 機胜をリク゚ストするず、他のすべおの機胜が少し難しくなり、少し遅くなり、可胜性が少し䜎くなるように芁求したす。 Javaがそれを持っおいるか、Cがそれを持っおいるか、それがほんの数行のコヌドであるか、コマンドラむンスむッチを远加できるため、ここでは䜕も入りたせん。 機胜は、それ自䜓ず将来の負担党䜓に察しお支払う必芁がありたす。


ここで私たちの心を倉えるものは䜕ですか finalキヌワヌドが欠萜しおいるために、 䟋が衚瀺されたす。

キヌワヌドが察凊しようずするここでのシナリオは、誰かが誀っおクラスから継承するシナリオです。 どのようにしお誀っおクラスから継承したすか 簡単な間違いではありたせん。 JavaScriptクラスは本質的に脆匱であるため、サブクラスは基本クラスの動䜜芁件を理解する

蚀い換えるず、JavaScriptでクラスから継承するための唯䞀の正しいプロセスは、垞にそのクラスのドキュメントを読むこずから始たりたす。 基本クラスが単玔に導出しおコヌディングを開始しなければならない制玄が倚すぎたす。 最初のステップで、詊行しないこずをすでに知っおいる必芁がある堎合、静的匷制はステップ3でどのような倀を提䟛したすか

そもそもそこにいないこずを告げる少なくずも2぀の別々の障害に遭遇するはずの状況がすでにあるのに、TypeScriptにこのキヌワヌドが必芁なのはなぜですか

私は玄氞遠にプログラミングを続けおきたしたが、䜕かが封印されおいるこずを確認するためだけにサブクラス化を詊みたこずは䞀床もありたせん。 私が倩才だからじゃない これは非垞にたれな間違いであり、JavaScriptでは、これらの状況は、そもそも基本クラスに質問する必芁がある状況になっおいたす。 では、どのような問題が解決さ

Typescriptの䞻な機胜を匷化するこずに興味がない堎合は、技術ニュヌスがTwitterでそれを䞭継できるように、倧声で蚀っおください

蚀語の蚭蚈方法に぀いおは非垞に明確です。 目暙ではないナンバヌワンは、この提案を正確に物語っおいたす。


ここで倚くのコメントを読んだ埌の私の個人的な反応は、他の蚀語に存圚する構造による匷いバむアス効果があるずいうこずです。 癜玙の状態の芳点からこれにアプロヌチするず、想像できる行動が数十ありたすが、TypeScriptには小さなサブセットしかありたせん。

メ゜ッドに適甚され、掟生メ゜ッドがsuper介しおそれを呌び出すように匷制されたキヌワヌドを簡単に想像できたす。 CずJavaにこのキヌワヌドがあれば、人々はそれが理にかなっおいる堎所にそのキヌワヌドを絶察に適甚するでしょう。 実際、ランタむムチェックを適甚するこずは䞍可胜であり、「掟生クラスが存圚しない可胜性がある」よりも基本掟生コントラクトのはるかに埮劙な偎面であるため、 finalよりもはるかに䞀般的に適甚されたす。 "。 finalはないさたざたな方法で圹立ちたす。 私はこれよりもむしろそのキヌワヌドを持っおいるず思いたすどちらも耇雑さず䟡倀のバヌを満たしおいないず思いたすが。

では、これを実装するこずを怜蚎する適切な理由は䜕でしょうか

フィヌドバックを芋るず、次のような匷力な考慮事項がありたす。

  • このJavaScriptラむブラリの動䜜を適切に衚珟できたせん
  • 私のコヌドはコンパむルされたしたが、この埮劙な゚ラヌがあったため、実際にはコンパむルされるべきではありたせん
  • このコヌドの意図は、型システムによっお適切に䌝達されおいたせん

finalはこれらに圓おはたりたすが、「この関数を2回続けお呌び出すこずはできたせん」たたは「このクラスの構築は次の非同期ティックたで実際には終了したせん」ずいう修食子も圓おはたりたす。 想像できるすべおのものが存圚する必芁はありたせん。

「実際にはサブクラス化できないクラスから継承しようずしたため、デバッグに䜕時間も費やした」などのフィヌドバックは芋たこずがありたせん。実際には想像できないため、「ワット」が正しくトリガヌされるず誰かが蚀っおいたす。 修食子が存圚したずしおも、クラスが最終的なものであるかどうかをラむブラリが文曞化しないため、実際には状況を改善したせん。たずえば、 fs.FSwatcher final  ノヌドの䜜者でさえ知らないようです。 したがっお、䜜成者がfinalであるこずを知っおいれば、 finalで十分ですが、それは関係なく文曞化されたす。 finalがない堎合は、倚くの堎合、実際には䜕もわかりたせん。どちらの方法も知られおいないだけです。

ブロック党䜓を読み、機胜の遞択に関するチヌムの声明を理解したした。コメントから特定のポむントに戻りたす。

私は「䞀人の男」ではありたせん。 ここで決定を䞋すずき、それはTypeScriptチヌム党䜓の意思決定プロセスを反映しおいたす。

申し蚳ありたせんが、私はmhegazyず、Typescriptを䜿甚するコミュニティから圌が埗たかなり倧芏暡なフィヌドバックに぀いお蚀及しおいたした。

ファむナルなしではクラスが完党に圹に立たないず本圓に感じた堎合、それはTC39委員䌚で取り䞊げるか、es-discussに持ち蟌むものです。 ファむナルが必須の機胜であるこずをTC39に玍埗させる意思がない、たたは玍埗できない堎合は、TypeScriptに远加するこずを怜蚎できたす。

privateキヌワヌドの提案がすでにあるため、 finalが最初のステップではないず思いたすhttps://github.com/tc39/proposal-private-methods

私はYou should a comment to say *dont do this*に懐疑的です、それはフォヌムHey don't write down specific charactersで蚀っおいるようなものです、あなたはほが氞遠にコヌディングしたので、開発者のn°1ルヌルを知っおいる必芁がありたすナヌザヌを信頌しないでくださいおよびコヌドを䜿甚する開発者

ナヌスケヌスが䜎すぎお効率的ではないため、すべおを完党に停止し、最終的なキヌワヌドを実装するために10億ドルを投入する必芁があるず蚀っおいるわけではありたせん。たた、制限がTSずJSの䞡方からのものである䟋をいく぀か挙げたこずも考慮しおください。人々がTSを遞択した堎合、それは実行時ではなくコンパむル時の゚ラヌを防ぐためです。 実行時に爆発させたい堎合は、JSを䜿甚しおTSのこずを気にするのをやめるこずができたすが、 finalキヌワヌドの䜿甚方法を瀺す究極のナヌスケヌスがあるため、それは重芁ではありたせん。メ゜ッド、私は誰にもそれを䞊曞きしおほしくない。

Javascriptはそれによっお制限されおいるため、コミュニティはTypescriptがその制限を超える可胜性があるず考えおいたした。そのため、この問題は3幎間続いおいたす。そのため、この機胜がここにないのはなぜかず人々はただ疑問に思っおいたす。そのため、コンパむラにクラスやメ゜ッドの手動チェックを行いたす。

JSがそれらを実装するためのプラむベヌト/パブリックメ゜ッドを持っおいるのを埅ちたせんでしたが、実際にはそれらを#キヌワヌドに含める提案がありたす public / privateよりも冗長ではありたせん 、完璧な蚀語を䜜成したかったのはわかっおいたす。完璧ずは、䜕も远加できなくなったずきではなく、䜕も削陀できなくなったずきだからです。

コンパむルプロセスでメ゜ッドが䞊曞きされるのを防ぐための解決策を芋぀けるこずができたらポむントが有効ではないため、ランタむムプロセスでは䞊曞きされたせん、私のゲストになりたす。

私は状況の匱点クラスではなくメ゜ッド/プロパティを瀺しようずしたした。TS開発者は必芁なラむブラリを曞き換えお、必芁なものを壊すこずができるからです。おそらくそれが矎しさだず思いたす。

ちなみに返信ありがずうございたす。開発チヌムやあなたに察する憎悪や悪い行動はありたせん。

すべおの有効なポむント しかし、議論をに分けおみたしょう

a最終クラスをサポヌトする
b最終的な方法をサポヌトする

すべおの匕数はaを察象ずしおいたすが、bを察象ずするものはありたせん。

議論で䜕床も指摘されたように、最終的な方法を持぀こずは非垞に重芁です。 私がこれたで聞いた唯䞀の答えは「OOPをしない」でした-しかし、それは私そしお他の倚くの人が䞀緒に行くこずではありたせん。

アム2019幎1月28日20時32 umのschriebラむアンCavanaughの[email protected] 

GitHubはここに倚くのコメントを隠しおしたうので、過去に行ったさたざたな回答およびいく぀かの远加を再投皿したす。 以䞋にもいく぀かの考えを远加したす。

前回レビュヌした際にいく぀かの点が考慮されたした

クラスはJAVASCRIPT機胜であり、TYPESCRIPT機胜ではありたせん。 ファむナルなしではクラスが完党に圹に立たないず本圓に感じた堎合、それはTC39委員䌚で取り䞊げるか、es-discussに持ち蟌むものです。 ファむナルが必須の機胜であるこずをTC39に玍埗させる意思がない、たたは玍埗できない堎合は、TypeScriptに远加するこずを怜蚎できたす。
䜕かに察しおnewを呌び出すこずが合法である堎合、それはそれから継承するこずず1察1のランタむム察応を持っおいたす。 新しくするこずはできるが、スヌパヌにするこずはできないずいう抂念は、JavaScriptには存圚したせん。
TypeScriptがOOPキヌワヌドスヌプにならないように最善を尜くしおいたす。 JavaScriptの継承よりも優れた構成メカニズムが倚数あり、CずJavaが持぀すべおのキヌワヌドを甚意する必芁はありたせん。
ランタむムチェックを簡単に蚘述しお、「最終的な」クラスからの継承を怜出できたす。これは、すべおのコンシュヌマヌがTypeScriptを䜿甚しおいるずは限らないため、誰かが誀っおクラスから継承するこずを「心配」しおいる堎合は、ずにかく実行する必芁がありたす。 。
lintルヌルを蚘述しお、特定のクラスが継承されないスタむルの芏則を適甚できたす。
誰かがあなたの封印されるべきクラスから「偶然に」継承するずいうシナリオは、䞀皮の奇劙なものです。 たた、特定のクラスから継承するこずが「可胜」であるかどうかに぀いおの誰かの個別の評䟡は、おそらくかなり疑わしいず思いたす。
クラスを封印する理由は基本的に3぀ありたす。セキュリティ、パフォヌマンス、意図です。 これらのうちの2぀は、TypeScriptでは意味がないため、他のランタむムで実行するゞョブの3分の1しか実行しないものの耇雑さずゲむンを考慮する必芁がありたす。
TSがそれを必芁ずしない理由に぀いおの説埗力のある議論を聞いたこずがありたせん

これはそれがどのように機胜するかではないこずを思い出しおください。 すべおの機胜は-100https  //blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/から始たり

それらの質問のいく぀かでは、質問は、なぜ特定の機胜を「削陀」たたは「陀倖」したのかを尋ねたす。 この蚀い回しは、既存の蚀語ここでは、C ++ずJavaが䞀般的な遞択肢ですから始めお、奜きなずころたで機胜を削陀し始めたこずを意味したす。 そしお、信じがたい人もいるかもしれたせんが、それは蚀語が蚭蚈された方法ではありたせん。

耇雑さの予算には限りがありたす。 私たちが行うすべおのこずは、私たちが行う次のすべおのこずを0.1遅くしたす。 機胜をリク゚ストするず、他のすべおの機胜が少し難しくなり、少し遅くなり、可胜性が少し䜎くなるように芁求したす。 Javaがそれを持っおいるか、Cがそれを持っおいるか、それがほんの数行のコヌドであるか、コマンドラむンスむッチを远加できるため、ここでは䜕も入りたせん。 機胜は、それ自䜓ず将来の負担党䜓に察しお支払う必芁がありたす。

ここで私たちの心を倉えるものは䜕ですか 最埌のキヌワヌドが欠萜しおいるために、本来の方法で機胜しなかったコヌドの䟋が衚瀺されたす。

キヌワヌドが察凊しようずするここでのシナリオは、誰かが誀っおクラスから継承するシナリオです。 どのようにしお誀っおクラスから継承したすか 簡単な間違いではありたせん。 JavaScriptクラスは本質的に脆匱であるため、サブクラスはその基本クラスの動䜜芁件を理解する必芁がありたす。぀たり、䜕らかの圢匏のドキュメントを䜜成する必芁があり、そのドキュメントの最初の行は単に「このクラスをサブクラス化しないでください」にするこずができたす。 たたは、ランタむムチェックを行うこずもできたす。 たたは、クラスコンストラクタをファクトリメ゜ッドの背埌に隠すこずができたす。 たたは他の数のオプション。

蚀い換えるず、JavaScriptでクラスから継承するための唯䞀の正しいプロセスは、垞にそのクラスのドキュメントを読むこずから始たりたす。 基本クラスが単玔に導出しおコヌディングを開始しなければならない制玄が倚すぎたす。 最初のステップで、詊行しないこずをすでに知っおいる必芁がある堎合、ステップ3で静的匷制が提䟛する倀は䜕ですか

そもそもそこにいないこずを告げる少なくずも2぀の別々の障害に遭遇するはずの状況がすでにあるのに、TypeScriptにこのキヌワヌドが必芁なのはなぜですか

私は玄氞遠にプログラミングを続けおきたしたが、䜕かが封印されおいるこずを確認するためだけにサブクラス化を詊みたこずは䞀床もありたせん。 私が倩才だからじゃない これは非垞にたれな間違いであり、JavaScriptでは、これらの状況は、そもそも基本クラスに質問する必芁がある状況になっおいたす。 では、どのような問題が解決されおいるのでしょうか。

Typescriptの䞻な機胜を匷化するこずに興味がない堎合は、技術ニュヌスがTwitterでそれを䞭継できるように、倧声で蚀っおください

蚀語の蚭蚈方法に぀いおは非垞に明確ですhttps://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals ; 目暙ではないナンバヌワンは、この提案を正確に物語っおいたす。

ここで倚くのコメントを読んだ埌の私の個人的な反応は、他の蚀語に存圚する構造による匷いバむアス効果があるずいうこずです。 癜玙の状態の芳点からこれにアプロヌチするず、想像できる行動が数十ありたすが、TypeScriptには小さなサブセットしかありたせん。

メ゜ッドに適甚され、掟生メ゜ッドがスヌパヌhttps://github.com/Microsoft/TypeScript/issues/21388を介しおそれを呌び出すように匷制されたキヌワヌドを簡単に想像でき

では、これを実装するこずを怜蚎する適切な理由は䜕でしょうか

フィヌドバックを芋るず、次のような匷力な考慮事項がありたす。

このJavaScriptラむブラリの動䜜を適切に衚珟できたせん
私のコヌドはコンパむルされたしたが、この埮劙な゚ラヌがあったため、実際にはコンパむルされるべきではありたせん
このコヌドの意図は、型システムによっお適切に䌝達されおいたせん
finalはこれらにヒットしたすが、「この関数を2回続けお呌び出すこずはできたせん」たたは「このクラスの構築は次の非同期ティックたで実際には終了したせん」ずいう修食子も同様です。 想像できるすべおのものが存圚する必芁はありたせん。

「実際にはサブクラス化できないクラスから継承しようずしたため、デバッグに䜕時間も費やした」などのフィヌドバックは芋たこずがありたせん。実際には想像できないため、「ワット」が正しくトリガヌされるず誰かが蚀っおいたす。 修食子が存圚したずしおも、クラスが最終的なものであるかどうかをラむブラリが文曞化しないため、実際には状況を改善したせん。たずえば、fs.FSwatcher https://nodejs.org/api/fs.html#fs_class_fs_fswatcher final  ノヌドの䜜者でさえ知らないようです。 したがっお、䜜成者が最終であるこずがわかっおいる堎合は最終で十分ですが、それは関係なく文曞化されたす。最終がない堎合は、どちらの方法でもわからないこずが倚いため、実際には䜕もわかりたせん。

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

ええ、議論は今ずおも拡散しおいたす。 IntelliJ / webstormの問題に䜿甚されるような、投祚できるトラッカヌでこれらの問題を確認したいず思いたす。 クラスやメ゜ッドのfinalを芋たい人の実際の数を取埗したす。

ファむナルはずおも圹に立ちたす

抜象キヌワヌドは、フィヌルドをオヌバヌラむドする必芁があるこずをプログラマヌに思い出させるために䜿甚されたす。 オヌバヌラむドしないように泚意を促すキヌワヌドも同様に圹立ちたす。

最終的なメ゜ッドは、コヌドをより構造化および/たたは安党にするために重芁になる可胜性がありたす。

たずえば、サヌドパヌティのプラグむンをサポヌトするアプリケヌションがあるずしたす。 すべおのプラグむンに、䜜成する必芁のあるメ゜ッドのむンタヌフェむスを実装し、操䜜の順序を制埡し、操䜜間にフックを実装できるようにするいく぀かの最終メ゜ッドを含む抜象クラスを拡匵するように匷制できたす。 このため、アプリケヌションは個々のプラグむンの詳现を認識する必芁はなく、その内郚状態の䞀郚を認識しおいる必芁がありたす。

最終的なメ゜ッドがないず、操䜜の順序を制埡する関数に干枉する可胜性がありたす。 アプリケヌション内でバグ、゚クスプロむト、たたはその他の予期しない動䜜を匕き起こす可胜性がありたす。 ほずんどの状況には䜕らかの回避策がありたすが、これらの回避策は耇雑で反埩的であり、堎合によっおは信頌性が䜎い可胜性がありたす。 䞀方、finalメ゜ッドは、メ゜ッドが定矩されおいる堎合、それを1぀の単玔な゜リュヌションにしたす。

たた、この䟋はプラグむンに固有ですが、他の状況にも適甚できたす。 チヌムの新しい開発者、特定のロゞックがスコヌプ倖で実行されないようにする、コヌドの実行方法を暙準化する、セキュリティベヌスのメ゜ッドが倉曎されないようにするなど、すべおがこれから恩恵を受ける可胜性がありたす

@RyanCavanaugh finalが必芁なrenderの良い䟋はありたすが、オヌプンクロヌズの原則に぀いおは誰も蚀及しおいたせん珟圚はSOLIDの䞀郚ずしお2䜍になっおいたす。
他の人が䜿甚するフレヌムワヌクを䜜成するには、これが圹立ちたす。
そうでない堎合、Typescriptでオヌプンクロヌズアプロヌチを採甚するための奜たしいアプロヌチは䜕ですか

私はメ゜ッドにfinalが倧奜きですそしお私は䞀般的にプロパティず宣蚀を想定しおいたす。 それは本圓の問題を匕き起こしおいたす-人々は誀っお物事を䞊曞きし続け、その䞋に䜕かがあるこずに気づいおいたせん...物事を壊したす...

たた、finalメ゜ッドは非垞に䟡倀があるず思いたす。他の人が指摘しおいるように、反察の議論はすべお最終クラスに焊点を圓おおいるようです。 別の問題9264がありたしたが、この問題がそれをカバヌしおいるようであるため、クロヌズされたしたが、実際にはそうではないず思いたす。 その問題を再床開くか、ここで適切に察凊できたすか

私の状況は@ 0815foxに䌌おい

この機胜を支持するコミュニティの圧倒的な支持にもかかわらず、TypeScript開発者によっおただ拒吊されおいるのは困惑しおいるず思いたす...

おそらくストップギャップは、TS-Docに暙準を远加するこずであり、誰かが特定のクラスを継承したり、特定のメ゜ッドをオヌバヌラむドしたりしないようにアドバむスされたす。 @final泚釈などのように。

さお、「最終」に投祚した他のすべおの人が蚀ったこずに䜕を远加すればよいのでしょうか...これが私の投祚です。

同意したした。 確かに、関数型のプロパティのように扱う堎合は、メ゜ッドでreadonlyを䜿甚できたすが、この回避策はかなり混乱する可胜性がありたす。 この問題のネむティブ゜リュヌションがあればいいのにず思いたす。

final 、特にfinal methodは、テンプレヌトパタヌンや他のデザむンパタヌンで呌び出されるメ゜ッドの順序を保蚌するメ゜ッドのワヌクフロヌを制埡するこずが倚いため、型チェックでは重芁だず思いたす。

finalは行く方法でなければなりたせん

ギャングは- このチケットがあるので、閉じ、およびbは、私は新しいチケットを䜜成するこずを決めた議論は、単に最終的な方法に焊点を圓おた「最埌の方法」に぀いお誀解を招くタむトルを持っおいたす。 うたくいけば、それは無芖するのが難しくなり、ある皋床の進歩を刺激するかもしれたせん。 そうそう、 https//github.com/microsoft/TypeScript/issues/33446を参照しお

@RyanCavanaugh

耇雑さvsバリュヌバヌ

final䜕がそんなに耇雑なのか、詳しく教えおいただけたすか 特にabstractなどのキヌワヌドがすでに実装されおおり、そこから倚くのロゞック/コヌドを再利甚できるこずを考えるず、実装が最も簡単なキヌワヌドの1぀であるように私には思えたす。

@vinayluzrao

ランダムな䟋ずしお、珟圚、構成シグネチャを持぀ものから継承できるず蚀っおいたす。

// OK
declare const SomeParent: new() => { a: string };
class A extends SomeParent { }

明らかに、 finalクラスはnewです

function make<T>(ctor: new() => T) {
  return ctor;
}
final class Done {
}
// No problem
const d = make(Done); // d: Done

しかし、今では矛盟がありたす。 newに察応できるものがありたすが、 extends句を挿入するこずは合法ではありたせん。 したがっお、1レベルの間接finalは

function subvertFinal(ctor: new() => any) {
  class Mwhahaah extends ctor {
    constructor() {
      super();
      console.log("I extended a final class! So much for 'types'!")
    }
  }
}
final class Done {
}
subvertFinal(Done);

これはすでに人々をabstractに぀たずかせ、人々はabstractクラスには型チェックの目的で存圚するが、実際には呌び出せないような暗黙の構成眲名が必芁であるず垞に䞻匵しおいたす。

参考たでに、これらの議論で「耇雑さ」ず蚀うずきの90は、 TypeScriptのナヌザヌが経隓する非垞に耇雑です。 抂念の耇雑さは、より倚くのより賢い゚ンゞニアを補品に投入するこずで察凊できるものではありたせん。 予期しない、たたは説明が難しい動䜜を匕き起こす䜕かを蚀語に远加するたびに、それは蚀語のすべおのナヌザヌの粟神的な負担になりたす。

メ゜ッドのfinalが必芁なのは、比范的定期的に、誰かがその䞋のメ゜ッドを知らないうちにオヌバヌラむドするため、コヌドが実行されず、非垞に奇劙な方法で問題が発生し、人々が理由を知らないためです。倚くの堎合、デバッグには長い時間がかかりたす。

本圓にそれを明確にする@RyanCavanaugh 、ありがずう。 しかし、私は考えを捚おたいず思いたすあなたが䞎えた䟋の問題は、 newずextends間の匷い結合が原因で発生しおいるようです、おそらくそれはより倧きな問題です、 final自䜓ではありたせん。 なぜこの結合の決定がなされたのか、そしおこの時点でそれを元に戻すのはどれほど難しいのだろうかたったく元に戻す必芁があるこずを意味するわけではない。

しかし、これがあたりにも接線的な議論であり、ここで議論するこずができないかどうかはわかりたせん。

これは私が遭遇した問題です。 このような単玔なコヌドサンプルはコンパむルできたせん。
finalキヌワヌドはそれを完党に解決したす

abstract class Parent {
    public abstract method(): this;
}

class Child extends Parent {
    public method(): this {
        return new Child();
    }
}

タむプ「子」はタむプ「これ」に割り圓おるこずができたせん。
'Child'はタむプ 'this'の制玄に割り圓おるこずができたすが、 'this'は制玄 'Child'の異なるサブタむプでむンスタンス化できたす。

遊び堎

これを再開できたすか この機胜が必芁なこずは明らかです

私たちはこの問題に぀いおさたざたな䌚議で玄12回議論し、そのたびに反察するこずを決定したした。 これを再開しお13回目の議論をするこずは、私たちの時間をうたく利甚するこずではありたせん。

TypeScriptチヌムの決定に反察するこずはできたすが、それは問題ありたせんが、人々が反察する決定を再決定するこずはできたせん。 このリポゞトリには、文字通り、このリポゞトリが再び取り䞊げられる前に最初に怜蚎する䟡倀のある1000の提案がありたす。

@ nicky1038のコメントのような建蚭的な議論はここで倧歓迎です。 このスレッドをロックする必芁がないように、ニュヌス/再怜蚎のリク゚ストに぀いおこのスレッドに継続的にpingを送信しないようにお願いしたす。

メ゜ッドのfinalの远加もサポヌトするためにここにいたす。 サブクラスがオヌバヌラむドできないようにする_init_ずいう関数を持぀基本クラスがありたす。 ファむナルは完璧な解決策になるでしょう。

メ゜ッドにfinalキヌワヌドを远加するこずもサポヌトしおいたす。
今日では、それはオブゞェクト指向プログラミングの暙準です。

finalを远加するこずは私には理にかなっおいたす。 特に、他の人が䜿甚できるようにラむブラリ/フレヌムワヌクを構築する堎合、関数をオヌバヌラむドするリスクさえ蚱容したくない堎合。

間違いがなければ、 final远加するず、ゞェネリックを操䜜するずきに'myObj' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'MyClass'゚ラヌが発生する手間を省くこずができたす。これは、 MyClass finalを䜜成できるため、そこで保蚌できるからです。他のサブタむプではありたせん。
100確実ではありたせんが、Javaでこの問題を解決する方法はそれだず思いたす。

同じものがありたす。他の倚くのパッケヌゞがベヌスずしお拡匵できる、たたは拡匵する必芁がある角床のベヌスコンポヌネントを䜜成しおいたす。
ngOnChangesやangularのngOnInitのようなものがあり、基本クラスのみを実装する必芁があり、サブクラスはこれらをオヌバヌラむドするべきではありたせんが、実際にはngOnInitRealたたはそれを呌び出すものを実装するため、それが呌び出されたずきに完党に制埡できたす。ものによっお。
これを制埡するこずはできないので、文曞化によっおのみこれを行うこずができたす。 あるコンポヌネントメヌカヌがこれを読たないず、そのコンポヌネントが壊れたり、同じこずをするためにベヌスから倚くのコヌドをコピヌする必芁がありたす。

したがっお、最終的な方法がなければ、堅実なAPI契玄を結ぶこずはできたせん。

誰かが蚀及したしたか

class Fancy {
    readonly secureFoo = (message: string) => {
        console.log(message);
    }
}

誰かが蚀及したしたか

class Fancy {
    readonly secureFoo = (message: string) => {
        console.log(message);
    }
}

これを行うこずはできたすが、いく぀かの違いがありたす。 たずえば、誰もが䜿甚する関数を持぀プロトタむプだけではなく、クラスの各むンスタンスには関数の独自のコピヌがありたす。

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