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 생성자가 있는 큎래슀는 확장할 수 없습니닀. 대신 읎것을 사용하는 것을 고렀하십시였.

ë‚Žê°€ Ʞ억한 바에 따륎멎 컎파음러가 생성자의 private 킀워드륌 좋아하지 않는닀고 확신했습니닀. 붙여 넣Ʞ 버전을 사용하지 않을 수도 있지만

읎것은 새로욎 Ʞ능읎며 TS 2.0에서 출시될 예정읎지만 typescript@next 사용하여 사용핎 볌 수 있습니닀. 자섞한 낎용은 https://github.com/Microsoft/TypeScript/pull/6885 륌 찞조하섞요.

ë„€ 감사합니닀

private 생성자는 또한 큎래슀륌 큎래슀에서 읞슀턎슀화할 수 없도록 만듀지 않습니까? Ʞ말고사 정답읎 아닙니닀.

Java 및/또는 C#은 final 큎래슀륌 사용하여 특수화되지 않을 것임을 알고 런타임에 큎래슀륌 최적화합니닀. 읎것읎 ë‚Žê°€ 죌장하는 최종 지원의 죌요 가치입니닀. TypeScript에는 final읎 없는 것볎닀 더 나은 윔드 싀행을 위핎 제공할 수 있는 것읎 없습니닀.
사용자에게 큎래슀의 올바륞 사용을 알늬Ʞ 위핎 죌석을 사용하고 최종 큎래슀륌 녞출하지 않고 대신 읞터페읎슀륌 녞출하는 것을 고렀하십시였.

나는 귞것에 동의하지 않고 대신 duanyao에 동의합니닀. Private은 ê·ž 묞제륌 핎결하지 못합니닀. 왜냐하멎 최종 큎래슀도 생성자륌 사용하여 읞슀턎슀화할 수 있Ʞ륌 원하Ʞ 때묞입니닀. 또한 사용자에게 녞출하지 않윌멎 추가 팩토늬륌 작성핎알 합니닀. 나에게 최종 지원의 죌요 가치는 사용자가 싀수하지 않도록 방지하는 것입니닀.
닀음곌 같읎 죌장합니닀. 핚수 서명에서 유형을 사용할 때 TypeScript는 낮 윔드륌 더 빠륎게 싀행하Ʞ 위핎 묎엇을 제공합니까? 사용자의 싀수륌 방지하Ʞ 위한 것읎Ʞ도 하지 않습니까? 사용자가 맀개변수로 전달핎알 하는 값의 유형을 섀명하는 죌석을 작성할 수 있습니닀. 최종 킀워드와 같은 확장읎 귞냥 밀렀난닀는 것은 유감입니닀. 제 생각에는 읎것읎 typescript의 원래 의도와 충돌하Ʞ 때묞입니닀. 최대한 많은 싀수륌 플하Ʞ 위핎 최대한 많은 검사륌 수행하는 컎파음 수쀀을 추가하여 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읎 없는 것볎닀 더 나은 윔드 싀행을 위핎 제공할 수 있는 것읎 없습니닀.

와, ì°¡í•Ž! 정적 유형은 윔드 싀행을 향상시킀지 않지만 안전은 좋은 것입니닀.

최종(뎉읞된)는 큎래슀 사용자 정의륌 좀 더 안전하게 만듀Ʞ 위핎 볎고 싶은 Ʞ능윌로 재정의와 핚께 바로 위에 있습니닀. 나는 성능에 신겜 쓰지 않는닀.

정적 유형은 윔드 싀행을 향상시킀지 않지만 안전은 좋은 것입니닀.

정확히. private 닀륞 사람읎 메서드륌 혞출하지 못하도록 하는 것처럌 final 는 닀륞 사람읎 메서드륌 재정의하지 못하도록 제한합니닀.

둘 ë‹€ 왞부 섞계와의 큎래슀 OO 읞터페읎슀의 음부입니닀.

@pauldraper 및 @mindarelus에 완전히 동의합니닀. 읎것을 구현하십시였. 읎것은 많은 의믞가 있을 것입니닀. 나는 현재 귞것을 정말로 귞늬워합니닀.

나는 final읎 성능에만 도움읎 된닀고 생각하지 않고 디자읞에도 도움읎 된닀고 생각하지만 TypeScript에서는 전혀 의믞가 없닀고 생각합니닀. Object.freeze 및 Object.seal 의 가변성 횚곌륌 추적하여 읎것읎 더 잘 핎결된닀고 생각합니닀.

@aluanhaddad 더 자섞히 섀명핎 죌시겠습니까? 읎것읎 "TypeScript에서 전혀 의믞가 없닀"ê³  생각하는 읎유는 묎엇입니까?
개첎륌 고정하거나 뎉읞한닀는 것은 개첎에 새 속성을 추가하는 것을 허용하지 않지만 파생된 개첎에 속성을 추가하는 것을 방지하지 않는닀는 것을 의믞하므로 Ʞ볞 큎래슀륌 뎉읞하더띌도 핎당 Ʞ볞 큎래슀륌 확장하는 자식 큎래슀의 메서드륌 계속 재정의할 수 있습니닀. . 또한 런타임에 Ʞ볞 큎래슀에 속성을 추가할 수 없습니닀.

Java의 큎래슀 또는 큎래슀 메서드에 final 륌 사용한닀는 아읎디얎는 제 생각에는 슀레드 안전을 위핎 개첎의 변겜 가능성을 최소화하는 것곌 더 ꎀ렚읎 있습니닀. (항목 15. Joshua Bloch, 횚곌적읞 자바)

JS의 몚든 것읎 변겜 가능하Ʞ 때묞에 읎러한 원칙읎 자바슀크늜튞로 넘얎가는지 몚륎겠습니닀(제가 틀렞닀멎 수정핎 죌섞요). 하지만 Typescript는 Javascript가 아닙니닀. ë„€?

나는 읎것읎 구현되는 것을 정말로 볎고 싶습니닀. 더 강력한 윔드륌 만드는 데 도움읎 될 것읎띌고 생각합니닀. 읎제... 귞것읎 JS로 얎떻게 번역되는지, 솔직히 아마도 귞럎 필요가 없을 것입니닀. 나뚞지 컎파음 시간 검사가 있는 펜슀의 typescript 쪜에 있을 수 있습니닀.

묌론 귞것 없읎는 ì‚Ž 수 있지만 귞것읎 typescript의 음부입니닀. 맞습니까? 우늬가 간곌한 싀수륌 닀시 확읞합니까?

나에게 final 는 private 또는 타읎핑, 슉 윔드 계앜곌 같은 typescript의 역할을 합니닀. 윔드 계앜읎 깚지지 않도록 하는 데 사용할 수 있습니닀. 너묎 좋아요.

@hk0i 또한 여Ʞ에 반향된 것곌 유사한 방식윌로 항목 17(2판)에 얞꞉되얎 있습니닀.

귞러나 음반 윘크늬튞 큎래슀는 얎떻습니까? 전통적윌로, 귞것듀은 하위 분류륌 위핎 최종적읎거나 섀계 및 묞서화되지 않았지만 읎러한 상황은 위험합니닀. 읎러한 큎래슀가 변겜될 때마닀 핎당 큎래슀륌 확장하는 큎띌읎얞튞 큎래슀가 쀑닚될 가능성읎 있습니닀. 읎것은 닚지 읎론적읞 묞제가 아닙니닀. 상속을 위핎 섀계 및 묞서화되지 않은 비최종 구첎 큎래슀의 낎부륌 수정한 후 서람큎래싱 ꎀ렚 버귞 볎고서륌 받는 것은 드묞 음읎 아닙니닀.

읎 묞제에 대한 최선의 핎결책은 안전하게 서람큎래싱되도록 섀계 및 묞서화되지 않은 큎래슀에서 서람큎래싱을 ꞈ지하는 것입니닀. 하위 분류륌 ꞈ지하는 두 가지 방법읎 있습니닀. 둘 쀑 더 쉬욎 것은 큎래슀륌 final로 선얞하는 것입니닀. 대안은 몚든 생성자륌 private 또는 package-private로 만듀고 생성자 대신 공용 정적 팩토늬륌 추가하는 것입니닀.

나는 추상 킀워드가 읎믞 졎재한닀는 점을 감안할 때 얞얎의 읞지적 복잡성을 슝가시킀지 않는닀고 죌장합니닀. 귞러나 나는 귞것의 구현/성능 영향에 대핮 말할 수 없윌며 ê·ž 각도에서 얞얎륌 볎혞하는 것을 절대적윌로 졎쀑합니닀. 읎러한 우렀륌 분늬하는 것읎 읎 Ʞ능을 구현할지 여부륌 결정하는 데 도움읎 될 것읎띌고 생각합니닀.

나는 final 가 수업을 뎉읞하는 훌륭한 추가가 될 것읎띌고 믿습니닀. 한 가지 사용 사례는 큎래슀에 많은 공용 메서드가 있지만 읞터페읎슀륌 통핎 ê·ž 쀑 음부만 녞출할 수 있닀는 것입니닀. 싀제 소비자는 읞터페읎슀륌 사용하여 액섞슀륌 제한하는 동안 읎러한 몚든 공용 메서드가 있윌므로 구현을 빠륎게 닚위 테슀튞할 수 있습니닀. 구현을 뎉읞할 수 있윌멎 누구도 구현을 확장하거나 공용 메서드륌 변겜하지 않도록 할 수 있습니닀.

당신은 또한 아묎도 당신의 큎래슀륌 상속받지 않도록 할 수 있습니닀. TypeScript는 읎러한 규칙을 적용핎알 하며 죌석에 대한 제안은 읎 사용 사례륌 핎결하Ʞ 위한 게윌륞 ì ‘ê·Œ 방식읞 것 같습니닀. ë‚Žê°€ 읜은 닀륞 답변은 특정 상황에만 적합하지만 위에서 섀명한 상황에는 적합하지 않은 private 사용에 ꎀ한 것입니닀.

읎 슀레드의 많은 사람듀곌 마찬가지로 저는 수업을 뎉읞할 수 있도록 투표할 것입니닀.

@mhegazy Private 생성자와 뎉읞/최종 큎래슀는 의믞 첎계가 맀우 닀늅니닀. 묌론 개읞 생성자륌 정의하여 확장을 방지할 수 있지만 큎래슀 왞부에서 생성자륌 혞출할 수도 없습니닀. 슉, 읞슀턎슀륌 생성할 수 있도록 정적 핚수륌 정의핎알 합니닀.

개읞적윌로 나는 뎉읞/최종윌로 표시된 큎래슀와 메서드가 확장되거나 재정의될 수 없도록 뎉읞/최종 컎파음러 검사륌 권장합니닀.

낮 묞제의 맥띜에서 객첎륌 읞슀턎슀화할 수 있도록 공용 생성자륌 가질 수 있Ʞ륌 원하지만 큎래슀의 확장을 방지하고 sealing/final의 추가만 허용합니닀.

작업읎 있습니닀 - 윔드륌 작성하십시였

  • 변겜할 수 없는 개첎륌 작동
  • 상속읎 자유롭닀
  • 반사 방법 묎료

귞늬고 여Ʞ에 final 킀워드가 필요합니닀, IMHO.

final 는 볎혞핎알 하는 메서드와 재정의핎서는 안 되는 메서드륌 자신곌 사용자에게 상Ʞ시킀는 좋은 방법읎띌고 생각합니닀. ì°žê³ ë¡œ 저는 또한 독자가 부분적윌로 알 수 있도록 하지만 메서드 읎늄을 입력하멎 튞랜슀파음러가 불평할 수 있도록 재정의하고 있음을 명시적윌로 얞꞉하는 것을 지지합니닀.

@zigszigsdk 메서드는 재정의되지 않윌므로 얎떻게 작동합니까?

final :
this 컚텍슀튞에서 final로 선얞된 super의 메소드륌 숚Ʞ멎 튞랜슀파음러가 불평한닀는 점을 제왞하멎 지ꞈ 작동하는 것곌 같은 방식입니닀.

override :
지ꞈ곌 같은 방식윌로 작동하지만, 튞랜슀파음러가 override 메소드륌 선얞하고 수퍌에 핎당 읎늄의 메소드가 없거나 메소드가 있지만 final 선얞된 겜우 튞랜슀파음러가 불평한닀는 점을 제왞하고는
this 컚텍슀튞에서 super의 메소드륌 숚Ʞ고 재정의륌 명시하지 않윌멎 겜고가 될 수도 있습니닀.

Java 및/또는 C#은 최종 큎래슀륌 사용하여 특수화되지 않을 것임을 알고 런타임에 큎래슀륌 최적화합니닀. 읎것읎 ë‚Žê°€ 죌장하는 최종 지원의 죌요 가치입니닀.

@mhegazy 별로! 또 닀륞 쀑요한 Ʞ능은 재정의될 것윌로 예상되는 큎래슀 부분을 명시하는 것입니닀.

예륌 듀얎 "Effective Java"의 항목 17을 찞조하십시였. "상속을 위한 섀계 및 묞서화 또는 ꞈ지":

상속을 위핎 섀계 및 묞서화되지 않은 비최종 구첎 큎래슀의 낎부륌 수정한 후 서람큎래싱 ꎀ렚 버귞 볎고서륌 받는 것은 드묞 음읎 아닙니닀. 읎 묞제에 대한 최선의 핎결책은 안전하게 서람큎래싱되도록 섀계 및 묞서화되지 않은 큎래슀에서 서람큎래싱을 ꞈ지하는 것입니닀. 하위 분류륌 ꞈ지하는 두 가지 방법읎 있습니닀. 둘 쀑 더 쉬욎 것은 큎래슀륌 final 로

제 생각에는 최종 방법도 마찬가지입니닀. 읎 큎래슀가 공개 방법을 재정 지원하도록 섀계되얎 맀우 드묌닀. 재정의되지 않은 동작곌 재정의하는 동작의 조합윌로 읞핎 발생할 수 있는 몚든 가능한 상태 조합을 생각핎알 하므로 맀우 복잡한 디자읞곌 엄청난 양의 테슀튞가 필요합니닀. 따띌서 프로귞래뚞는 하나 또는 두 개륌 제왞한 몚든 공용 메서드륌 final로 ì„ ì–ží•  수 있윌므로 읎러한 조합의 수가 크게 쀄얎듭니닀. 귞늬고 귞렇지 않은 겜우가 더 많습니닀. 하나 또는 두 개의 재정의 가능한 메서드가 정확히 필요한 것입니닀.

final 큎래슀와 메소드가 맀우 쀑요하닀고 생각합니닀. 시행하시Ꞟ 바랍니닀.

또 닀륞 맀력적읞 사용자 사례 @mhegazy . 였늘 나는 Template Method Pattern 을 배웠고, wikipedia 의 final 가 필요하닀는 것을 발견했습니닀. 하지만 낮 멋진 TypeScript에서는 읎것을 할 수 없습니닀. 유감입니닀!

템플늿 팚턎을 사용하멎 하위 큎래슀에서 알고늬슘의 구조륌 변겜하지 않고도 알고늬슘의 특정 닚계륌 재정의할 수 있습니닀.

나에게 귞것은 상속읎 아닌 겜우에 구성을 시행하는 것만큌 간닚합니닀. final 없읎는 할 수 없습니닀.

final 가 typescript에 였는 것을 볎고 싶은 만큌 Microsoft가 우늬에게 볎낎렀고 하는 Ʞ볞 메시지는 우늬가 final 원한닀멎 닀음곌 같은 얞얎륌 사용핎알 한닀는 것입니닀. 지원합니닀.

읎 묞제가 닀시 엎늬고 구현되는 것을 볎고 싶습니닀.

낎부적윌로 사용하거나 공개적윌로 공유할 띌읎람러늬륌 구축할 때(예: npm에서) 띌읎람러늬륌 사용하는 사람듀읎 윔드륌 탐색하고 죌석읎나 묞서륌 검색하여 큎래슀가 할 수 있는지/할 수 있는지 확읞하는 것을 원하지 않습니닀. 덮얎쓰지 않습니닀. 덮얎쓰멎 였류가 발생합니닀.

낮 윔드에는 확장되는 큎래슀가 있윌며 음종의 읎벀튞가 발생하멎 메서드가 튞늬거됩니닀. 하위 큎래슀가 메서드륌 정의하멎 귞렇지 않윌멎 Ʞ볞 큎래슀로 폎백됩니닀. 귞러나 큎래슀에 "대첎" 메서드가 아닌 닀륞 메서드도 있습니닀. DOM에 항목을 추가하는 것곌 같은 도우믞 메서드에 가깝습니닀. 읎 겜우 읎러한 메서드륌 덮얎쓰는 것을 원하지 않습니닀.

읎 죌제에 대한 나의 5섌튞는 읎것읎 닀시 엎늬고 구현되얎알 한닀는 것입니닀.

나는 귞것을 사용하여 띌읎람러늬의 큎띌읎얞튞가 읎믞 졎재하는 닀륞 큎래슀에서 확장되지 않고 고유한 구첎적읞 큎래슀륌 만듀도록 강제할 것입니닀. @lucasyvas가 말했듯읎 구성을 선혞하십시였. 또는 예륌 듀얎 각도에서 종속성 죌입을 제공하Ʞ 위핎 새로욎 구첎적읞 큎래슀 구현을 시행하십시였.

나는 또한 수업곌 방법을 몚두 지원하여 재개방에 투표합니닀.

나는 우늬가 최종 킀워드의 팚턎읎 typescript의 맥띜에서 얎떻게 작동할지 확신읎 서지 ì•Šì•„ì•Œ 한닀고 말하지 않습니닀.

최종 킀워드는 사용자/프로귞래뚞가 핎당 큎래슀/메서드에서 재정의/상속하는 것을 쀑지하지 않습니까?

Final을 볎는 나의 방식은 더 읎상 변겜할 수 없음을 의믞하는 데읎터륌 "고정"한닀는 것입니닀. 낮 말은 읎것읎 "버귞"륌 수정하거나 음부 동작을 변겜하렀는 사람듀에게 정말 번거로욞 수 있지만 사용하는 것읎 좋습니닀.

@niokasgami Freeze는 [data](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/freeze)와 ꎀ렚읎 있습니닀.
읎믞 ES6의 음부로 사용 가능합니닀. Final은 큎래슀와 메서드에 적용됩니닀(변수는 읜Ʞ 전용음 수 있윌므로 슈퍌 변수륌 재정의할 수 없윌므로 "최종"윌로 작동합니닀).

"Final" 킀워드는 JAVA 에서 사용되며, C# 에서는 sealing읎 되얎 있습니닀.

typescript는 C#에서 강하게 영감을 받았Ʞ 때묞에 "뎉읞된" 것읎 선택될 가능성읎 더 높아알 합니닀. 읎제 Ʞ볞적윌로 런타임에 개첎륌 뎉읞 하는

@Xample Java의 로컬 변수에 final을 사용할 수도 있닀고 생각합니닀. 안드로읎드 앱을 작성할 때 읎 작업을 수행핎알 했던 Ʞ억읎 납니닀. 읎벀튞와 핚께 í•Žì•Œ 한닀고 생각하지만 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#에서 Sealed에 대한 귀하의 요점읎 동음하게 작동하지 않습니닀. 솔직히 제 생각에는 킀워드 seal곌 final 몚두 혌동될 수 있Ʞ 때묞에 범죌에 듀얎갈 수 없었습니닀. Java에서 상수로 사용되Ʞ 때묞에 적용하는 방법 :/

Java에서는 몚든 변수, 메서드 또는 큎래슀륌 final 할 수 있습니닀. 변수의 겜우 찞조륌 재할당할 수 없음을 의믞합니닀(ì°žì¡°ê°€ 아닌 유형의 겜우 값도 변겜할 수 없음을 의믞합니닀). 큎래슀의 겜우 확장읎 없음을 의믞합니닀( extends ... 킀워드). 메서드의 겜우 하위 큎래슀에서 재정의가 없음을 의믞합니닀.

Java에서 final 륌 사용하는 죌요 읎유:

  • 변수의 불변성 감소: 슀레드 안전을 위핎
  • 큎래슀륌 상속할 수 없도록 마묎늬: 하위 큎래슀가 싀수로 슈퍌 메서드륌 혞출하Ʞ 시작할 때 상속읎 볞질적윌로 복잡하Ʞ 때묞에 상속볎닀 합성을 강제합니닀.
  • ê°„ë‹ší•œ 프로귞래밍 였류 방지: 값을 변겜할 의도가 없닀멎 더 읎상 가능하지 않습니닀.
  • 대부분의 사람듀읎 상수륌 상상할 때 생각하는 것에 사용: public static final String KEY = "someStringKeyPathHere" 에서와 같읎 얎디에서나 볌 수 있는 재사용 가능한 값은 싀수륌 쀄읎는 데 유용하지만 동음한 값에 대핮 여러 묞자엎 개첎륌 닀시 만듀지 않는닀는 추가 컎파음 시간 읎점읎 있습니닀.

몇 가지 사용 사례륌 생략했을 수 있지만 맀우 음반적윌로 유지하고 몇 가지 예륌 제공하렀고 했습니닀.

@TheColorRed Android는 윜백(익명 큎래슀) 왞부에서 변수륌 ì„ ì–ží•œ 닀음 낎부에서 ì°žì¡°í•  때 필요합니닀. 나는 읎것읎 슀레드 안전 묞제와 닀시 음치한닀고 생각합니닀. 나는 귞듀읎 당신읎 닀륞 슀레드에서 변수륌 재할당하는 것을 막윌렀 한닀고 생각합니닀.

유용핚에도 불구하고 읎 Ʞ능읎 곧 제공될 것읎띌고 생각하지 않습니닀. 닀륞 솔룚션을 삎펎볎거나 낮 겜우와 같읎 typescript륌 몚두 삭제하고 JS의 엉성핚을 처늬하는 것읎 좋습니닀. Javascript에는 읎러한 유형의 힌튞가 없거나 궁극적윌로 윔드가 JS로 변환되지 않아 많은 "읎점"읎 있습니닀. 람띌우저 혞환성을 원하멎 ES6을 작성하고 Babel을 사용하여 변환할 수 있습니닀.

읎러한 읎점 쀑 음부륌 위핎 손목을 때멮 수는 있지만 js로 변환된 후에는 java-esque final 의 싀제 읎점을 전혀 얻지 못한닀고 현싀적윌로 생각합니닀.

@hk0i 나는 당신의 요점을 읎핎할 수 있닀고 생각하지만 전반적윌로 당신의 의견에 대핮 동의하고 동시에 앜간 동의하지 않습니닀.

typescript에 있는 대부분의 윔드는 프로귞래뚞가 잘 할 수 있도록 디버깅/추적 목적윌로 말하고 싶습니닀. "clean" 윔드륌 수행하는 것 같습니닀.

대부분의 typescript Ʞ능은 JS에 졎재하지 ì•Šêž° 때묞에 JS로 변환할 때 대부분의 겜우 변환되지 않습니닀.

윔드륌 런타임/작성할 때 윔드의 였류륌 확읞하고 JS볎닀 더 쉜게 추적하는 데 도움읎 되지만(HECK JS는 버귞륌 추적하Ʞ 얎렀욞 수 있음 ㅋㅋ)

귞래서 final 킀워드의 사용은 API 사용자가 알 수 있는 ì°šë‹šêž°ë¡œ 볎음 수 있닀고 생각합니닀.

Typescript가 좋은 얞얎띌는 것은 사람듀읎 큎래슀 생성자륌 혞출하는 것을 막지만 여전히 액섞슀할 수 있는 "진정한" 정적 큎래슀 킀워드와 같은 몇 가지 쀑요한 Ʞ능읎 부족하닀는 사싀을 알게 되얎 안타깝습니닀.

@hk0i 저도 동의하지 않습니닀. typescript의 목적은 윔드륌 구조화하여 읎륌 위한 도구륌 제공하는 것입니닀. 우늬는 Java에서 final을 사용할 필요가 없습니닀. 음반적윌로 큎래슀나 메서드륌 확장하멎 부작용읎 발생할 수 있닀는 것을 알 때 사용합니닀(또는 닀륞 안전상의 읎유로).

런타임 가변성 검사(Object.seal 또는 Object.freeze 사용)륌 추가하는 현재 ES6 솔룚션에 의졎하멎 윔드륌 입력할 때 직접 였류가 발생하는 읎점을 잃게 됩니닀( 읎 데윔레읎터륌 사용하여 쉜게 수행할 수 있음에도 불구하고).

@TheColorRed 예  귞늬고 typescript에서 우늬는 지역 변수와 큎래슀 변수륌 구별합니닀.

  • readonly 큎래슀 변수
  • const : 닀륞 변수의 겜우

ê·žë“€ 쀑 얎느 것도 방법읎나 큎래슀에 대핮 정확하지 않을 것입니닀. 메서드륌 재정의한닀고 í•Žì„œ 메서드륌 재정의한닀는 의믞는 아닙니닀(C++의 가상 메서드에서 생각). 메서드가 상위 메서드볎닀 뚌저 혞출되도록 정의하Ʞ만 하멎 됩니닀( super 사용하여 혞출할 수 있음).

@niokasgami 아마도 명명은 싀제로 묞제가 되지 않을 것입니닀. 우늬는 Object.seal읎 객첎에 적용된닀는 것을 여전히 읎핎할 것입니닀. 큎래슀와 메서드륌 구조 자첎에 뎉읞하는 동안.

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 가 좋은 킀워드띌고 결정했을 것입니닀.

우선

  • 확장 큎래슀에서 현재 메서드륌 재정의하는 것을 방지합니닀. 닀시 말하지만, 정의(큎래슀 낎의 메서드)에 대핮 읎알Ʞ할 때 아직 아묎 것도 덮얎쓰지 않습니닀. 따띌서 생성 방지, 읜Ʞ 허용, 업데읎튞 허용(메소드에도 적용 가능한 겜우 readonly륌 사용하여 메서드 업데읎튞 또는 삭제륌 방지할 수 있음). 최고의 넀읎밍? preventOverrides ? 또는 C#에서 사용되는 것처럌 닀시 seal

볎너슀: 메소드륌 뎉읞하는 것은 음반적윌로 사람듀읎 필수 수퍌 윔드륌 묎시하는 것을 방지하Ʞ 위한 것읎므로 사람듀읎 수퍌 메소드 (생성자와 동음한 동작읎지만 몚든 메소드에 대핮)

였핎하지 마섞요, 저는 읎에 반대하지 않습니닀. 나는 귞것에 대핮 맀우 좋아합니닀. 나는 닚지 귞것읎 Ʞ능읎 되얎서는 안 된닀는 마읎크로소프튞의 역섀적 사고방식을 읎핎하렀고 녞력하고 있습니닀. 볞질적윌로 읎것은 JavaScript Ʞ능읎 아니Ʞ 때묞에 TypeScript Ʞ능읎 될 수 없닀는 것입니닀.

... ë‚Žê°€ 올바륎게 읎핎하고 있닀멎.

@hk0i Generics, readonly, Ʞ타 많은 Ʞ능듀은 JavaScript Ʞ능읎 아니지만 여전히 TypeScript에 추가되얎 있Ʞ 때묞에 ê·ž 읎유는 아니띌고 생각합니닀...

TypeScript는 간닚하지 않은 방식윌로 윔드륌 생성핎알 하는 Ʞ능만 플합니닀. 제넀늭, 읜Ʞ 전용 등은 생성된 출력을 생성하Ʞ 위핎 간닚히 지욞 수 있는 순전히 컎파음 타임 개념읎므로 공정한 게임입니닀.

final 는 컎파음 시간에도 "지욞 수" 있는데 왜 "공정한 게임"읎 되지 않습니까?

🀷‍♂

@ColorRed 나는 읎것읎 통합핎알 할 닀륞 우선 순위가 있닀고 생각합니닀.
또는 읎 새 킀워드가 컎파음/윔딩 시간에 얌마나 예잡 가능한지 확신할 수 없습니닀. 생각핎볎멎 최종 킀워드의 디자읞은 맀우 몚혞할 수 있습니닀. final은 많은 목적을 위핎 많읎 사용될 수 있습니닀. Jsdoc 묞서에서 볌 수 있듯읎 jsdoc 읞터프늬터에 읎 변수가 고정되얎 읜Ʞ 전용임을 알렀죌는 "@final" 태귞륌 사용할 수 있습니닀.

여Ʞ에 디자읞 충돌읎 있습니닀. 읜Ʞ 전용은 변수륌 "고정"하고 읜Ʞ 전용윌로 만듀고 최종적윌로 최종적윌로 읜Ʞ 전용윌로 만드는 것을 Ʞ억하멎 변수 및 게터에 적용할 수 있습니닀.

읎것은 변수에 최종 태귞륌 지정핎알 하는지 읜Ʞ 전용윌로 태귞륌 지정핎알 하는지 확싀하지 않은 프로귞래뚞에게 혌란을 음윌킬 수 있습니닀.

읎 킀워드륌 큎래슀 및 메서드 ì„ ì–ž 전용윌로 예앜하지 않는 한, behavior 또는 final읎 읜Ʞ 전용곌 충돌할 것읎띌고 생각합니닀.

뎉읞(object.seal곌 충돌할 수 있음) 또는 최종(읎 목적 섀계가 읜Ʞ 전용 킀워드와 충돌핚) 대신에 읎늄을 지정하고 섀계하는 볎닀 "직접적읞" 방법을 사용할 수 있닀고 생각합니닀.

읎것은 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{}

}`

펞집 : Variable을 포핚하지 않았고 readonly가 읎믞 졎재하Ʞ 때묞에 가젞옵니닀.

@mhegazy 읎 묞제륌 닀시 final ), C#( sealed , readonly ), PHP와 같읎 final 킀워드륌 추가하는 쪜에 압도적윌로 많은 것 같습니닀 final ( final ), Scala ( final , sealed ) 및 C++ ( final , virtual )가 있습니닀. 읎 Ʞ능읎 없는 정적윌로 유형읎 지정된 OOP 얞얎는 생각할 수 없윌며 TS가 필요하지 않은 읎유에 대한 섀득력 있는 죌장도 듣지 못했습니닀.

@bcherny @mhegazy 위의 낎용에 전적윌로 동의합니닀. final 가 TypeScript에서 볌 수 있는 대부분의 구묞 섀탕곌 같읎 또 닀륞 컎파음 시간 제앜읎 될 수 없는 읎유륌 알 수 없습니닀. 정적 타읎핑, 제넀늭, 액섞슀 수정자, 유형 별칭 , 읞터페읎슀 ... 몚든 섀탕! TypeScript 팀은 아마도 닀륞 방향윌로 얞얎륌 사용하는 데 집쀑하고 싶얎 할 것입니닀. 하지만 진지하게 읎것은 OOP 101입니닀... 읎것은 TypeScript가 아직 아죌 얎렞을 때 ꜀ 였래전에 했얎알 했습니닀!

@mhegazy 읎 묞제에 대핮 귀하가 작성한 쎈Ʞ 댓Ꞁ을 닀시 ì°žì¡°í•  수 있습니까?

private 생성자가 있는 큎래슀는 확장할 수 없습니닀. 대신 읎것을 사용하는 것을 고렀하십시였.

읎 댓Ꞁ은 21번의 반대 투표륌 받았습니닀.
분명히 읎것은 컀뮀니티가 솔룚션윌로 원하는 것읎

와우, 읎것에 대핮 많은 플드백을 받았습니닀. 구현에 ꎀ심읎 없는 읎유륌 읎핎할 수 없습니닀.

여Ʞ에서 정말 비생산적읞 불평읎 많읎 음얎나고 있습니닀. 불만을 표출하지 마십시였. 여Ʞ에서 우늬가 결정을 낮멮 수 있고 컀뮀니티에서 플드백을 제공할 수 있습니닀. 하지만 귞냥 아묎렇게나 읎륌 갈Ʞ만 하멎 닀륞 사람의 마음읎 바뀌지 않습니닀. 구첎적읎고 싀행 가능핎알 합니닀. 지ꞈ 읎 Ʞ능을 사용하섞요 띌고 말하Ʞ 위핎 나타나는 사람듀에 의핎 우늬는 확신하지 못할 것입니닀.

읎 묞제는 final/sealed 큎래슀에 ꎀ한 것 입니닀. 완전히 닀륞 개념읞 최종/뎉읞된 방법에 대한 죌제에서 ë²—ì–Žë‚œ 토론읎 있었습니닀.

지난 번 검토할 때 몇 가지 점을 고렀했습니닀.

  • 큎래슀는 TYPESCRIPT Ʞ능읎 아니띌 JAVASCRIPT Ʞ능 입니닀. final 없윌멎 수업읎 완전히 묎용지묌읎띌고 생각되멎 TC39 위원회와 상의하거나 es-discuss에 제출핎알 합니닀. final 가 필수 Ʞ능읎띌고 TC39에게 확신을 쀄 수 있는 사람읎 없닀멎 TypeScript에 추가하는 것을 고렀할 수 있습니닀.
  • 묎얞가에서 new 륌 혞출하는 것읎 합법적읞 겜우 핎당 항목에서 상속하는 것곌 음대음 런타임 대응읎 있습니닀. new 'd가 될 수 있지만 super 'd가 아닌 묎얞가의 개념은 JavaScript에 졎재하지 않습니닀.
  • TypeScript가 OOP 킀워드 수프가 되는 것을 플하Ʞ 위핎 최선을 닀하고 있습니닀. JavaScript에는 상속볎닀 더 나은 구성 메컀니슘읎 많읎 있윌며 C# 및 Java에 있는 몚든 닚음 킀워드륌 가질 필요 는 없습니닀.
  • "should-be-final" 큎래슀에서 상속을 감지하Ʞ 위핎 런타임 검사륌 간닚하게 작성할 수 있습니닀. 몚든 소비자가 TypeScript륌 사용하는 것은 아니Ʞ 때묞에 누군가 싀수로 큎래슀에서 상속하는 것에 대핮 "걱정"하는 겜우 싀제로 수행핎알 합니닀. .
  • 특정 큎래슀가 상속되지 않는 슀타음 규칙을 적용하는 며튾 규칙을 작성할 수 있습니닀.
  • 누군가가 "싀수로" 뎉읞되얎알 하는 큎래슀에서 상속받는 시나늬였는 음종의 읎상한 시나늬였입니닀. 나는 또한 죌얎진 큎래슀에서 상속받는 것읎 "가능"한지 여부에 대한 누군가의 개별적읞 평가가 아마도 닀소 의심슀럜닀고 죌장하고 싶습니닀.
  • Ʞ볞적윌로 큎래슀륌 뎉읞하는 ì„ž 가지 읎유는 볎안, 성능 및 의도입니닀. ê·ž 쀑 두 가지는 TypeScript에서 의믞가 없윌므로 닀륞 런타임에서 수행하는 작업의 1/3만 수행하는 복잡성 대 읎득을 고렀핎알 합니닀.

읎 몚든 것에 동의하지 않윌셔도 되지만 final 의 부족읎 JavaScript 큎래슀륌 횚곌적윌로 사용하는 능력에 얎떻게 핎륌 끌치는지에 대한 싀행 가능하고 구첎적읞 플드백을 가젞였십시였.

TS가 필요하지 않은 읎유에 대한 섀득력 있는 죌장을 듣지 못했습니닀.

읎것읎 작동하는 방식읎 아님을 상Ʞ하십시였. 몚든 Ʞ능은 -100 에서 시작 합니닀. 핎당 게시묌에서

읎러한 질묞 쀑 음부에서 질묞은 특정 Ʞ능을 "제거"하거나 "제왞"한 읎유륌 묻습니닀. 읎 묞구는 êž°ì¡Ž ì–žì–Ž(C++ 및 Java가 여Ʞ에서 읞Ʞ 있는 선택임)로 시작한 닀음 원하는 지점에 도달할 때까지 Ʞ능을 제거하Ʞ 시작했음을 의믞합니닀. 귞늬고 음부 사람듀에게는 믿Ʞ 얎렀욞 수 있지만 얞얎는 귞렇게 섀계되지 않았습니닀.

우늬는 유한한 복잡성 예산을 가지고 있습니닀. 우늬가 하는 몚든 음은 닀음에 하는 몚든 음을 0.1% 느늬게 만듭니닀. Ʞ능을 요청하멎 닀륞 몚든 Ʞ능읎 조ꞈ 더 얎렀워지고, 조ꞈ 느렀지고, 가능성읎 조ꞈ 낮아질 것을 요청하는 것입니닀. Java가 있Ʞ 때묞에 또는 있Ʞ 때묞에 또는 되고 명령쀄 슀위치륌 추가할 수 있Ʞ 때묞에 여Ʞ에는 아묎 것도 듀얎가지 않습니닀 . Ʞ능은 자신곌 믞래에 대한 전첎 부닎에 대한 비용을 지불핎알 합니닀.

@RyanCavanaugh 결정에 동의하는지 확신할 수 없지만, 정말 사렀 깊고 상섞한 답변곌 시간을 ë‚Žì–Ž 작성핎 죌셔서 감사합니닀. 나는 당신읎 얞얎륌 간결하게 유지하Ʞ륌 원한닀는 것을 알았습니닀. 닀륞 읞Ʞ 있는 ì–žì–Žê°€ 가지고 있는 Ʞ능읎 정말로 가치가 있는지, 아니멎 귞냥 음반적읞지 생각핎 볎는 것읎 좋습니닀.

@RyanCavanaugh

읎 포럌의 요점은 .. "JavaScript 큎래슀륌 횚곌적윌로 사용하십시였."띌고 생각하지 않습니닀.

죄송합니닀. 저는 저항할 수 없윌며 "여Ʞ서 계속되고 있는 비생산적읞 불평"에 추가합니닀. 마지막 킀워드는 섀명된 몚든 읎유에 대핮, 상섞하게, 귞늬고 닀륞 사람듀의 죌장곌 핚께 유용합니닀.

TypeScript가 OOP 킀워드 수프가 되는 것을 플하Ʞ 위핎 최선을 닀하고 있습니닀. JavaScript에는 상속볎닀 더 나은 구성 메컀니슘읎 많읎 있습니닀...

final 륌 사용하여 상속에 대한 구성을 적용할 때와 같읎 (여Ʞ에 typescript ì–žì–Ž 읎늄읎 아닌 삜입) 😈
(믞안, 저항할 수 없었얎)

귞러나 더 쀑요한 것은 TS가 음부 추가 유형 검사륌 추가한닀는 점을 제왞하고는 "였늘날의 JavaScript 지ꞈ" 또는 ê·ž 횚곌(예: Babel)륌 도입하Ʞ 위한 혞환성 계잵읎 대부분읞 것 같습니닀.

읎것을 구현하Ʞ 위한 반대 녌거의 요지는 닀륞 얞얎의 Ʞ능을 원하멎 대신 닀륞 얞얎륌 사용하띌는 것입니닀. JavaScript륌 원하시멎 JavaScript륌 사용하십시였. TypeScript륌 원하멎 귞것을 사용하십시였.

Kotlin읎 JS로 컎파음할 수 있고 여Ʞ 사람듀읎 슐Ꞟ 수 있는 많은 Ʞ능읎 있닀는 것을 알고 있윌므로 삎펎볎는 데 유용할 수 있습니닀. 나는 귞것읎 의졎성윌로 음부 JS 띌읎람러늬륌 추가한닀고 생각합니닀 (직접 시도하지는 않았습니닀).

TypeScript가 마음에 듀지 않윌멎 사용하지 마십시였.

@RyanCavanaugh

위에 올렀죌신 포읞튞에..

큎래슀는 TYPESCRIPT Ʞ능읎 아니띌 JAVASCRIPT Ʞ능 입니닀. 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 륌 혞출하는 것읎 합법적읞 겜우 핎당 항목에서 상속하는 것곌 음대음 런타임 대응읎 있습니닀. new 'd가 될 수 있지만 super 'd가 아닌 것의 개념은 JavaScript에 졎재하지 않습니닀.

닀시 말하지만, 컀뮀니티에서 런타임에 final 륌 적용하Ʞ 위핎 여Ʞ에서 뭔가 마법을 부늬Ʞ륌 Ʞ대하고 있닀고 생각하지 않습니닀. 정확하게 얞꞉했듯읎 "JavaScript에는 졎재하지 않습니닀". 귞러나 얞꞉한 대로 컎파음 시간 제앜윌로 충분합니닀.

TypeScript가 OOP 킀워드 수프가 되는 것을 플하Ʞ 위핎 최선을 닀하고 있습니닀. JavaScript에는 상속볎닀 더 나은 구성 메컀니슘읎 많읎 있윌며 C# 및 Java에 있는 몚든 닚음 킀워드륌 가질 필요 는 없습니닀.

소프튞웚얎 개발 컀뮀니티 전첎에서 "상속볎닀 구성을 선혞"하는 상당히 잘 알렀진 묞구입니닀. 귞러나 "혞의"가 상속 을 포ꎄ적읞 섀명윌로 는 아닙니닀 . 묌론, C#곌 Java에 있는 몚든 닚음 킀워드가 _필요하지 않습니닀_. 하지만 abstract 큎래슀("JavaScript에는 졎재하지 않음")륌 허용핎알 하는 읎유가 있얎알 합니닀. final 수업?

"should-be-final" 큎래슀에서 상속을 감지하Ʞ 위핎 런타임 검사륌 간닚하게 작성할 수 있습니닀. 몚든 소비자가 TypeScript륌 사용하는 것은 아니Ʞ 때묞에 누군가 싀수로 큎래슀에서 상속하는 것에 대핮 "걱정"하는 겜우 싀제로 수행핎알 합니닀. .

C# 및 Java에 대핎서도 마찬가지지만 컎파음러 수쀀에서 수행할 수 있는 sealed 및 final 읎 있윌므로 런타임 검사가 필요하지 않습니닀.

낮 몚든 소비자가 TypeScript륌 사용하지 않았닀멎 final 큎래슀에서 상속하는 것볎닀 더 많은 걱정거늬가 생게을 것입니닀. 예륌 듀얎 private 또는 protected 멀버에 대한 액섞슀, 정적 유형 검사 없음 또는 abstract 큎래슀 생성 Ʞ능.

TypeScript가 아닌 소비자가 가능한 한 안전한지 확읞하Ʞ 위핎 윔드에 읎러한 몚든 항목(음부는 추가할 수조찚 없음)에 대한 런타임 검사로 가득 ì°š 있얎알 합니까?

특정 큎래슀가 상속되지 않는 슀타음 규칙을 적용하는 며튾 규칙을 작성할 수 있습니닀.

읎것은 윔드륌 사용하는 사람읎 늰터륌 싀행하고 있닀는 것을 의믞하므로 여전히 적절한 솔룚션읎 아닙니닀. í•Žê²° 방법입니닀.

누군가가 "싀수로" 뎉읞되얎알 하는 큎래슀에서 상속받는 시나늬였는 음종의 읎상한 시나늬였입니닀. 나는 또한 죌얎진 큎래슀에서 상속받는 것읎 "가능"한지 여부에 대한 누군가의 개별적읞 평가가 아마도 닀소 의심슀럜닀고 죌장하고 싶습니닀.

좋은/훌륭한 개발자는 큎래슀 확장곌 같은 작업을 수행하는 귌거에 대핮 생각합니닀. 귞볎닀 적윌멎 읎유륌 제대로 읎핎하지 못한 채 "하지만 횚곌가 있닀"는 사고방식을 갖게 됩니닀.

can I로 시작하는 질묞을 하는 것은 음반적윌로 should I로 시작하는 질묞볎닀 더 명확한 대답을 하는 겜향읎 있습니닀.

Ʞ볞적윌로 큎래슀륌 뎉읞하는 ì„ž 가지 읎유는 볎안, 성능 및 의도입니닀. ê·ž 쀑 두 가지는 TypeScript에서 의믞가 없윌므로 닀륞 런타임에서 수행하는 작업의 1/3만 수행하는 복잡성 대 읎득을 고렀핎알 합니닀.

틀늌없읎 나는 TypeScript가 볎안곌 의도 쀑 두 가지 읎유륌 싀제로 충족할 것읎띌고 말하고 싶습니닀. 귞러나 읎것읎 순전히 컎파음 시간 검사로 구현된 겜우 올바륎게 지적하는 것읎 아니띌 컎파음러 수쀀 에서만 읎 작업을 수행할 수 있습니닀. , 런타임 수쀀에서.

final 가 없닀고 í•Žì„œ JavaScript 큎래슀륌 횚곌적윌로 사용하는 능력에 핎륌 끌치거나 JavaScript 큎래슀 없읎는 사용할 수 없닀고 생각하지 않습니닀. 나는 final 가 "필요한" Ʞ능읎띌Ʞ볎닀는 "있윌멎 좋은" Ʞ능에 가깝닀고 생각하지만 TypeScript의 많은 Ʞ능에 대핎서도 마찬가지입니닀.

여Ʞ서 죌된 불만은 TypeScript륌 사용하여 abstract 및 _open_ 큎래슀륌 만듀 수 있지만 상속 및 닀형성 잡멎에서 우아하고 표현적읞 방식윌로 완전한 귞늌을 귞늎 수 없닀는 것입니닀.

생성자륌 숚Ʞ는 것은 큎래슀 구현에서 의믞론적읎고 표현적읞 가치륌 빌앗Ʞ 때묞에 컀뮀니티가 원하는 것읎 아닙니닀. 귞늬고 닀시 한 번, 액섞슀 수정자는 "있윌멎 좋은" 것읎Ʞ 때묞에 런타임에 적용할 수도 없습니닀. 볞질적윌로 "JavaScript에 졎재하지 않는" 상황입니닀.

개발자로서 나는 많은 몚자륌 가지고 있습니닀. 현재 저는 C# 몚자, Kotlin 몚자 및 TypeScript 몚자가 있습니닀.

  • Kotlin 몚자륌 쓰고 있윌멎 Ʞ볞적윌로 큎래슀가 final읎Ʞ 때묞에 final 에 대핮 걱정할 필요가 없습니닀.
  • C# 몚자륌 쓰고 습ꎀ적윌로 sealed 륌 적용하여 소비자 가 I 륌 묻는 대신 can I 을 묻도록 합니닀 . 종종 C# 큎래슀는 싀제로 sealed 읎얎알 하며 종종 간곌됩니닀.
  • 낮 TypeScript 몚자륌 ì“Ž 상태에서 í•Žê²° 방법윌로 생성자륌 숚겚알 합니닀. 낮(및 컀뮀니티) 의견윌로는 얞얎에 유용한 것읎 부족하Ʞ 때묞입니닀.

흥믞롭게도 TypeScript 팀읎 테읎랔에 둘러앉아 abstract 수업에 대핮 토론할 때 누군가 손을 듀고 "하지만 final 얎떻습니까?"띌고 말했습니닀.

@RyanCavanaugh 흠 당신의 요점을 읎핎합니닀

대부분 였핎였던 것 같아요(섀명한 낎용윌로 추잡)

@series0ne 요앜은 우늬의 의도가 JS에서 최종 큎래슀륌 생성하도록 요청핚윌로썚 타읎프슀크늜튞 출력을 너묎 복잡하게 만듀지 않고(읎것읎 귞렇게 하렀멎 êž°ì°š 사고가 될 것입니닀) 닚지 사람듀에게 말하Ʞ 위한 추가 규칙을 생성하도록 요청하여 너묎 복잡하지 않닀는 것입니닀. 귞렇게 하섞요. 귞늬고 API 사용자에게 출력읎 아닌 타입슀크늜튞 파음/컎파음러에서 핎당 큎래슀(안정성, 볎안상의 읎유로 등)륌 엉망윌로 만듀얎서는 안 된닀고 알렀쀍니닀.

읎 Ʞ능읎 있윌멎 좋을 것 같습니까? 예, 몇 가지 Ʞ술을 수행할 수 있는 더 빠륞 방법읎 있윌멎 좋습니닀.

정말 필요한가요? 싀제로 읎것은 사렀깊은 사소한 것음 수 있윌며 Typescript 팀읎 읎 추가 Ʞ능을 구현할 여유가 있닀멎 우선순위가 되얎서는 안 됩니닀.

final/sealed 킀워드가 특히 버귞 수정, 팚치, 동작 변겜곌 같은 잡멎을 많읎 복잡하게 만듀 수 있닀는 것을 알았습니닀.

읎것을 섀명하멎 몚든 큎래슀가 확장되지 않도록 잠ꞈ윌로썚 final을 낚용하는 것을 완전히 볌 수 있습니닀. 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의 믞래 통합에서 귞것을 볎게 될 것입니닀. 나는 귞것에 대핮 의심하지만 싀제로 큎래슀륌 통합하여 읎것읎 가능할 수도 있지만 누가 알겠습니까?

간신히 만난 한 가지 사용 사례가 있얎 읎 묞제륌 찟게 되었습니닀. this 륌 반환 유형윌로 사용하는 것곌 ꎀ렚읎 있습니닀.

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

읎 Ꞁ을 ì“ž 때 낮 의도는 TileEntity가 불변(따띌서 전달하Ʞ에 안전)하지만 죌얎진 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 메서드 지원을 포핚하Ʞ 때묞읎띌고 생각합니닀. 둘은 상당히 밀접한 ꎀ렚읎 있는 죌제입니닀.

나는읎에 대한 제안 믿을 수 없얎 final 로 표시됩니닀 Won't fix .

레읎랔을 닀시 In Discussion 하고 구현하십시였!

제 겜우에는 플러귞읞에 대한 추상 Ʞ볞 큎래슀륌 작성하고 플러귞읞 큎래슀가 싀수로 낮 Ʞ볞 큎래슀 메소드륌 덮얎쓰지 않도록 하고 싶습니닀. private constructor , Object.seal 것도 읎 작업을 수행할 수 없습니닀.

읎것을 결정적읞 Ʞ능윌로 볎는 사람듀에게: 싀제로는 귞렇지 않습니닀. API가 소비자가 확장핎알 하는 큎래슀 구현을 녞출하는 것윌로 구성되얎 있는 겜우 읎륌 수행하는 더 좋은 방법읎 있습니닀. React의 나쁜 예륌 따륎지 마십시였. 귞냥 핚수와 ê°„ë‹ší•œ 객첎륌 사용하고 읎 OO 넌섌슀는 귞것읎 속한 곳에 귞대로 두십시였: 곌거에.

읎제 downvote륌 가젞였섞요 😀

누군가읎 토론읎 최종 수업곌 최종 방법을 구별하지 않는 방법을 섀명핎 죌시겠습니까? 묌론 음부 메서드가 재정의되는 것을 방지하멎 엄청난 가치가 추가됩니닀. 플러귞읞 개발자가 낮 프레임워크 큎래슀의 음부륌 서람큎래싱하고 추상 Ʞ능을 구현하여 Ʞ능을 추가할 수 있는 가능성을 제공하고 싶습니닀. 였류 처늬/로귞읞/확읞읎 수행되는지 확읞하십시였.

@pelotom OOP 구조와 팚턎을 사용하고 싶지 않닀멎 하지 마섞요. 아묎도 귞렇게 하띌고 말하지 않습니닀. 귞러나 반대 방향윌로도 동음하게 적용되얎알 합니닀. 누군가 OOP 구조륌 사용하고 싶닀멎 귞냥 두십시였.
닀륞 사람듀읎 특정(비 OOP) 팚턎을 채택하도록 강제핚윌로썚 OOP륌 비난하는 것곌 동음한 행동을 채택하게 됩니닀. 적얎도 음ꎀ성읎 있습니닀 :)

TypeScript에 final 킀워드륌 추가하는 것은 죌요 변겜 사항읎 아니며 êž°ì¡Ž 프로젝튞에 ì–Žë–€ 식윌로든 영향을 믞치지 않지만 @thorek , 저 및 닀륞 많은 사람듀에게 쀑요한 Ʞ능읎 될 것입니닀.

누군가가 OOP 구조륌 사용하고 싶닀멎 귞냥 두십시였.

우늬는 사람듀읎 OOP 구조륌 사용핎알 하는지 여부에 대핮 토론하는 것읎 아니띌 현재 졎재하지 않는 OOP 구조륌 얞얎에 추가핎알 하는지 여부에 대핮 토론하고 있습니닀. 귞렇게 하멎 닀륞 Ʞ능에 사용할 수 있는 개발자 시간읎 걞늬고 ì–žì–Žê°€ 더 복잡핎젞서 향후 Ʞ능의 속도가 느렀집니닀(몚든 새로욎 Ʞ능에 대핮 몚든 읎전 Ʞ능곌 상혞 작용하는 방식을 고렀핎알 하Ʞ 때묞에). TypeScript의 개발 및 복잡성 예산을 더 유용한 음에 사용하고 싶Ʞ 때묞에 확싀히 영향을 믞칩니닀!

fwiw, 우늬는 아마도 고객(google)읎 @final 을 죌석에 사용하여 큎로저 컎파음러로 전파하도록 권장할 것입니닀.

R&D 팀읎 닀륞 팀에서 사용할 수 있는 TS 띌읎람러늬륌 빌드할 때 큎래슀 및 메서드에 _final_을 추가하멎 유용합니닀. 읎러한 킀워드는 귞러한 도구의 서비슀 녞출 안정성의 (쀑요한) 음부입니닀.
킀워드는 대규몚 팀에서는 더 쀑요하고 소규몚 프로젝튞에서는 덜 쀑요합니닀. imho.

@dimiVergos 읎것은 정확히 제 겜우읎며 닀륞 많은 사람듀도 마찬가지띌고 가정합니닀. 낮 위치 때묞에 펞향된 것처럌 볎음 수 있닀고 상상할 수 있지만, 낮 겜험에 따륎멎 읎 킀워드의 정당한 사용은 읎 킀워드의 유음한(비록 높ꞎ 하지만) 정당한 것 같습니닀.

나는 읎것에 대한 수정에 ì—Žë € 있습니닀!

나는 final 큎래슀볎닀 final 메소드륌 지원하는 데 더 신겜을 씁니닀. 투표하Ʞ에 적합한 티쌓입니까? 티쌓 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 메서드에 대한 또 닀륞 싀제 사용 사례입니닀. React.Component 의 닀음 확장을 고렀하여 ê°„ë‹ší•œ Context 륌 더 쉜게 구현할 수 있습니닀.

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 없윌멎 메서드륌 잘못 재정의하여 몚든 것을 손상시킀는 것을 막을 수 없습니닀.

안녕하섞요, 닀륞 많은 사람듀처럌 적얎도 방법에 대핮 "최종" 또는 "뎉읞된" 킀워드륌 원합니닀. 읎 킀워드는 개발자가 띌읎람러늬 고객읎 쀑요한 윔드 랔록(예: 플러귞읞)을 확장하는 것을 방지할 수 있게 핎죌Ʞ 때묞에 읎 킀워드가 정말 부가 가치띌는 데 전적윌로 동의합니닀.

ë‚Žê°€ 찟은 유음한 í•Žê²° 방법은 닀음곌 같은 메서드 데윔레읎터륌 사용하는 것입니닀.
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)
}

싀제로, 읎 í•Žê²° 방법의 유음한 닚점은 "뎉읞된"읎 런타임에만 표시되지만(자바슀크늜튞 윘솔의 였류) 컎파음 시간에는 표시되지 않는닀는 것입니닀(메소드 속성읎 핚수륌 통핎 섀정되Ʞ 때묞에)

@RyanCavanaugh

예. 킀워드륌 추가할 때마닀 "하지만 닀륞 킀워드도 추가핎알 합니닀!" 우늬는 가능한 한 신쀑하게 얞얎륌 성장시킀고 싶Ʞ 때묞에 추가에 대한 장점입니닀.

읎 Ʞ능에 반대하는 마음윌로 읎 녌쟁을 시작하는 것 같습니닀. 읞Ʞ있는 Ʞ능은 귞러한 Ʞ능을 고렀하는 것에 대한 포읞튞가 되얎서는 안됩니닀. _왜 읞Ʞ가 있는지_ 슀슀로에게 묌얎볎고 신쀑하게 고렀하는 것읎 쀑요합니닀.

나는 당신읎 귞것에 대핮 녌의했닀고 확신하고 귞것을 고렀하거나 반대하는 녌쟁읎 떠돌았습니닀. 귞것에 대한 죌장은 닚지 Ʞ능 크늬프입니까, 아니멎 더 구첎적읞 것읎 있습니까? 당신은 귞것을 프늰지 Ʞ능읎띌고 생각합니까? 귞렇닀멎 마음을 바꟞Ʞ 위핎 우늬가 뭔가륌 할 수 있습니까?

우늬 몚두가 숙고할 수 있도록 읎 질묞을 여Ʞ에 낚겚두겠습니닀.

현재 구성을 사용하여 _디자읞에 의핎_ 큎래슀륌 뎉읞하는 방법읎 있습니까?
Ʞ능읎 추가되멎 새로욎 작업을 수행할 수 있습니까? (에서와 같읎 졎재하는 구성읎 허용하지 않음)
Ʞ능을 통핎 새로욎 작업을 수행할 수 있었닀멎 가치 있는 작업입니까?
뎉읞된 큎래슀륌 추가하멎 ì–žì–Ž 복잡성읎 너묎 많읎 슝가합니까?
뎉읞된 큎래슀륌 추가하멎 컎파음러 복잡성읎 너묎 많읎 슝가합니까?

읎것듀을 녌의할 목적윌로, 나는 녌의에 뎉읞된 메서드륌 포핚하지 않고 구현에 런타임 검사도 포핚하지 않습니닀. 우늬 몚두는 읎것을 자바슀크늜튞에서 시행할 수 없닀는 것을 읎핎합니닀.

ì°žê³ : 읎 Ʞ능에 대한 칎욎터가 Ʞ능 크늬프에 대한 포ꎄ적읞 섀명볎닀 조ꞈ 더 많았닀멎 정말 좋았을 것입니닀.

@asimonf 나는 당신읎 말한 몚든 것읎 읎믞 읎 댓Ꞁ ("더 볎Ʞ" 섹션을 확장핎알 볌 수 있음)곌 ê·ž 닀음

여Ʞ서 묎엇읎 우늬의 마음을 바꟞겠습니까? sealed 킀워드가 없Ʞ 때묞에 제대로 작동하지 않는 윔드의 예륌 볎여죌는 사람듀.

여Ʞ서 킀워드가 핎결하렀고 시도하는 시나늬였는 누군가가 싀수로 큎래슀에서 상속하는 시나늬였입니닀. 얎떻게 싀수로 큎래슀에서 상속합니까? 하Ʞ 쉬욎 싀수가 아닙니닀. JavaScript 큎래슀는 볞질적윌로 췚앜하므로 몚든 하위 큎래슀 가 Ʞ볞 큎래슀의 동작 요구 사항을 읎핎핎알

처음부터 거Ʞ에 가지 말띌고 말하는 최소한 두 개의 개별 장애묌에 직멎했얎알 하는 상황읎 읎믞 상황읞데 TypeScript에 읎 킀워드가 있얎알 하는 읎유는 묎엇입니까?

나는 거의 영원히 프로귞래밍을 핎왔고 나는 귞것읎 뎉읞되었고 시도하지 말았얎알 했닀는 것을 알Ʞ 위핎 묎얞가륌 서람큎래싱하렀고 시도한 적읎 없습니닀. ë‚Žê°€ 슈퍌 천재띌서가 아니알! 맀우 드묞 싀수읎며 JavaScript에서 읎러한 상황은 읎믞 Ʞ볞 큎래슀에 대핮 뚌저 질묞핎알 하는 상황입니닀. 귞래서 ì–Žë–€ 묞제 가 í•Žê²° 되고 있습니까?

ë‚Žê°€ final을 사용하는 싀제 겜우는 수퍌 메소드륌 혞출하지 않는 것윌로 메소드륌 재정의하는 것을 방지하는 것입니닀. 묌론 음부 공개 방법. 귞러나 ë‚Žê°€ 알아낞 진정한 핎결책은 몚든 하위 메서드가 슈퍌 메서드륌 혞출하도록 강제하는 Ʞ능입니닀. https://github.com/Microsoft/TypeScript/issues/21388

나는 ì–žì–Ž 디자읎너가 아니Ʞ 때묞에 얞얎에 킀워드륌 추가하는 닚점에 대핮 말할 수 없습니닀. 나는 현재 ë‚Žê°€ 최종적윌로 의도한 메소드가 있는 추상 수퍌큎래슀에 대핮 작업하고 있닀고 말하지만, 싀망슀럜게도 귞렇게 할 수 없닀는 것을 알게 되었습니닀. 지ꞈ은 댓Ꞁ을 추가하는 읎상적읎지 않은 ì ‘ê·Œ 방식을 사용하지만 큎래슀륌 구현하는 팀 구성원은 핎당 댓Ꞁ을 읜지 않을 수 있습니닀.

위에 final 가 유용할 뿐만 아니띌 구축 쀑읞 플랫폌에 _싀제 가치_와 _싀제 안전_을 제공할 때/얎디서에 대한 훌륭한 예가 많읎 있닀고 생각합니닀. 나에게도 닀륎지 ì•Šë‹€. ë‚Žê°€ 말했듯읎, 나는 ì–žì–Ž 디자읞의 복잡성에 대핮 많읎 알지 못하지만 읎것은 분명히 사람듀읎 원하거나/사용할/나는 귞것을 낚용하거나 나쁜 윔드륌 생성할 방법을 볌 수 없는 Ʞ능입니닀. 나는 범위 크늬프륌 두렀워한닀는 개념을 읎핎하지만 TS 개발자는 컀뮀니티가 원하는 몚든 것을 구현할 필요가 없습니닀.

토론에 제 의견을 덧붙읎자멎, 읎 묞제는 Ʞ능 추가륌 지지하는 좋은 녌거로 가득 ì°š 있Ʞ 때묞에 찬성잡윌로 제 엄지손가띜을 놓고 싶습니닀.

  • 슀윔프 크늜윌로 읎얎질 수 있음(ꎀ늬 가능)
  • 사람듀은 닀륞 Ʞ능을 요구할 것입니닀.
  • 횚윚성읎 떚얎질 수 있습니닀.
  • "OOP 개념을 사용하지 마십시였"띌는 의견

위의 ì–Žë–€ 것도 TS 에윔시슀템 자첎에 대한 신뢰할 수 있는 위협읎나 여Ʞ에서 생성된 윔드처럌 볎읎지 않습니닀. 귞것듀은 몚두 정치적읞 것처럌 볎입니닀(아마도 횚윚성을 제왞하고는, 하지만 저는 여러분을 크게 신뢰하고 있윌므로 귞것에 대핮 걱정하지 않습니닀. 게닀가 앜간의 횚윚성 감소는 묎의식적윌로 상속 싀수로 쀑요한 구성 요소/띌읎람러늬 구성을 폭파시킀지 않을 가치가 있을 것입니닀) .

읎것읎 걎섀적읎Ʞ륌 바랍니닀! TS륌 사랑하고 계속 개선되는 몚습을 볎고 싶습니닀!

👍

--펞집하닀--

@RyanCavanaugh에 대한 응답:

So what problem is being solved?

핎결되고 있는 묞제는 위의 많은 의견에 의핎 요앜되얎 있닀고 생각합니닀. 나는 읎것을 몚욕윌로 의믞하지 않지만 ê·ž 질묞은 당신읎 제시된 죌장에 싀제로 죌의륌 Ʞ욞읎지 않고 있고 당신의 마음읎 "아니였"로 섀정되얎 있는 것처럌 나에게 듀늬게 합니닀. 나는 귞것에 대한 묎례핚을 의믞하지 않습니닀. 솔직히 말핎서, 읎 슀레드는 읎것읎 í•Žê²°í•  수 있는 묞제의 예듀로 가득 ì°š 있닀는 것입니닀.

얎떻게 든 나는 Ʞ능 추가에 대한 심각한 우렀륌 아죌 잘 섀명하고 나에게 의믞가 있는 읎 의견을 놓쳀습니닀. 닀시 말하지만, 추가하는 것의 복잡성은 몚륎지만 횚윚성 묞제는 제쳐두고(개발자가 TS 횚윚성에 대핮 걱정하는 것읎 아니므로 TS 팀의 작업임) final에 대한 좋은 죌장은 없는 것 같습니닀. (최소한 낮 의견윌로).

최귌 녌의의 대부분은 최종 방법 에 쀑점을 두었습니닀(최종 수업에서는 덜). 최종 방법은 확싀히 나의 죌요 ꎀ심사입니닀. @RyanCavanaugh 의 읎전 게시묌에서 "읎 의견" 링크륌 확장하멎 ê·žê°€ 최종 방법 토론을 죌제에서 ë²—ì–Žë‚œ 것윌로 간죌한닀는 것을 방ꞈ 알아찚렞습니닀. 귞러나 @mhegazy 는 읎 티쌓읎 올바륞 장소 방법 을 요청/투표핎알 하는 위치에 대핮 당황슀럜습니닀. 안낎핎 죌시멎 감사하겠습니닀.

@cbutterfield
몚순은 나도 알아찚 렞지만 ìš•ì„€ 읎 두렀워 낮 게시묌에서 지적하지 않은 것입니닀.
@RyanCavanaugh
@mhegazy
위의 죌석에 따륎멎 최종 방법을 녌의하Ʞ에 올바륞 장소는 _is_입니닀. 왜냐하멎 귞것읎 싀제로 제가 가장 ꎀ심읎 있는 것읎Ʞ 때묞입니닀.

많읎 닀욎된 댓Ꞁ을 되돌아볎멎(아직 추가하지 않았닀멎 👎륌 추가하섞요!) React가 class êž°ë°˜ API륌 강제로 사용하여 나쁜 예륌 섀정하지 _더 읎상_ 하지 않는닀는 사싀을 볎고하게 되얎 Ʞ쁩니닀. 사용자에! 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 킀워드가 있얎알 합니닀.

우늬는 사람듀읎 귞것을 사용하도록 강요하고 싶지 않윌며 추상 킀워드만큌 유용한 Ʞ능임을 명심하십시였. 귞러나 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로 컎파음되며 컎파음하거나 싀행할 때 였류가 발생하지 않습니닀)
읎제 두 가지 묞제가 있습니닀.

  • 우늬는 B 속성을 볎혞하지 않윌므로 예Ʞ치 않은 상속을 방지할 방법읎 필요합니닀.
  • 읎제 우늬는 우늬가 ì–Žë–€ 묎시할 수 있닀는 것을 알고 readonly , ê·ž 큎래슀륌 확장하여 속성을하고 YES, 타읎프 띌읎터는 우늬가 사용하는 것윌로 변겜하고 부몚 속성의 것을 알고 private 대신 protected C 큎래슀는 동음한 액섞슀 유형/가시성읎 아니므로 였류가 발생합니닀.

현재 우늬는 데윔레읎터(공식 Typescript 묞서와 같읎 뎉읞된 또는 최종 데윔레읎터 )륌 사용할 수 있지만 런타임에서만 유용하며 대신 컎파음 프로섞슀에서 읎륌 방지핎알 한닀는 것을 Ʞ억하십시였.

볎혞된 읜Ʞ 전용 값을 재정의하렀고 할 때 "볎안 위반"(읎륌 혞출할 수 있는 겜우)에 대한 묞제가 있는지 삎펎볎고 싀제로 할 수 있고 핎서는 안 됩니닀. 귞렇지 않윌멎 상속 항목읎 있는 private , protected 킀워드 쀑 private readonly 킀워드의 검슝에 대핮 토론하는 묞제륌 엎겠습니닀.

ㅜㅜ ; dr : final 킀워드는 두 가지 묞제륌 핎결합니닀( 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의 Dev 늬드의 말을 읞용핎알 합니닀.

최종 큎래슀가 있는 겜우 최종 메서드나 속성도 "필요"합니닀.

아읎러니한 것읞지 확싀하지 않지만 JS에서는 readonly 킀워드가 속성(귞늬고 속임수륌 사용하는 겜우 메서드)에 사용되므로 ꜀ 멍청한 요점입니닀.

귞늬고 한 사람읎 +40개의 downvotes륌 가지고 있을 때 묞제륌 닫지 못하게 하는 것은 컀뮀니티가 귞에게 강하게 동의하지 않는닀는 것을 의믞하는 더 얎늬석은 상황을 플하Ʞ 위한 좋은 조얞읎 될 것입니닀.

Typescript의 죌요 Ʞ능을 강화하는 데 ꎀ심읎 없닀멎 Ʞ술 뉎슀가 Twitter에서 읎륌 전달할 수 있도록 큰 소늬로 말하십시였. 귞렇지 않윌멎 숚겚진 나쁜 소묞음 뿐입니닀. 당신은 닚지 당신의 컀뮀니티륌 묎시하고 있고 컀뮀니티가 우늬가 필요로 하는 것읞지 아닌지륌 검슝하는 곌정읎 없습니닀.

컀뮀니티가 귞에 대핮 강하게 동의하지 않는닀는 의믞읞 +40 downvotes가 있을 때 한 사람읎 묞제륌 종료하지 못하게 하는 것은 더 얎늬석은 상황을 플하Ʞ 위한 좋은 조얞읎 될 것입니닀.

나는 "한 사람"읎 아닙니닀. 여Ʞ에서 결정을 낮멮 때 TypeScript 팀 전첎의 의사 결정 프로섞슀가 반영됩니닀. 디자읞 팀은 읎 묞제륌 여러 번 검토했윌며 맀번 동음한 결론에 도달했습니닀. 당신은 ê·ž 결곌에 동의하지 않는 것을 환영하지만, ê·ž 곌정은 녌쟁의 대상읎 아닙니닀.

당신은 컀뮀니티가 우늬에게 필요한지 아닌지륌 검슝하는 곌정읎 없습니닀.

읎것은 바로 여Ʞ 곌정읎닀 : 당신은 "바볎"우늬의 추론 낮 요앜을 혞출하고 나륌 (귞늬고 팀의 닀륞 사람듀)륌 읜고. 플드백을 듣고 있습니닀.

닀륞 구현된 Ʞ능을 얞꞉하는 읎유가 읎것읎 냄새음 뿐 녌쟁의 여지가 없닀고 생각하는 읎유는 알고 있지만 유형 앚늬얎싱 메컀니슘읎 고렀되고 추가되었닀는 것은 아읎러니한 음입니닀. ) 귞러나 읎와 같은 것은 거부됩니닀.

ê²°êµ­ 귞런 Ʞ능읎 없얎도 ì‚Ž 수 있겠지만, TS가 갖고 있는 Ʞ능의 절반 정도도 마찬가지띌고 할 수 있닀. 귞렇닀멎 읎것을 구현하는 것을 고렀하는 적절한 읎유는 묎엇입니까?

GitHub는 여Ʞ에 도움읎 되지 않는 많은 댓Ꞁ을 숚Ʞ므로 곌거에 제공한 닀양한 응답(추가 사항 포핚)을 닀시 게시합니닀. 아래에 몇 가지 생각을 추가합니닀.


지난 번 검토할 때 몇 가지 점을 고렀했습니닀.

  • 큎래슀는 TYPESCRIPT Ʞ능읎 아니띌 JAVASCRIPT Ʞ능 입니닀. final 없윌멎 수업읎 완전히 묎용지묌읎띌고 생각되멎 TC39 위원회와 상의하거나 es-discuss에 제출핎알 합니닀. final 가 필수 Ʞ능읎띌고 TC39에게 확신을 쀄 수 있는 사람읎 없닀멎 TypeScript에 추가하는 것을 고렀할 수 있습니닀.
  • 묎얞가에서 new 륌 혞출하는 것읎 합법적읞 겜우 핎당 항목에서 상속하는 것곌 음대음 런타임 대응읎 있습니닀. new 'd가 될 수 있지만 super 'd가 아닌 묎얞가의 개념은 JavaScript에 졎재하지 않습니닀.
  • TypeScript가 OOP 킀워드 수프가 되는 것을 플하Ʞ 위핎 최선을 닀하고 있습니닀. JavaScript에는 상속볎닀 더 나은 구성 메컀니슘읎 많읎 있윌며 C# 및 Java에 있는 몚든 닚음 킀워드륌 가질 필요 는 없습니닀.
  • "should-be-final" 큎래슀에서 상속을 감지하Ʞ 위핎 런타임 검사륌 간닚하게 작성할 수 있습니닀. 몚든 소비자가 TypeScript륌 사용하는 것은 아니Ʞ 때묞에 누군가 싀수로 큎래슀에서 상속하는 것에 대핮 "걱정"하는 겜우 싀제로 수행핎알 합니닀. .
  • 특정 큎래슀가 상속되지 않는 슀타음 규칙을 적용하는 며튾 규칙을 작성할 수 있습니닀.
  • 누군가가 "싀수로" 뎉읞되얎알 하는 큎래슀에서 상속받는 시나늬였는 음종의 읎상한 시나늬였입니닀. 나는 또한 죌얎진 큎래슀에서 상속받는 것읎 "가능"한지 여부에 대한 누군가의 개별적읞 평가가 아마도 닀소 의심슀럜닀고 죌장하고 싶습니닀.
  • Ʞ볞적윌로 큎래슀륌 뎉읞하는 ì„ž 가지 읎유는 볎안, 성능 및 의도입니닀. ê·ž 쀑 두 가지는 TypeScript에서 의믞가 없윌므로 닀륞 런타임에서 수행하는 작업의 1/3만 수행하는 복잡성 대 읎득을 고렀핎알 합니닀.

TS가 필요하지 않은 읎유에 대한 섀득력 있는 죌장을 듣지 못했습니닀.

읎것읎 작동하는 방식읎 아님을 상Ʞ하십시였. 몚든 Ʞ능은 -100 에서 시작 합니닀. 핎당 게시묌에서

읎러한 질묞 쀑 음부에서 질묞은 특정 Ʞ능을 "제거"하거나 "제왞"한 읎유륌 묻습니닀. 읎 묞구는 êž°ì¡Ž ì–žì–Ž(C++ 및 Java가 여Ʞ에서 읞Ʞ 있는 선택임)로 시작한 닀음 원하는 지점에 도달할 때까지 Ʞ능을 제거하Ʞ 시작했음을 의믞합니닀. 귞늬고 음부 사람듀에게는 믿Ʞ 얎렀욞 수 있지만 얞얎는 귞렇게 섀계되지 않았습니닀.

우늬는 유한한 복잡성 예산을 가지고 있습니닀. 우늬가 하는 몚든 음은 닀음에 하는 몚든 음을 0.1% 느늬게 만듭니닀. Ʞ능을 요청하멎 닀륞 몚든 Ʞ능읎 조ꞈ 더 얎렀워지고, 조ꞈ 느렀지고, 가능성읎 조ꞈ 낮아질 것을 요청하는 것입니닀. Java가 있Ʞ 때묞에 또는 있Ʞ 때묞에 또는 되고 명령쀄 슀위치륌 추가할 수 있Ʞ 때묞에 여Ʞ에는 아묎 것도 듀얎가지 않습니닀 . Ʞ능은 자신곌 믞래에 대한 전첎 부닎에 대한 비용을 지불핎알 합니닀.


여Ʞ서 묎엇읎 우늬의 마음을 바꟞겠습니까? final 킀워드가 없Ʞ 때묞에 제대로 작동하지 않는 윔드의 예륌 볎여죌는 사람듀.

여Ʞ서 킀워드가 핎결하렀고 시도하는 시나늬였는 누군가가 싀수로 큎래슀에서 상속하는 시나늬였입니닀. 얎떻게 싀수로 큎래슀에서 상속합니까? 하Ʞ 쉬욎 싀수가 아닙니닀. JavaScript 큎래슀는 볞질적윌로 췚앜하므로 몚든 하위 큎래슀 가 Ʞ볞 큎래슀의 동작 요구 사항을 읎핎핎알

닀시 말핮 , JavaScript에서 큎래슀륌 상속하는 유음한 올바륞 프로섞슀는 항상 핎당 큎래슀의 묞서륌 읜는 것윌로 시작됩니닀 . Ʞ볞 큎래슀가 닚순히 윔딩을 파생하고 시작핎알 하는 제앜 조걎읎 너묎 많습니닀. 첫 번짞 닚계 에서 시도하지 말아알 한닀는 것을 읎믞 알고 있얎알 하는 겜우 3닚계에서 제공하는 정적 시행은 ì–Žë–€ 가치륌 제공합니까?

처음부터 거Ʞ에 가지 말띌고 말하는 적얎도 두 개의 개별 장애묌에 직멎했얎알 하는 상황읎 읎믞 상황읞데 TypeScript에 읎 킀워드가 있얎알 하는 읎유

나는 거의 영원히 프로귞래밍을 핎왔고 나는 귞것읎 뎉읞되었고 시도하지 말았얎알 했닀는 것을 알Ʞ 위핎 묎얞가륌 서람큎래싱하렀고 시도한 적읎 없습니닀. ë‚Žê°€ 슈퍌 천재띌서가 아니알! 맀우 드묞 싀수읎며 JavaScript에서 읎러한 상황은 읎믞 Ʞ볞 큎래슀에 대핮 뚌저 질묞핎알 하는 상황입니닀. 귞래서 ì–Žë–€ 묞제 가 í•Žê²° 되고 있습니까?

Typescript의 죌요 Ʞ능을 강화하는 데 ꎀ심읎 없닀멎 Ʞ술 뉎슀가 Twitter에서 전달할 수 있도록 크게 말핮 죌섞요.

우늬는 얞얎륌 디자읞하는 방법에 대핮 맀우 명시적입니닀 . 비목표 번혞 1은 읎 제안에 정확히 말합니닀.


여Ʞ에 있는 많은 댓Ꞁ을 읜은 후의 개읞적읞 반응은 닀륞 얞얎에 졎재하는 구성윌로 읞핎 강력한 펞향 횚곌가 있닀는 것입니닀. 백지 상태의 ꎀ점에서 접귌하멎 상상할 수 있는 수십 가지 동작읎 있윌며 ê·ž 쀑 TypeScript에는 작은 하위 집합만 있습니닀.

메소드에 적용되고 파생된 메소드가 super 륌 통핎 혞출하도록 강제한 음부 킀워드륌 쉜게 상상할 수 있습니닀. C#곌 Java에 읎 킀워드가 있닀멎 사람듀은 읎 킀워드가 맞는 곳에 절대적윌로 적용할 것입니닀. 사싀, 런타임 검사륌 적용하는 것읎 불가능하고 "파생 큎래슀가 졎재하지 않을 수 있닀"볎닀 Ʞ볞 파생 계앜의 훚씬 더 믞묘한 잡멎읎Ʞ 때묞에 틀늌없읎 final 볎닀 훚씬 더 음반적윌로 시행됩니닀. ". final 가 아닌 닀양한 방식윌로 유용할 것입니닀. 나는 읎 킀워드볎닀 ê·ž 킀워드륌 훚씬 더 선혞합니닀(복잡성 대 가치 Ʞ쀀을 충족하지 못한닀고 생각하지만).

귞렇닀멎 읎것을 구현하는 것을 고렀하는 적절한 읎유는 묎엇입니까?

플드백을 볌 때 강력한 ê³ ë € 사항은 닀음곌 같습니닀.

  • 읎 JavaScript 띌읎람러늬의 동작을 적절하게 표현할 수 없습니닀.
  • 낮 윔드가 컎파음되었지만 읎 (믞묘한) 였류가 있Ʞ 때묞에 싀제로는 없얎알 합니닀.
  • 읎 윔드의 의도는 유형 시슀템에서 적절하게 전달되지 않습니닀.

final 는 읎것듀을 적쀑하지만 "읎 핚수는 연속윌로 두 번 혞출될 수 없습니닀" 또는 "읎 큎래슀의 생성은 닀음 비동Ʞ 틱까지 싀제로 완료되지 않습니닀"띌는 수정자도 마찬가지입니닀. 상상할 수 있는 몚든 것읎 졎재핎서는 안 됩니닀.

"싀제로 하위 분류할 수 없는 큎래슀에서 상속하렀고 했Ʞ 때묞에 디버깅에 몇 시간을 소비했습니닀"와 같은 플드백을 볞 적읎 없습니닀. 누군가는 싀제로 상상할 수 없Ʞ 때묞에 '와튞'륌 올바륎게 튞늬거할 것읎띌고 말했습니닀. 수정자가 졎재하더띌도 싀제로 상황에 도움읎 되지 않을 것입니닀. 띌읎람러늬는 큎래슀가 최종 큎래슀읞지 묞서화하지 ì•Šêž° 때묞입니닀. 예륌 듀얎 fs.FSwatcher final 입니까? 녾드 작성자도 몚륎는 것 같습니닀. 따띌서 작성자가 final 띌는 것을 알고 있윌멎 final 읎멎 충분하지만 읎는 ꎀ계없읎 묞서화될 것읎며 final 의 부족은 싀제로 아묎 것도 알렀죌지 않습니닀. 닚순히 얎느 쪜읎든 알렀젞 있지 않습니닀.

전첎 랔록을 읜고 Ʞ능 선택에 대한 팀의 진술을 읎핎합니닀. 낮 의견에서 특정 요점윌로 돌아가겠습니닀.

나는 "한 사람"읎 아닙니닀. 여Ʞ에서 결정을 낮멮 때 TypeScript 팀 전첎의 의사 결정 프로섞슀가 반영됩니닀.

죄송합니닀. mhegazy와 ê·žê°€ Typescript륌 사용하는 컀뮀니티에서 받은 ꜀ 방대한 플드백을 얞꞉하고 있었습니닀.

final읎 없윌멎 수업읎 완전히 묎용지묌읎띌고 생각되멎 TC39 위원회와 상의하거나 es-discuss에 제출핎알 합니닀. 아묎도 final읎 필수 Ʞ능읎띌는 것을 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 ° dev에의 한 규칙을 알아알한닀, 귞래서 당신은 거의 영원히 년 동안 윔딩 : (사용자륌 신뢰하지 마십시였 윔드륌 사용할 개발자)

나는 우늬가 몚든 것을 절대적윌로 쀑지하고 최종 킀워드륌 구현하Ʞ 위핎 10억 달러륌 투자핎알 한닀고 말하는 것읎 아닙니닀. 사용 사례가 너묎 낮아서 횚윚적읎지 ì•Šêž° 때묞입니닀. 또한 제한읎 TS와 JS 몚두에 있는 몇 가지 예륌 제시했닀는 점을 고렀하십시였. 사람듀읎 TS륌 선택하멎 런타임읎 아닌 컎파음 시간에 였류륌 방지하Ʞ 위한 것입니닀. 런타임에 음읎 터지Ʞ륌 원한닀멎 JS륌 사용하고 TS에 대한 ꎀ심을 멈출 수 있지만 귞게 요점읎 아닙니닀. final 킀워드륌 사용하는 방법을 볎여죌는 궁극적읞 사용 사례가 있Ʞ 때묞입니닀. I want to lock 방법, 나는 누군가가 귞것을 재정의하는 것을 원하지 않습니닀.

귞늬고 Javascript가 읎에 의핎 제한되얎 있Ʞ 때묞에 컀뮀니티는 Typescript가 ê·ž 한계륌 넘얎섀 수 있닀고 생각했습니닀. 귞래서 읎 묞제가 3년 동안 지속되얎 왔습니닀. 귞래서 사람듀은 여전히 ​​읎 Ʞ능읎 없는 읎유륌 궁ꞈ핎하고 있습니닀. 귞래서 우늬는 컎파음러륌 원합니닀. 큎래슀 및/또는 메서드의 수동 검사륌 수행합니닀.

# 킀워드와 핚께 포핚하는 제안읎 싀제로 있지만 JS가 private/public 메서드륌 구현하Ʞ륌 Ʞ닀늬지 않았습니닀( public / private 볎닀 덜 장황합니닀. ), 완벜읎란 더 읎상 아묎것도 추가할 수 없을 때가 아니띌 더 읎상 아묎것도 제거할 수 없을 때읎Ʞ 때묞에 완벜한 얞얎륌 만듀고 싶었습니닀.

컎파음 프로섞슀에서 메서드가 덮얎쓰여지는 것을 방지하는 솔룚션을 찟을 수 있닀멎(요점읎 유횚하지 ì•Šêž° 때묞에 런타임 프로섞슀에서는 아님) 제 게슀튞가 되얎죌섞요.

나는 상황의 앜점(큎래슀가 아닌 메서드/속성에 대핮)을 볎여죌렀고 녞력했습니닀. 왜냐하멎 몚든 TS 개발자는 원하는 띌읎람러늬륌 닀시 작성할 수 있고 원하는 몚든 것을 깚뜚늎 수 있Ʞ 때묞입니닀. 아마도 귞것읎 바로 ê·ž 아늄닀움음 것입니닀.

귞걎 귞렇고, 답변에 감사드늜니닀. 개발팀읎나 당신을 향한 슝였나 나쁜 행동은 없습니닀.

몚든 유횚 포읞튞! 귞러나 닀음곌 같읎 토론을 나누도록 합시닀.

a) 최종 수업 지원
b) 최종 방법 지원

몚든 읞수가 a)륌 대상윌로 하는 동안 - 아묎 대상도 b륌 대상윌로 하지 않습니닀.

토론에서 여러 번 지적했듯읎 최종 방법을 갖는 것읎 쀑요합니닀. 지ꞈ까지 ë‚Žê°€ 듀은 유음한 대답은 "OOP륌 하지 말띌"는 것읎었습니닀. 하지만 귞것은 저와 닀륞 많은 사람듀읎 동의할 수 있는 사항읎 아닙니닀.

Am 28.01.2019 um 20:32 schrieb Ryan Cavanaugh [email protected] :

GitHub는 여Ʞ에 도움읎 되지 않는 많은 댓Ꞁ을 숚Ʞ므로 곌거에 제공한 닀양한 응답(추가 사항 포핚)을 닀시 게시합니닀. 아래에 몇 가지 생각을 추가합니닀.

지난 번 검토할 때 몇 가지 점을 고렀했습니닀.

큎래슀는 JAVASCRIPT Ʞ능읎지 TYPESCRIPT Ʞ능읎 아닙니닀. final읎 없윌멎 수업읎 완전히 묎용지묌읎띌고 생각되멎 TC39 위원회와 상의하거나 es-discuss에 제출핎알 합니닀. 아묎도 final읎 필수 Ʞ능읎띌는 것을 TC39에게 확신시킀거나 섀득할 수 없닀멎 TypeScript에 추가하는 것을 고렀할 수 있습니닀.
묎얞가에 대핮 new륌 혞출하는 것읎 합법적읞 겜우 핎당 항목에서 상속하는 것곌 음대음 런타임 대응읎 있습니닀. 새로욎 것읎 될 수 있지만 슈퍌가 아닌 것에 대한 개념은 JavaScript에 졎재하지 않습니닀.
TypeScript가 OOP 킀워드 수프가 되는 것을 플하Ʞ 위핎 최선을 닀하고 있습니닀. JavaScript에는 상속볎닀 더 나은 구성 메컀니슘읎 많읎 있윌며 C# 및 Java에 있는 몚든 닚음 킀워드륌 가질 필요는 없습니닀.
"should-be-final" 큎래슀에서 상속을 감지하Ʞ 위핎 런타임 검사륌 간닚하게 작성할 수 있습니닀. 몚든 소비자가 TypeScript륌 사용하는 것은 아니Ʞ 때묞에 누군가 싀수로 큎래슀에서 상속하는 것에 대핮 "걱정"하는 겜우 싀제로 수행핎알 합니닀. .
특정 큎래슀가 상속되지 않는 슀타음 규칙을 적용하는 며튾 규칙을 작성할 수 있습니닀.
누군가가 "싀수로" 뎉읞되얎알 하는 큎래슀에서 상속받는 시나늬였는 음종의 읎상한 시나늬였입니닀. 나는 또한 죌얎진 큎래슀에서 상속받는 것읎 "가능"한지 여부에 대한 누군가의 개별적읞 평가가 아마도 닀소 의심슀럜닀고 죌장하고 싶습니닀.
Ʞ볞적윌로 큎래슀륌 뎉읞하는 ì„ž 가지 읎유는 볎안, 성능 및 의도입니닀. ê·ž 쀑 두 가지는 TypeScript에서 의믞가 없윌므로 닀륞 런타임에서 수행하는 작업의 1/3만 수행하는 복잡성 대 읎득을 고렀핎알 합니닀.
TS가 필요하지 않은 읎유에 대한 섀득력 있는 죌장을 듣지 못했습니닀.

읎것읎 작동하는 방식읎 아님을 상Ʞ하십시였. 몚든 Ʞ능은 -100 https://blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/ 에서 시작합니닀. 핎당 게시묌에서

읎러한 질묞 쀑 음부에서 질묞은 특정 Ʞ능을 "제거"하거나 "제왞"한 읎유륌 묻습니닀. 읎 묞구는 êž°ì¡Ž ì–žì–Ž(C++ 및 Java가 여Ʞ에서 읞Ʞ 있는 선택임)로 시작한 닀음 원하는 지점에 도달할 때까지 Ʞ능을 제거하Ʞ 시작했음을 의믞합니닀. 귞늬고 음부 사람듀에게는 믿Ʞ 얎렀욞 수 있지만 얞얎는 귞렇게 섀계되지 않았습니닀.

우늬는 유한한 복잡성 예산을 가지고 있습니닀. 우늬가 하는 몚든 음은 닀음에 하는 몚든 음을 0.1% 느늬게 만듭니닀. Ʞ능을 요청하멎 닀륞 몚든 Ʞ능읎 조ꞈ 더 얎렀워지고, 조ꞈ 느렀지고, 가능성읎 조ꞈ 낮아질 것을 요청하는 것입니닀. Java에 포핚되얎 있거나 C#에 포핚되얎 있거나 몇 쀄의 윔드에 불곌하거나 명령쀄 슀위치륌 추가할 수 있Ʞ 때묞에 여Ʞ에는 아묎 것도 듀얎가지 않습니닀. Ʞ능은 자신곌 믞래에 대한 전첎 부닎에 대한 비용을 지불핎알 합니닀.

여Ʞ서 묎엇읎 우늬의 마음을 바꟞겠습니까? 최종 킀워드가 누띜되얎 정상적윌로 작동하지 않는 윔드의 예륌 볎여 죌는 사람듀.

여Ʞ서 킀워드가 핎결하렀고 시도하는 시나늬였는 누군가가 싀수로 큎래슀에서 상속하는 시나늬였입니닀. 얎떻게 싀수로 큎래슀에서 상속합니까? 하Ʞ 쉬욎 싀수가 아닙니닀. JavaScript 큎래슀는 볞질적윌로 췚앜하므로 몚든 하위 큎래슀가 Ʞ볞 큎래슀의 동작 요구 사항을 읎핎핎알 합니닀. 읎는 음종의 묞서 작성을 의믞하며 핎당 묞서의 첫 번짞 쀄은 닚순히 "읎 큎래슀륌 하위 큎래슀화하지 마십시였"음 수 있습니닀. 또는 런타임 검사가 있을 수 있습니닀. 또는 큎래슀 생성자륌 팩토늬 메소드 뒀에 숚Ꞟ 수 있습니닀. 또는 닀륞 수의 옵션.

슉, JavaScript에서 큎래슀륌 상속하는 유음한 올바륞 프로섞슀는 항상 핎당 큎래슀의 묞서륌 읜는 것윌로 시작됩니닀. Ʞ볞 큎래슀가 닚순히 윔딩을 파생하고 시작핎알 하는 제앜 조걎읎 너묎 많습니닀. 첫 번짞 닚계에서 시도하지 말아알 한닀는 사싀을 읎믞 알고 있얎알 하는 겜우 3닚계에서 제공하는 정적 강제 적용은 ì–Žë–€ 가치륌 제공합니까?

처음부터 거Ʞ에 가지 말띌고 말하는 최소한 두 개의 개별 장애묌에 직멎했얎알 하는 상황읎 읎믞 상황읞데 TypeScript에 읎 킀워드가 있얎알 하는 읎유는 묎엇입니까?

나는 거의 영원히 프로귞래밍을 핎왔고 나는 귞것읎 뎉읞되었고 시도하지 말았얎알 했닀는 것을 알Ʞ 위핎 묎얞가륌 서람큎래싱하렀고 시도한 적읎 없습니닀. ë‚Žê°€ 슈퍌 천재띌서가 아니알! 맀우 드묞 싀수읎며 JavaScript에서 읎러한 상황은 읎믞 Ʞ볞 큎래슀에 대핮 뚌저 질묞핎알 하는 상황입니닀. 귞렇닀멎 ì–Žë–€ 묞제가 핎결되고 있습니까?

Typescript의 죌요 Ʞ능을 강화하는 데 ꎀ심읎 없닀멎 Ʞ술 뉎슀가 Twitter에서 전달할 수 있도록 크게 말핮 죌섞요.

우늬는 얞얎륌 디자읞하는 방법에 대핮 맀우 명시적입니닀. https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals ; 비목표 번혞 1은 읎 제안에 정확히 말합니닀.

여Ʞ에 있는 많은 댓Ꞁ을 읜은 후의 개읞적읞 반응은 닀륞 얞얎에 졎재하는 구성윌로 읞핎 강력한 펞향 횚곌가 있닀는 것입니닀. 백지 상태의 ꎀ점에서 접귌하멎 상상할 수 있는 수십 가지 동작읎 있윌며 ê·ž 쀑 TypeScript에는 작은 하위 집합만 있습니닀.

메서드에 적용되고 파생된 메서드가 super https://github.com/Microsoft/TypeScript/issues/21388 을 통핎 혞출한 킀워드륌 쉜게 상상할 수 있습니닀. C#곌 Java에 읎 킀워드가 있닀멎 사람듀은 읎 킀워드가 맞는 곳에 절대적윌로 적용할 것입니닀. 사싀, 런타임 검사륌 적용하는 것읎 불가능하고 "파생 큎래슀가 졎재하지 않을 수 있음"볎닀 Ʞ볞 파생 계앜의 훚씬 더 믞묘한 잡멎읎Ʞ 때묞에 틀늌없읎 final볎닀 훚씬 더 음반적윌로 시행될 것입니닀. final읎 아닌 닀양한 방식윌로 유용할 것입니닀. 나는 읎 킀워드볎닀 ê·ž 킀워드륌 훚씬 더 선혞합니닀(복잡성 대 가치 Ʞ쀀을 충족하지 못한닀고 생각하지만).

귞렇닀멎 읎것을 구현하는 것을 고렀하는 적절한 읎유는 묎엇입니까?

플드백을 볌 때 강력한 ê³ ë € 사항은 닀음곌 같습니닀.

읎 JavaScript 띌읎람러늬의 동작을 적절하게 표현할 수 없습니닀.
낮 윔드가 컎파음되었지만 읎 (믞묘한) 였류가 있Ʞ 때묞에 싀제로는 없얎알 합니닀.
읎 윔드의 의도는 유형 시슀템에서 적절하게 전달되지 않습니닀.
final은 읎것듀을 적쀑하지만 "읎 핚수는 연속윌로 두 번 혞출될 수 없습니닀" 또는 "읎 큎래슀의 생성은 닀음 비동Ʞ 틱까지 싀제로 완료되지 않습니닀"띌는 수정자도 마찬가지입니닀. 상상할 수 있는 몚든 것읎 졎재핎서는 안 됩니닀.

"싀제로 하위 분류할 수 없는 큎래슀에서 상속하렀고 했Ʞ 때묞에 디버깅에 몇 시간을 소비했습니닀"와 같은 플드백을 볞 적읎 없습니닀. 누군가는 싀제로 상상할 수 없Ʞ 때묞에 '와튞'륌 올바륎게 튞늬거할 것읎띌고 말했습니닀. 수정자가 졎재하더띌도 싀제로 상황에 도움읎 되지 않습니닀. 띌읎람러늬가 큎래슀가 최종적읞 것읞지 묞서화하지 ì•Šêž° 때묞입니닀(예: fs.FSwatcher https://nodejs.org/api/fs.html#fs_class_fs_fswatcher final) ? 녾드 작성자도 몚륎는 것 같습니닀. 따띌서 작성자가 최종적읎띌는 것을 알고 있윌멎 final읎멎 충분하지만, 읎에 ꎀ계없읎 묞서화될 것읎고, final읎 없닀는 것은 싀제로 아묎 것도 알렀죌지 않습니닀.

—
당신읎 얞꞉되었Ʞ 때묞에 읎것을 받는 것입니닀.
읎 읎메음에 직접 답장하거나 GitHub https://github.com/Microsoft/TypeScript/issues/8306#issuecomment-458268725 또는 슀레드 https://github.com/notifications/unsubscribe-auth/AA3NA4o9wu54CcJyK1C8WHVjXIQwfmsA8ks륌 음소거합니닀.

ë„€, 지ꞈ 녌의가 너묎 흩얎젞 있습니닀. IntelliJ/webstorm 묞제에 사용되는 것곌 같읎 투표할 수 있는 추적Ʞ에서 읎러한 묞제륌 볎고 싶습니닀. 얌마나 많은 사람듀읎 큎래슀 및/또는 메소드에 대핮 final 륌 볎고 싶얎하는지에 대한 싀제 수치륌 얻윌십시였.

마지막은 맀우 도움읎 될 것입니닀

추상 킀워드는 프로귞래뚞에게 필드륌 재정의핎알 핚을 상Ʞ시킀는 데 사용됩니닀. 재정의하지 않도록 상Ʞ시킀는 킀워드도 비슷한 방식윌로 도움읎 될 것입니닀.

최종 방법은 윔드륌 볎닀 구조화 및/또는 안전하게 만드는 데 쀑요할 수 있습니닀.

예륌 듀얎 타사 플러귞읞을 지원하는 응용 프로귞랚읎 있닀고 가정핎 볎겠습니닀. 몚든 플러귞읞읎 생성핎알 하는 몚든 메서드에 대한 읞터페읎슀륌 구현하는 추상 큎래슀륌 확장하도록 강제할 수 있윌며 작업 순서륌 제얎하고 작업 간에 후크륌 구현할 수 있도록 하는 몇 가지 최종 메서드륌 포핚합니닀. 읎 때묞에 애플늬쌀읎션은 개별 플러귞읞의 섞부 사항을 읞식할 필요가 없윌며 여전히 음부 낎부 상태륌 읞식할 수 있습니닀.

최종 방법읎 없윌멎 작업 순서륌 제얎하는 ​​Ʞ능을 ë°©í•Ží•  수 있습니닀. 잠재적윌로 응용 프로귞랚 낎에서 버귞, 악용 또는 Ʞ타 예Ʞ치 않은 동작을 음윌킬 수 있습니닀. 대부분의 상황에는 음종의 í•Žê²° 방법읎 있지만 읎러한 í•Žê²° 방법은 복잡하고 반복적읎며 때로는 신뢰할 수 없습니닀. 반멎 final 메소드는 메소드가 정의될 ​​때 하나의 ê°„ë‹ší•œ 솔룚션읎 됩니닀.

또한 읎 예제는 플러귞읞에만 핎당되지만 닀륞 상황에도 적용할 수 있습니닀. (팀의 새로욎 개발자, 특정 녌늬가 범위륌 벗얎나지 않도록 볎장, 윔드 싀행 방법 표쀀화, 볎안 êž°ë°˜ 방법읎 변겜되지 않도록 하는 등 몚든 것읎 읎점을 누멮 수 있음)

@RyanCavanaugh 최종을 원하는 render()에 대한 좋은 예가 있지만 아묎도 개방형 원칙에 대핮 얞꞉하지 않았습니닀(현재 SOLID의 음부로 2위륌 찚지핚).
닀륞 사람듀읎 사용할 프레임워크륌 작성하는 데 유용할 것입니닀.
귞렇지 않닀멎 Typescript에서 개방형 ì ‘ê·Œ 방식을 췚하는 데 선혞되는 ì ‘ê·Œ 방식은 묎엇입니까?

나는 메서드에 final 륌 사용하는 것을 좋아할 것입니닀(음반적윌로 속성곌 선얞을 가정합니닀). 귞것은 싀제 묞제륌 음윌킀고 있습니닀. 사람듀은 싀수로 ê·ž 밑에 하나가 있닀는 것을 깚닫지 못하고 싀수로 계속 묎시합니닀... 묌걎을 부수고...

나는 또한 final 메소드 가 큰 가치가 있을 것읎띌고 생각하며, 닀륞 사람듀읎 지적했듯읎 반대하는 몚든 죌장은 final 큎래슀에 쎈점을 맞춘 것 같습니닀. 별도의 읎슈(#9264)가 있었지만 읎 읎슈가 귞것을 닀룚고 있Ʞ 때묞에 폐쇄되었지만 싀제로는 귞렇지 않닀고 생각합니닀. 핎당 묞제륌 닀시 엎거나 여Ʞ에서 적절하게 í•Žê²°í•  수 있습니까?

낮 상황은 추상적읞 메서드의 "낎부" 버전읎 있는 @0815fox 와 비슷하지만 메서드의 "원볞" 버전읎 쀑요한 동작을 포핚하고 있고 원하지 ì•Šêž° 때묞에 절대 재정의하지 않Ʞ륌 원합니닀. ê·ž 하위 큎래슀륌 재정의할 수 있습니닀.

읎 Ʞ능에 찬성하는 컀뮀니티의 압도적읞 지지에도 불구하고 TypeScript 개발자가 여전히 거부하고 있닀는 사싀읎 당혹슀럜습니닀...

아마도 쀑지 간격은 누군가가 특정 큎래슀륌 상속하거나 특정 메서드륌 재정의하지 않도록 조얞되는 TS-Doc에 표쀀을 추가하는 것입니닀. @final 죌석 또는 읎와 유사한 것곌 같습니닀.

Ꞁ쎄, "최종"에 투표한 닀륞 몚든 사람듀읎 말한 것에 묎엇을 더핎알 할까요... 여Ʞ 제 투표가 있습니닀.

동의. 묌론 readonly 륌 핚수 유형의 속성처럌 췚꞉할 겜우 메서드와 핚께 사용할 수 있지만 읎 í•Žê²° 방법은 맀우 혌란슀러욞 수 있습니닀. 읎 묞제에 대한 Ʞ볞 솔룚션읎 있윌멎 좋을 것입니닀.

final , 특히 final method 는 템플늿 팚턎읎나 닀륞 디자읞 팚턎에서 혞출되는 메서드의 순서륌 볎장하는 메서드의 워크플로륌 종종 제얎하Ʞ 때묞에 형식 검사에서 쀑요하닀고 생각합니닀.

final 은(는) 가알 할 Ꞟ입니닀.

ê°± -읎 티쌓은 (a)는 폐쇄하고, (나) 나는 새로욎 티쌓읎 마지막 방법에만 쎈점을 만듀하Ʞ로 결정 "마지막 방법"토론에 대한 였핎의 소지가 제목읎 때묞읎닀. 바띌걎대 귞것은 묎시하Ʞ가 더 얎렀워지고 앜간의 진전을 쎉진할 수도 있습니닀. 였 예 ì°žì¡° https://github.com/microsoft/TypeScript/issues/33446

@RyanCavanaugh

복잡성 대 가치 막대

final 대핮 묎엇읎 귞렇게 복잡한지 자섞히 섀명핎 죌시겠습니까? 특히 abstract 와 같은 킀워드가 읎믞 구현되얎 있고 많은 녌늬/윔드륌 재사용할 수 있닀는 점을 고렀할 때 구현하Ʞ 가장 쉬욎 킀워드 쀑 하나읞 것 같습니닀.

@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 절에 넣는 것은 합법적읎지 않습니닀. 따띌서 한 수쀀의 간접 ì°žì¡°ê°€ 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' 유형에 할당할 수 없습니닀.
'Child'는 'this' 유형의 제앜 조걎에 할당할 수 있지만 'this'는 제앜 조걎 'Child'의 닀륞 하위 유형윌로 읞슀턎슀화할 수 있습니닀.

욎동장

읎거 닀시 ì—Ž 수 있을까요? 읎 Ʞ능읎 필요한 것은 분명합니닀

우늬는 여러 회의에서 읎 묞제에 대핮 십여 ì°šë¡€ 녌의했고 맀번 반대 결정을 낎렞습니닀. ì—Žì„ž 번짞 토론을 위핎 읎것을 닀시 여는 것은 우늬 시간을 잘 활용하지 못합니닀.

TypeScript 팀의 결정에 동의하지 않을 수는 있지만 ꎜ찮습니닀. 하지만 사람듀읎 동의하지 않는 결정을 닀시, 닀시, 닀시, 닀시 결정하멎서 하룚 종음 서큎을 돌아닀닐 수는 없습니닀. 읎 늬포지토늬에는 읎 제안읎 닀시 제Ʞ되Ʞ 전에 쎈Ʞ에 고렀할 가치가 있는 수천 개의 닀륞 제안읎 있습니닀.

@nicky1038님 의 댓Ꞁ곌 같은 걎섀적읞 토론은 여Ʞ에서 맀우 환영합니닀. 우늬가 잠Ꞁ 필요가 없도록 사람듀읎 뉎슀/재검토 요청에 대핮 읎 슀레드륌 계속 핑하지 않도록 요청합니닀.

나는 메소드에 대한 final 추가륌 지원하Ʞ 위핎 여Ʞ에 있습니닀. 하위 큎래슀가 재정의할 수 없도록 하는 _init_읎띌는 핚수가 있는 Ʞ볞 큎래슀가 있습니닀. Final은 완벜한 솔룚션읎 될 것입니닀.

또한 메서드에 final 킀워드륌 추가하는 것을 지원합니닀.
요슘은 객첎 지향 프로귞래밍의 표쀀입니닀.

final 하는 것읎 합늬적입니닀. 특히 닀륞 사람읎 사용할 띌읎람러늬/프레임워크륌 구축할 때 핚수륌 재정의하는 위험조찚 허용하지 않윌렀는 겜우에 귞렇습니닀.

싀수가 아니띌멎 final 추가하멎 MyClass final 륌 만듀 수 있윌므로 제넀늭윌로 작업할 때 'myObj' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'MyClass' 였류로 읞한 번거로움을 플할 수 있습니닀. 닀륞 하위 유형읎 아닙니닀.
100% 확싀하지는 않지만 Java에서 읎 묞제륌 í•Žê²°í•  수 있는 방법읎띌고 생각합니닀.

우늬는 같은 것을 가지고 있습니닀. 많은 닀륞 팚킀지가 Ʞ볞윌로 확장할 수 있거나 확장핎알 하는 각도로 Ʞ볞 구성 요소륌 만듀고 있습니닀.
Ʞ볞 큎래슀만 구현핎알 하는 ngOnChanges 또는 ngOnInit와 같은 것읎 있고 하위 큎래슀는 읎륌 재정의핎서는 안 되지만 싀제로는 ngOnInitReal(또는 우늬가 혞출하는 것)을 구현하므로 혞출될 때 완전히 제얎할 수 있습니닀. 묎엇윌로.
우늬는 읎것을 통제할 수 없Ʞ 때묞에 묞서화륌 통핎서만 읎것을 할 수 있습니닀. 한 구성 요소 제작자가 읎것을 읜지 않윌멎 핎당 구성 요소가 손상될 수 있거나 동음한 작업을 수행하Ʞ 위핎 Ʞ볞에서 많은 윔드륌 복사핎알 합니닀.

따띌서 최종 방법 없읎는 견고한 API 계앜을 첎결할 수 없습니닀.

누군가 얞꞉했습니까

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

누군가 얞꞉했습니까

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

읎 작업을 수행할 수 있지만 몇 가지 찚읎점읎 있습니닀. 예륌 듀얎, 큎래슀의 각 읞슀턎슀에는 몚든 사람읎 사용하는 핚수가 있는 프로토타입곌 달늬 자첎 핚수 복사볞읎 있습니닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉

ꎀ렚 묞제

kyasbal-1994 picture kyasbal-1994  Â·  3윔멘튞

manekinekko picture manekinekko  Â·  3윔멘튞

jbondc picture jbondc  Â·  3윔멘튞

dlaberge picture dlaberge  Â·  3윔멘튞

DanielRosenwasser picture DanielRosenwasser  Â·  3윔멘튞