íŽëì€ê° íì íŽëì€íëì§ ìëë¡ ì§ì íë ë°©ë²ìŽ ììŒë©Ž ì ì©í ì ìë€ê³ ìê°íì¬ ì»ŽíìŒë¬ê° 컎íìŒ ì ì볞 íŽëì€ë¥Œ íì¥íë ë€ë¥ž íŽëì€ë¥Œ 볎ë ê²œì° ì¬ì©ììê² ê²œê³ íëë¡ íìµëë€.
Javaììë finalë¡ íìë íŽëì€ë¥Œ íì¥í ì ììŒë¯ë¡ TypeScriptìì ëìŒí í€ìë륌 ì¬ì©íë©Ž ë€ì곌 ê°ìŽ íìë©ëë€.
final class foo {
constructor() {
}
}
class bar extends foo { // Error: foo is final and cannot be extended
constructor() {
super();
}
}
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:
seal
ë C#ìì ë늬 ì¬ì©ëë©° ë ì§§ê³ ììëë ëììŽ ëìŒí©ëë€.ê·žë°ë° Object.preventExtensions()
ë ìë€ë ìžêžì ìììµëë€.
ì°šìŽì ì ì¬êž°ìì 볌 ì ììµëë€.
ë ì
ì ë°ìŽíž ë° ìì
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 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 íŽëì€ì êŽí ê² ì ëë€. ìì í ë€ë¥ž ê°ë ìž ìµì¢ /ëŽìžë ë°©ë²ì ëí 죌ì ìì ë²ìŽë í ë¡ ìŽ ìììµëë€.
ì§ë ë² ê²í í ë ëª ê°ì§ ì ì ê³ ë €íìµëë€.
final
ììŒë©Ž ìì
ìŽ ìì í 묎ì©ì§ë¬ŒìŽëŒê³ ìê°ëë©Ž TC39 ììíì ììíê±°ë es-discussì ì ì¶íŽìŒ í©ëë€. final
ê° íì êž°ë¥ìŽëŒê³ TC39ìê² íì ì ì€ ì ìë ì¬ëìŽ ìë€ë©Ž TypeScriptì ì¶ê°íë ê²ì ê³ ë €í ì ììµëë€.new
륌 ížì¶íë ê²ìŽ í©ë²ì ìž ê²œì° íŽë¹ í목ìì ììíë ê²ê³Œ ìŒëìŒ ë°íì ëììŽ ììµëë€. new
'dê° ë ì ìì§ë§ super
'dê° ìë 묎ìžê°ì ê°ë
ì JavaScriptì ì¡Žì¬íì§ ììµëë€.ìŽ ëªšë ê²ì ëìíì§ ììŒì
ë ëì§ë§ 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 몚ìê° ììµëë€.
final
ì ëíŽ ê±±ì í íìê° ììµëë€.sealed
륌 ì ì©íì¬ ìë¹ì ê° I 륌 묻ë ëì can I ì 묻ëë¡ í©ëë€ . ì¢
ì¢
C# íŽëì€ë ì€ì ë¡ sealed
ìŽìŽìŒ íë©° ì¢
ì¢
ê°ê³Œë©ëë€.í¥ë¯žë¡ê²ë 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 ê°ë°ìë 컀뮀ëí°ê° ìíë 몚ë ê²ì 구íí íìê° ììµëë€.
í ë¡ ì ì ì견ì ë§ë¶ìŽìë©Ž, ìŽ ë¬žì ë êž°ë¥ ì¶ê°ë¥Œ ì§ì§íë ì¢ì ë Œê±°ë¡ ê°ë ì°š ìêž° ë묞ì ì°¬ì±ìž¡ìŒë¡ ì ìì§ìê°ëœì ëê³ ì¶ìµëë€.
ìì ìŽë€ ê²ë 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ë ì¬êž°ì ëììŽ ëì§ ìë ë§ì ëêžì ìšêž°ë¯ë¡ 곌거ì ì ê³µí ë€ìí ìëµ(ì¶ê° ì¬í í¬íš)ì ë€ì ê²ìí©ëë€. ìëì ëª ê°ì§ ìê°ì ì¶ê°í©ëë€.
ì§ë ë² ê²í í ë ëª ê°ì§ ì ì ê³ ë €íìµëë€.
final
ììŒë©Ž ìì
ìŽ ìì í 묎ì©ì§ë¬ŒìŽëŒê³ ìê°ëë©Ž TC39 ììíì ììíê±°ë es-discussì ì ì¶íŽìŒ í©ëë€. final
ê° íì êž°ë¥ìŽëŒê³ TC39ìê² íì ì ì€ ì ìë ì¬ëìŽ ìë€ë©Ž TypeScriptì ì¶ê°íë ê²ì ê³ ë €í ì ììµëë€.new
륌 ížì¶íë ê²ìŽ í©ë²ì ìž ê²œì° íŽë¹ í목ìì ììíë ê²ê³Œ ìŒëìŒ ë°íì ëììŽ ììµëë€. new
'dê° ë ì ìì§ë§ super
'dê° ìë 묎ìžê°ì ê°ë
ì JavaScriptì ì¡Žì¬íì§ ììµëë€.TSê° íìíì§ ìì ìŽì ì ëí ì€ëë ¥ ìë 죌ì¥ì ë£ì§ 못íìµëë€.
ìŽê²ìŽ ìëíë ë°©ììŽ ìëì ìêž°íììì€. 몚ë êž°ë¥ì -100 ìì ìì í©ëë€. íŽë¹ ê²ì묌ìì
ìŽë¬í ì§ë¬ž ì€ ìŒë¶ìì ì§ë¬žì í¹ì êž°ë¥ì "ì ê±°"íê±°ë "ì ìž"í ìŽì 륌 묻ìµëë€. ìŽ ë¬žêµ¬ë êž°ì¡Ž ìžìŽ(C++ ë° Javaê° ì¬êž°ìì ìžêž° ìë ì íì)ë¡ ììí ë€ì ìíë ì§ì ì ëë¬í ëê¹ì§ êž°ë¥ì ì ê±°íêž° ììíìì ì믞í©ëë€. ê·žëŠ¬ê³ ìŒë¶ ì¬ëë€ìê²ë 믿Ʞ ìŽë €ìž ì ìì§ë§ ìžìŽë ê·žë ê² ì€ê³ëì§ ìììµëë€.
ì°ëŠ¬ë ì íí ë³µì¡ì± ìì°ì ê°ì§ê³ ììµëë€. ì°ëŠ¬ê° íë 몚ë ìŒì ë€ìì íë 몚ë ìŒì 0.1% ëëŠ¬ê² ë§ëëë€. êž°ë¥ì ìì²íë©Ž ë€ë¥ž 몚ë êž°ë¥ìŽ ì¡°êž ë ìŽë €ìì§ê³ , ì¡°êž ëë €ì§ê³ , ê°ë¥ì±ìŽ ì¡°êž ë®ìì§ ê²ì ìì²íë ê²ì ëë€. Javaê° ìêž° ë묞ì ëë ìêž° ë묞ì ëë ëê³ ëª ë ¹ì€ ì€ìì¹ë¥Œ ì¶ê°í ì ìêž° ë묞ì ì¬êž°ìë ì묎 ê²ë ë€ìŽê°ì§ ììµëë€ . êž°ë¥ì ìì 곌 믞ëì ëí ì 첎 ë¶ëŽì ëí ë¹ì©ì ì§ë¶íŽìŒ í©ëë€.
ì¬êž°ì 묎ììŽ ì°ëŠ¬ì ë§ìì ë°êŸžê² ìµëê¹? final
í€ìëê° ìêž° ë묞ì ì ëë¡ ìëíì§ ìë ìœëì ì륌 볎ì¬ì£Œë ì¬ëë€.
ì¬êž°ì í€ìëê° íŽê²°íë €ê³ ìëíë ìë늬ì€ë ëêµ°ê°ê° ì€ìë¡ íŽëì€ìì ììíë ìë늬ì€ì ëë€. ìŽë»ê² ì€ìë¡ íŽëì€ìì ììí©ëê¹? íêž° ì¬ìŽ ì€ìê° ìëëë€. JavaScript íŽëì€ë 볞ì§ì ìŒë¡ ì·šìœíë¯ë¡ 몚ë íì íŽëì€ ê° êž°ë³ž íŽëì€ì ëì ì구 ì¬íì ìŽíŽíŽìŒ
ë€ì ë§íŽ , JavaScriptìì íŽëì€ë¥Œ ììíë ì ìŒí ì¬ë°ë¥ž íë¡ìžì€ë íì íŽë¹ íŽëì€ì 묞ì륌 ìœë ê²ìŒë¡ ììë©ëë€ . Ʞ볞 íŽëì€ê° ëšìí ìœë©ì íìíê³ ììíŽìŒ íë ì ìœ ì¡°ê±ŽìŽ ë묎 ë§ìµëë€. 첫 ë²ì§ž ëšê³ ìì ìëíì§ ë§ììŒ íë€ë ê²ì ìŽë¯ž ìê³ ììŽìŒ íë ê²œì° 3ëšê³ìì ì ê³µíë ì ì ìíì ìŽë€ ê°ì¹ë¥Œ ì ê³µí©ëê¹?
ì²ìë¶í° ê±°êž°ì ê°ì§ ë§ëŒê³ ë§íë ì ìŽë ë ê°ì ê°ë³ ì¥ì 묌ì ì§ë©ŽíìŽìŒ íë ìí©ìŽ ìŽë¯ž ìí©ìžë° TypeScriptì ìŽ í€ìëê° ììŽìŒ íë ìŽì
ëë ê±°ì ììí íë¡ê·žëë°ì íŽìê³ ëë ê·žê²ìŽ ëŽìžëìê³ ìëíì§ ë§ììŽìŒ íë€ë ê²ì ìêž° ìíŽ ë¬Žìžê°ë¥Œ ìëžíŽëì±íë €ê³ ìëí ì ìŽ ììµëë€. ëŽê° ìíŒ ì²ì¬ëŒìê° ìëìŒ! ë§€ì° ë묞 ì€ììŽë©° JavaScriptìì ìŽë¬í ìí©ì ìŽë¯ž Ʞ볞 íŽëì€ì ëíŽ ëšŒì ì§ë¬žíŽìŒ íë ìí©ì ëë€. ê·žëì ìŽë€ 묞ì ê° íŽê²° ëê³ ììµëê¹?
Typescriptì 죌ì êž°ë¥ì ê°ííë ë° êŽì¬ìŽ ìë€ë©Ž êž°ì ëŽì€ê° Twitterìì ì ë¬í ì ìëë¡ í¬ê² ë§íŽ 죌ìžì.
ì°ëŠ¬ë ìžìŽë¥Œ ëììžíë ë°©ë²ì ëíŽ ë§€ì° ëª ìì ì ëë€ . ë¹ëª©í ë²íž 1ì ìŽ ì ìì ì íí ë§í©ëë€.
ì¬êž°ì ìë ë§ì ëêžì ìœì íì ê°ìžì ìž ë°ìì ë€ë¥ž ìžìŽì ì¡Žì¬íë 구ì±ìŒë¡ ìžíŽ ê°ë ¥í íží¥ íšê³Œê° ìë€ë ê²ì ëë€. ë°±ì§ ìíì êŽì ìì ì ê·Œíë©Ž ììí ì ìë ìì ê°ì§ ëììŽ ììŒë©° ê·ž ì€ TypeScriptìë ìì íì ì§í©ë§ ììµëë€.
ë©ìëì ì ì©ëê³ íìë ë©ìëê° super
륌 íµíŽ ížì¶íëë¡ ê°ì í ìŒë¶ í€ìë륌 ìœê² ììí ì ììµëë€. C#곌 Javaì ìŽ í€ìëê° ìë€ë©Ž ì¬ëë€ì ìŽ í€ìëê° ë§ë ê³³ì ì ëì ìŒë¡ ì ì©í ê²ì
ëë€. ì¬ì€, ë°íì ê²ì¬ë¥Œ ì ì©íë ê²ìŽ ë¶ê°ë¥íê³ "íì íŽëì€ê° ì¡Žì¬íì§ ìì ì ìë€"ë³Žë€ êž°ë³ž íì ê³ìœì íšì¬ ë 믞ë¬í ìž¡ë©ŽìŽêž° ë묞ì í늌ììŽ final
ë³Žë€ íšì¬ ë ìŒë°ì ìŒë¡ ìíë©ëë€. ". final
ê° ìë ë€ìí ë°©ììŒë¡ ì ì©í ê²ì
ëë€. ëë ìŽ í€ìëë³Žë€ ê·ž í€ìë륌 íšì¬ ë ì íží©ëë€(ë³µì¡ì± ë ê°ì¹ êž°ì€ì 충족íì§ ëª»íë€ê³ ìê°íì§ë§).
ê·žë ë€ë©Ž ìŽê²ì 구ííë ê²ì ê³ ë €íë ì ì í ìŽì ë 묎ìì ëê¹?
íŒëë°±ì 볌 ë ê°ë ¥í ê³ ë € ì¬íì ë€ì곌 ê°ìµëë€.
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); } }
ìŽ ìì ì ìíí ì ìì§ë§ ëª ê°ì§ ì°šìŽì ìŽ ììµëë€. ì륌 ë€ìŽ, íŽëì€ì ê° ìžì€íŽì€ìë 몚ë ì¬ëìŽ ì¬ì©íë íšìê° ìë íë¡í íì 곌 ë¬ëŠ¬ ì첎 íšì ë³µì¬ë³žìŽ ììµëë€.
ê°ì¥ ì ì©í ëêž
ë©ìëìë
final
ìì ìê° ììŽìŒ í©ëë€.ì륌 ë€ìŽ ëë fooItìŽ ì¬ì ìëë ê²ì ꞎêží íŒíê³ ì¶ì ë€ì곌 ê°ì íšíŽì ì죌 ì¬ì©í©ëë€.