(@RyanCavanuaghì ì ë°ìŽíž)
"ì ë°ìŽíž", "ì§êž ì¶ê°íìžì" ë±ì ìì²íêž° ì ì ìŽ ëêž ì íìžíìžì. í ë¡ ì ì믞 ìê² ì¶ê°ëì§ ìë ëêžì ì€ë ë êžžìŽë¥Œ ë€ì í©ëŠ¬ì ìŒë¡ ì ì§íêž° ìíŽ ì ê±°ë©ëë€.
(ì°žê³ , ìŽê²ì Issue #1524ì ì€ë³µìŽ _ìëëë€_. ì¬êž° ì ìì C++ ì¬ì ì ì§ì ìì ëŒìžì ë°ëŒ ë ë§ìŽ ììŒë©°, ìŽë typescriptì íšì¬ ë ì í©í©ëë€)
override í€ìëë typescriptìì ë§€ì° ì ì©í©ëë€. ìíŒ íŽëì€ ë©ìë륌 ì¬ì ìíë 몚ë ë©ìëì ì íì í€ìëìŽë©° C++ì ì¬ì ì ì§ì ìì ì ì¬íê² "_ìŽ ë©ìëì ìŽëŠ+ìëª ìŽ íì ìíŒ íŽëì€ ë©ìëì ìŽëŠ+ìëª ê³Œ ìŒì¹íŽìŒ íš_"ìŽëŒë ìë륌 ëíë ëë€. . ìŽê²ì ê·žë ì§ ììŒë©Ž ìœê² ëì¹ ì ìë ë í° ìœë êž°ë°ì ì 첎 ë²ìì 묞ì 륌 í¬ì°©í©ëë€.
ë€ì C++ì ì ì¬íê² _ì¬ì ìë ë©ìëìì override í€ìë륌 ìëµíë ê²ì ì€ë¥ê° ìëëë€_. ìŽ ê²œì° ì»ŽíìŒë¬ë íì¬ì ëê°ìŽ ìëíê³ override í€ìëì êŽë šë ì¶ê° 컎íìŒ ìê° ê²ì¬ë¥Œ 걎ëëëë€. ìŽë ê² íë©Ž íì íŽëì€ ì¬ì ìê° êž°ë³ž íŽëì€ì ìëª ê³Œ ì íí ìŒì¹íì§ ìë ë³Žë€ ë³µì¡í íìíëì§ ìì ìë°ì€í¬ëŠœíž ìë늬ì€ê° ê°ë¥í©ëë€.
class Animal {
move(meters:number):void {
}
}
class Snake extends Animal {
override move(meters:number):void {
}
}
// Add an additional param to move, unaware that the intent was
// to override a specific signature in the base class
class Snake extends Animal {
override move(meters:number, height:number):void {
}
}
// COMPILE ERROR: Snake super does not define move(meters:number,height:number):void
// Rename the function in the base class, unaware that a derived class
// existed that was overriding the same method and hence it needs renaming as well
class Animal {
megamove(meters:number):void {
}
}
// COMPILE ERROR: Snake super does not define move(meters:number):void
// Require the function to now return a bool, unaware that a derived class
// existed that was still using void, and hence it needs updating
class Animal {
move(meters:number):bool {
}
}
// COMPILE ERROR: Snake super does not define move(meters:number):void
ì¶ê° 컎íìŒ ìê° ì íšì± ê²ì¬ë¿ ìëëŒ override í€ìëë ì¬ì© ê°ë¥í ìíŒ ë©ìë륌 ìœê² íìíê³ ì íí ì ìë typescript intellisenseì ë©ì»€ëìŠì ì ê³µí©ëë€. ì¬êž°ì ìëë íì íŽëì€ìì ê·ž ì€ íë륌 구첎ì ìŒë¡ ì¬ì ìíë ê²ì ëë€. íì¬ ìŽê²ì ë§€ì° í¬ë°íê³ ìíŒ íŽëì€ ì²Žìžì íìíê³ ì¬ì ìíë €ë ë©ìë륌 ì°Ÿì ë€ì ìëª ìŒì¹ë¥Œ 볎ì¥íêž° ìíŽ íì íŽëì€ì ë³µì¬íì¬ ë¶ì¬ë£ë ê²ì í¬íší©ëë€.
íŽëì€ ì ìž ëŽìì:
ì°žìŒë¡ ì¢ì ì ììŽë€.
ê·žë¬ë ëìê² ì íší ì¬ì ììž ë€ì ìë ìŽë»ìµëê¹?
class Snake extends Animal {
override move(meters:number, height=-1):void {
}
}
class A {...}
class Animal {
setA(a: A): void {...}
getA(): A {...}
}
class B extends A {...}
class Snake extends Animal {
override setA(a: B): void {...}
override getA(): B {...}
}
ëí override í€ìëê° ì¡Žì¬íëë¡(ëë ê²œê³ ë¡ ë³Žê³ ëëë¡) 컎íìŒë¬ íë귞륌 ì¶ê°í©ëë€.
ê·ž ìŽì ë ììë íŽëì€ê° ìŽë¯ž 구íí Ʞ볞 íŽëì€ì ë©ìë ìŽëŠì ë³ê²œí ë í¬ì°©íêž° ìíšì
ëë€(ê·žë¬ë ì¬ì ìë ìë).
ì ì¢ì ì. ìŒë°ì ìŒë¡ ë§íë©Ž ì¬ì ì í€ìë륌 ì¬ì©íì¬ ìëª ì _ì íí_ ìŒì¹ë¥Œ ì ì©í ê²ìŒë¡ ììí©ëë€. ì¬ì© 목íë ì격í íìì íŽëì€ ê³ìžµ 구조륌 ì ì§íë ê²ìŽêž° ë묞ì ëë€. ë°ëŒì ê·íì ì륌 íŽê²°íë €ë©Ž ë€ìì ìííììì€.
class C extends A {...}
var animal : Animal = new Snake();
animal.setA(new C());
// This will have undefined run-time behavior, as C will be interpreted as type B in Snake.setA
ë°ëŒì ìì (2.)ë ì€ì ë¡ ì¬ì ì í€ìëê° ì»ŽíìŒ ìê°ì ëì¹ ì ìë 믞ë¬í ìí©ì í¬ì°©í ì ìë ë°©ë²ì ëí íë¥í ë°ëªšì ëë€! :)
ê·žëŠ¬ê³ ë ìì 몚ë íìí ì ìë í¹ì ì ìŽ/ê³ êž ìë°ì€í¬ëŠœíž ìë늬ì€ìì ì íší ì ììì ë€ì ê°ì¡°í©ëë€. ìŽ ê²œì° ì¬ì©ìë override í€ìë륌 ìëµíêž°ë§ íë©Ž ë©ëë€.
ìŽê²ì ì ì©í ê²ì ëë€. ì°ëŠ¬ë íì¬ super ë©ìëì ëí ë믞 찞조륌 í¬íšíì¬ ìŽ ë¬žì 륌 íŽê²°í©ëë€.
class Snake extends Animal {
move(meters:number, height?:number):void {
super.move; // override fix
}
}
ê·žë¬ë ìŽê²ì ë ë²ì§ž 겜ì°ì ëíŽìë§ ë³Žíží©ëë€. ìíŒ ë©ìëì ìŽëŠìŽ ë³ê²œë©ëë€. ìëª ì ë³ê²œíŽë 컎íìŒ ì€ë¥ê° ë°ìíì§ ììµëë€. ê²ë€ê° ìŽê²ì ë¶ëª í íŽí¹ì ëë€.
ëí íì íŽëì€ ë©ìëì ìëª ì ìë Ʞ볞 ë° ì íì ë§€ê° ë³ìê° ì»ŽíìŒ ì€ë¥ë¥Œ ì ë°íŽìŒ íë€ê³ ìê°íì§ ììµëë€. ê·žê²ì ì íí ì ìì§ë§ JavaScriptì ê³ ì í ì ì°ì±ì ìë°°ë©ëë€.
@rwyborn
ì°ëŠ¬ë ê°ì íëì êž°ëíì§ ìë ê² ê°ìµëë€.
ëìŒí ìëª
ì 볎ì¥íêž° ìíŽ ìŽ ì¬ì ì í€ìë륌 ì¬ì©íë ë°ë©Ž ì ë ìœêž° ì¬ìŽ ìµì
ìŒë¡ ë ë§ìŽ ì¬ì©í©ëë€(ë°ëŒì ê°ì ë¡ ì¬ì©íëë¡ ì»ŽíìŒë¬ ìµì
ì ì¶ê°íëŒë ìì²).
ì¬ì€ ëŽê° ì ë§ë¡ êž°ëíë ê²ì TSê° ì못ë ì¬ì ì ë°©ë²ì ê°ì§íë€ë ê²ì
ëë€(ì¬ì ì륌 ì¬ì©íì§ ìëëŒë).
ìŒë°ì ìŒë¡:
class Snake extends Animal {
move(meters:number, height:number):void {}
}
ì€ì ë¡ Animal.move()(JS ëì)륌 ì¬ì ìíì§ë§ ížíëì§ ìë ì€ë¥ìŽë¯ë¡ ì€ë¥ê° ë°ìíŽìŒ í©ëë€(ëìŽë ì í ì¬íìŽ ìë ë°ë©Ž Animal "ì°žì¡°"ìì ížì¶íë©Ž ì ìëì§ ìì).
ì€ì ë¡ override륌 ì¬ì©íë©Ž ìŽ ë©ìëê° êž°ë³ž íŽëì€ì ì€ì ë¡ ì¡Žì¬íë€ë ì¬ì€ë§ (컎íìŒë¬ì ìíŽ) íìžë©ëë€.
@stephanedr , ëšìŒ ì¬ì©ìë¡ì ë§íë©Žì ì ë ê°ìžì ìŒë¡ íŽëì€ ê³ìžµ 구조 ëŽìì ì격í íìŽíì ìííë ê²ì ì¢ìíêž° ë묞ì 컎íìŒë¬ê° íì ìëª ì íìžíŽìŒ íë€ë ë° ëìí©ëë€(ìë°ì€í¬ëŠœížê° ê·žë ì§ ìëëŒë!!).
ê·žë¬ë ìŽ ëììŽ override í€ìë륌 íµíŽ ì í ì¬íìŽëŒê³ ì ìíë©Žì ê¶ê·¹ì ìŒë¡ javascriptë íììŽ ì§ì ëì§ ìììŒë¯ë¡ Ʞ볞ì ìŒë¡ ì격í ìëª ìŒì¹ë¥Œ ì ì©íë©Ž ìŒë¶ ìë° ì€í¬ëŠœíž ëììž íšíŽìŽ Typescriptìì ë ìŽì ííí ì ìë€ë ê²ì ìŒëì ëë €ê³ í©ëë€.
@rwyborn C++ 구íì ëíŽ ìžêžíŽì£Œì ì êž°ì©ëë€. ì íì ìŒë¡ ì¬êž° ì€êž° ì ì ìëíŽìŒ íë€ê³ ìê°íë ë°©ì곌 ì íí ìŒì¹íêž° ë묞ì ëë€. ê·žë¬ë override í€ìëì ì¬ì©ì ê°ì íë 컎íìŒë¬ íëê·žë ëŽ ì± ìì ì ëŽë €ê° ê²ì ëë€.
ìŽ í€ìëë ê°ë°ìê° ìí¬ë¥ž íìŽíì í ë 컎íìŒ ìê° ì€ë¥ë¥Œ íì©íëë°, ìŽê²ìŽ íì¬ íìì ì¬ì ìì ëíŽ ê°ì¥ ê±±ì ëë ë¶ë¶ì ëë€.
class Base {
protected commitState() : void {
}
}
class Implementation extends Base {
override protected comitState() : void { /// error - 'comitState' doesn't exist on base type
}
}
íì¬(1.4 êž°ì€) ìì Implementation
íŽëì€ë ì ë©ìë륌 ì ìžíê³ ê°ë°ìë ìœëê° ìëíì§ ìëë€ë ê²ì ìì찚늎 ëê¹ì§ íëª
íì§ ììµëë€.
ì ì ê²í ìì ë Œìëš.
ì°ëŠ¬ë ì¬êž°ìì ì¬ì© ì¬ë¡ë¥Œ íì€í ìŽíŽíê³ ììµëë€. 묞ì ë ìžìŽì ìŽ ëšê³ìì ì¶ê°íë©Ž ì ê±°íë ê²ë³Žë€ ë ë§ì íŒëìŽ ì¶ê°ëë€ë ê²ì
ëë€. 5ê° ë©ìëê° ìë íŽëì€(ê·ž ì€ 3ê°ë override
ë¡ íìëš)ë ë€ë¥ž 2ê°ê° ì¬ì ìëì§ _ìëëë€. ê·ž ì¡Žì¬ë¥Œ ì ë¹ííêž° ìíŽ ìì ìë ì€ì ë¡ ìžê³ë¥Œ ê·žë³Žë€ ë ê¹ëíê² ë¶í íŽìŒ í©ëë€.
ì§ì§ê±°ëŠ¬ë ì ì ì©ìíŽ ì£Œìžì. íì§ë§ ìì§í ë§íŽì, ê·íì 죌ì¥ì Ʞ볞ì ìŒë¡ 몚ë ê²ìŽ ê³µê°ëë ìžìŽì public
í€ìëì ì ì©ëì§ë§ abstract
ë° ì íì override
í€ìëë ê°ë°ìê° ë ìì íë€ê³ ëëŒê³ ì€ì륌 ì€ìŽê³ ìê°ì ë ëë¹íë ë° ëììŽ ë©ëë€.
ì¬ì ìë ì못 ì
ë ¥ë ì¬ì ì ë©ìë ìŽëŠìŽ ëª
ë°±í 컎íìŒ ìê° ë¬žì ê° ìëêž° ë묞ì ìžìŽìì ì€íì 믌ê°í ëª ì ëë ëšì ìë ìž¡ë©Ž ì€ íëì
ëë€. override
ì ìŽì ì ëª
ë°±í©ëë€. Ʞ볞 ë©ìëê° ì¡Žì¬íì§ ììŒë©Ž 컎íìŒ ìê° ì€ë¥ê° ë°ìíì¬ ì¬ì ìí ìë륌 ëª
ìí ì ìêž° ë묞ì
ëë€. 몚ëê° ì í ìì€í
ì íìí©ëë€. ì ì묎ë ìŽê²ì ìíì§ ìê² ìµëê¹?
@hdachev ì 100% ëìí©ëë€. @RyanCavanaugh ë ìžêží ìì ë¶ìŒì¹ë 컎íìŒ ìê° ê²ì¬ë¥Œ ë©ìë ì¬ì ìì ê°ì žì€ë í€ìëì ìŽì ì ìíŽ ìœê² ìëë©ëë€. ëë C++ê° typescriptì ëíŽ ì ìë ê²ê³Œ ëê°ì ë°©ììŒë¡ ì íì ì¬ì ì í€ìë륌 ì±ê³µì ìŒë¡ ì¬ì©íë€ë ì ì ë€ì ì§ì í©ëë€.
ë³µì¡í OO ížëŠ¬ê° ìë ëê·ëªš ìœë êž°ë°ìì ì¬ì ì ê²ì¬ê° ìŒë§ë ë§ì ì°šìŽë¥Œ ë§ëëì§ ì¶©ë¶í ê°ì¡°í ì ììµëë€.
ë§ì§ë§ìŒë¡ ì íì í€ìëì ë¶ìŒì¹ê° ì€ì ë¡ ë¬žì ê° ëë ê²œì° C# ì ê·Œ ë°©ìì ì¬ì©í ì ìë€ê³ ë§ë¶ììµëë€. ìŽë "new" ëë "override" í€ìëì íì ì¬ì©ì ëë€.
class Dervied extends Base {
new FuncA(newParam) {} // "new" says that I am implementing a new version of FuncA() with a different signature to the base class version
override FuncB() {} // "override" says that I am implementing exactly the same signature as the base class version
FuncC() {} // If FuncC exists in the base class then this is a compile error. I must either use the override keyword (I am matching the signature) or the new keyword (I am changing the signature)
}
ìŽê²ì public
ì ì ì¬íì§ ììµëë€. ìëíë©Ž ì ê·Œ íì ìê° ìë ìì±ì publicìŒë¡ ìë €ì ž ìêž° ë묞ì
ëë€. override
ê° ìë ë©ìëë ì¬ì ìëì§ ìë ê²ìŒë¡ _ìë €ì§ì§ ììµëë€_.
ë€ìì ì€ë²í€ëê° ê±°ì ììŽ ì¢ì ì€ë¥ ë©ìì§ë¥Œ ìì±íë ë°ìœë ìŽí°(TS1.5ìì ì ê³µ)륌 ì¬ì©íë ë°íì ê²ì¬ ì룚ì ì ëë€.
/* Put this in a helper library somewhere */
function override(container, key, other1) {
var baseType = Object.getPrototypeOf(container);
if(typeof baseType[key] !== 'function') {
throw new Error('Method ' + key + ' of ' + container.constructor.name + ' does not override any base class method');
}
}
/* User code */
class Base {
public baseMethod() {
console.log('Base says hello');
}
}
class Derived extends Base {
// Works
<strong i="9">@override</strong>
public baseMethod() {
console.log('Derived says hello');
}
// Causes exception
<strong i="10">@override</strong>
public notAnOverride() {
console.log('hello world');
}
}
ìŽ ìœë륌 ì€ííë©Ž ì€ë¥ê° ë°ìí©ëë€.
ì€ë¥: Derivedì notAnOverride ë©ìëë Ʞ볞 íŽëì€ ë©ìë륌 ì¬ì ìíì§ ììµëë€.
ìŽ ìœëë íŽëì€ ìŽêž°í ìê°ì ì€íëêž° ë묞ì íŽë¹ ë©ìëì í¹ì í ëšì í
ì€ížê° íìíì§ ììµëë€. ìœëê° ë¡ëëë ìŠì ì€ë¥ê° ë°ìí©ëë€. ëí íë¡ëì
ë°°í¬ë¥Œ íìžíì§ ìë "ë¹ ë¥ž" ë²ì ì override
륌 구ë
í ì ììµëë€.
@RyanCavanaugh ê·žëì ì°ëŠ¬ë Typescript 1.6ì ìê³ ë°ìœë ìŽí°ë ì¬ì í ì€íì ìž êž°ë¥ì ëë€. ì€ë²ëŒìŽë ìì ì ìí íŽí¹ìŒë¡ ëê·ëªš íë¡ëì ìœëë² ìŽì€ì ë°°í¬íê³ ì¶ì ê²ì ìëëë€.
ë ë€ë¥ž ê°ëìì ìëíìë©Ž, ìì€ì ëì ìë 몚ë ìžêž° ìë ì í ìžìŽë "ì¬ì ì" í€ìë륌 ì§ìí©ëë€. Swift, ActionScript, C#, C++ ë° F#ìŽ ììµëë€. ìŽ ëªšë ìžìŽë ìŽ ì€ë ëìì ì¬ì ìì ëíŽ ííí ì¬ìí 묞ì 륌 ê³µì íì§ë§ ì¬ì ìì ìŽì ìŽ ìŽë¬í ì¬ìí 묞ì 륌 íšì¬ ë¥ê°íë€ë ê²ì ìê³ ìë í° ê·žë£¹ìŽ ë¶ëª í ììµëë€.
ê·íì ë°ëê° ìì í ë¹ì©/ìŽìµì êž°ë°ìŒë¡ í©ëê¹? ëŽê° ì€ì ë¡ ì§ííê³ ìŽê²ì PRìì 구ííë€ë©Ž ê·žê²ìŽ ë°ìë€ì¬ì§ê¹ì?
ë¹ì©/ížìµì 묞ì ë§ì ìëëë€. RyanìŽ ì€ëª
íë¯ìŽ 묞ì ë ë©ìë륌 ì¬ì ìë¡ íìíë ê²ìŽ ë€ë¥ž ë©ìëê° ì¬ì ìê° _ìëëë€_ë ìë¯žê° ìëëŒë ê²ì
ëë€. ìë¯žê° ìë ì ìŒí ë°©ë²ì 몚ë ì¬ì ìê° override
í€ìëë¡ íìëìŽìŒ íë 겜ì°ì
ëë€.
@DanielRosenwasser ììì ì€ëª í ê²ì²ëŒ C++ìì override í€ìëë ì í ì¬íìŽì§ë§(Typescriptì ëíŽ ì ìë ëë¡) 몚ëê° ë¬žì ììŽ ì¬ì©íë©° ëê·ëªš ìœë êž°ë°ìì ë§€ì° ì ì©í©ëë€. ê²ë€ê° Typescriptììë ìë°ì€í¬ëŠœíž íšì ì€ë²ë¡ë© ë묞ì ì í ì¬íìŽ ëë ê²ìŽ ì€ì ë¡ ë§€ì° í©ëŠ¬ì ì ëë€.
class Base {
method(param: number): void { }
}
class DerivedA extends Base {
// I want to *exactly* implement method with the same signature
override method(param: number): void {}
}
class DerivedB extends Base {
// I want to implement method, but support an extended signature
method(param: number, extraParam: any): void {}
}
ì 첎 "ë€ë¥ž ë°©ë²ìŽ ì¬ì ìê° ìëì ììíì§ ìì" ìžìì êŽíŽìë "ë¹ê³µê°"ì ì íí ì ì¬í©ëë€. private í€ìë륌 ì¬ì©íì§ ìê³ ë ì 첎 ìœëë² ìŽì€ë¥Œ ìì±í ì ììµëë€. íŽë¹ ìœëë² ìŽì€ì ìŒë¶ ë³ìë ê°ìžì ìŒë¡ë§ ì¡ìžì€í ì ììŒë©° 몚ë ê²ìŽ 컎íìŒëê³ ì ëë¡ ìëí©ëë€. ê·žë¬ë "private"ë 컎íìŒë¬ìê² "ìëì, ëêµ°ê° ì¡ìžì€íë €ê³ íë©Ž 컎íìŒ ì€ë¥ê° ë°ìí©ëë€"ëŒê³ ìë €ì£Œë ë° ì¬ì©í ì ìë ëª ê°ì§ ì¶ê° 구묞 ì€íì ëë€. ê°ì ë°©ììŒë¡ "ì€ë²ë¡ë"ë 컎íìŒë¬ìê² "Ʞ볞 íŽëì€ ì ìžê³Œ ì íí ìŒì¹íꞰ륌 ìí©ëë€. 컎íìŒíì§ ììŒë©Ž ì€ë¥ê° ë°ìí©ëë€"ëŒê³ ìë €ì£Œë ì¶ê° 구묞 ì€íì ëë€.
ì¬ë¬ë¶ìŽ "ì¬ì ì"ì 묞ìì íŽìì ì§ì°©íê³ ìë€ê³ ìê°í©ëë€. ì€ì ë¡ ë§í¬ì íë ê²ì "exactly_match_signature_of_superclass_method"ìŽì§ë§ ìœêž°ê° ìœì§ ììµëë€. :)
class DerivedA extends Base {
exactly_match_signature_of_superclass_method method(param: number): void {}
}
ì ë ì€ë²ëŒìŽë í€ìë륌 ì¬ì©í ì ìê² íê³ ì€ë²ëŒìŽëë¡ íìë ë©ìëê° êž°ë³ž íŽëì€ì ìê±°ë ë€ë¥ž ìëª ìŽ ìë ê²œì° ì»ŽíìŒë¬ìì ì€ë¥ë¥Œ ìì±íëë¡ íê³ ì¶ìµëë€. ê°ë ì±ê³Œ 늬í©í ë§ì ëììŽ ë ê²ì ëë€.
+1, ë구ë íšì¬ ì¢ìì§ ê²ì
ëë€. ëŽ ì ì€ ìŒìŽì€ë ë°ìì ì¬ì©íê³ ììµëë€. ComponentLifecycle
ë©ìë륌 ì¬ì©í ëë§ë€ ì ì륌 íìžíŽìŒ í©ëë€.
``` C#
ìží°íìŽì€ ComponentLifecycle
{
componentWillMount?(): 묎íš;
componentDidMount?(): 묎íš;
componentWillReceiveProps?(nextProps: P, nextContext: any): 묎íš;
shouldComponentUpdate?(nextProps: P, nextState: S, nextContext: any): ë¶ìž;
componentWillUpdate?(nextProps: P, nextState: S, nextContext: any): 묎íš;
componentDidUpdate?(prevProps: P, prevState: S, prevContext: any): 묎íš;
componentWillUnmount?(): 묎íš;
}
With override, or other equivalent solution,you'll get a nice auto-completion.
One problem however is that I will need to override interface methods...
``` C#
export default class MyControlextends React.Component<{},[}> {
override /*I want intellisense here*/ componentWillUpdate(nextProps, nextState, nextContext): void {
}
}
@olmobrutall ì í€ìë륌 ìžìŽì ì¶ê°íë ê²ìŽ ìëëŒ "ìží°íìŽì€ 구í"곌 ê°ì 늬í©í ë§ì ì ê³µíê±°ë ë ëì ìì±ì ì ê³µíë ìžìŽ ìë¹ì€ë¡ ì¬ì© ì¬ë¡ë¥Œ ë ì íŽê²°í ê² ê°ìµëë€.
죌ì륌 ì°ë§íê² íì§ ë§ììì€. ìžìŽ ìë¹ì€ êž°ë¥ì ëê·ëªš ìœë êž°ë°ìì ìží°íìŽì€ ê³ìžµ 구조륌 ì ì§ êŽëŠ¬íë ìì ë¶ë¶ìŒ ë¿ì ëë€. ëšì°ìœ ê°ì¥ í° ì¹ëŠ¬ë ê³ìžµ 구조 ìŽëê°ìì íŽëì€ê° ìŒì¹íì§ ìì ë 컎íìŒ ìê° ì€ë¥ê° ì€ì ë¡ ë°ìíë ê²ì ëë€. ìŽê²ìŽ C++ìì ì íì ì¬ì ì í€ìë륌 ì¶ê°í ìŽì ì ëë€(ë¹ ì£Œì ë³ê²œ ì¬í). ìŽê²ìŽ Typescriptê° ëìŒí ìì ì ìííŽìŒ íë ìŽì ì ëë€.
C++ ì¬ì ìì ëí Microsoftì 묞ìë 몚ë ê²ì ë©ì§ê² ììœí©ëë€( https://msdn.microsoft.com/en-us/library/jj678987.aspx ).
ì€ë²ëŒìŽë륌 ì¬ì©íë©Ž ìœëìì ìëíì§ ìì ìì ëìì ë°©ì§í ì ììµëë€. ë€ì ìì ë ì¬ì ì륌 ì¬ì©íì§ ìê³ íì íŽëì€ì ë©€ë² íšì ëììŽ ìëëì§ ììì ì ìë 겜ì°ë¥Œ 볎ì¬ì€ëë€. 컎íìŒë¬ë ìŽ ìœëì ëíŽ ì€ë¥ë¥Œ ë°ììí€ì§ ììµëë€.
...
ì¬ì ì륌 ì¬ì©íë©Ž 컎íìŒë¬ìì ì ë©€ë² íšì륌 ìëìŒë¡ ìì±íë ëì ì€ë¥ë¥Œ ìì±í©ëë€.
ëšì°ìœ ê°ì¥ í° ì¹ëŠ¬ë ê³ìžµ 구조 ìŽëê°ìì íŽëì€ê° ìŒì¹íì§ ìì ë 컎íìŒ ìê° ì€ë¥ê° ì€ì ë¡ ë°ìíë ê²ì ëë€.
ëìíŽìŒ í©ëë€. ì°ëŠ¬ íìì ë°ìíë í ê°ì§ íšì ì ì¬ëë€ìŽ ì€ì ë¡ë ìœê° ì못 ì ë ¥íê±°ë ì못ë íŽëì€ë¥Œ íì¥íëë°ë ë©ìë륌 ì¬ì ìíë€ê³ ìê°íë€ë ê²ì ëë€.
ë§ì íë¡ì ížìì ìì í ë Ʞ볞 ëŒìŽëžë¬ëŠ¬ì ìží°íìŽì€ ë³ê²œì TypeScriptì ê°ì ìì ê° ìë ìžìŽìì íŽìŒ íë ê²ë³Žë€ ìŽë µìµëë€.
ì°ëŠ¬ë íë¥í ê²ë€ì ë§ìŽ ê°ì§ê³ ìì§ë§, ìŽì ê°ì ìŽìí ê²ë€ìŽ ìê³ íŽëì€ ìì€ì const ìì±ìŽ ììµëë€.
@RyanCavanaughë ì¬ì€ìŽì§ë§ í€ìëê° ììŒë©Ž ì¬ì ì륌 ìì±í í ìžìŽ ìë¹ì€ê° ížëŠ¬ê±°ë ì ììµëë€.
ìží°íìŽì€ 구íì ëíŽ ìží°íìŽì€ì ìë ëë¶ë¶ì ë©ìëë ì í ì¬íìŽë©° ì 첎 íší€ì§ê° ìëëŒ íìí ëª ê°ì§ë§ ì¬ì ìíŽìŒ í©ëë€. íìžëìŽ ìë ëí ìì륌 ìŽ ìë ìì§ë§ ì¬ì í...
íì¬ ëŽ ë¬žì ë ë©ìëì ìŽëŠì ì°Ÿë ê²ìŽì§ë§, 믞ëìë ëêµ°ê°ê° Ʞ볞 ë©ìëì ìŽëŠì ë°êŸžê±°ë ìëª ì ë³ê²œí ê²œì° ì»ŽíìŒ íì ì€ë¥ë¡ ì늌ì ë°ë ê²ìŽ ì¢ìµëë€.
ì¬ì ì륌 ìì±íì§ ìì ë ê²œê³ ë¥Œ ì¶ê°íë ê²ë§ìŒë¡ ë¶ìŒì¹ê° íŽê²°ëì§ ììµëê¹? ëë typescriptê° ìê°ìŽ ëë ëê¹ì§ ì못ë ê²°ì ì ì ì§íë ëì ìê³ í©ëŠ¬ì ìž ì£Œì ë³ê²œ ì¬íì ì¶ê°íë ê²ìŽ ì³ì ìŒìŽëŒê³ ìê°í©ëë€.
ìŽë¡ë ìŽë¯ž ììŽì ë©ì§ 컀íìŽ ë ê±°ìì :)
'ì¬ì ì' ì§ì ìì íìì±ë ëêŒìµëë€. ì€ëí íë¡ì ížììë ìŽ êž°ë¥ìŽ íìì ìŽë©° Typescript íìŽ ìŽ ì ìì ê±°ë¶íêž°ë¡ í ê²°ì ì ì¬ê³ íꞰ륌 ë°ëëë€.
êŽì¬ ìë ì¬ëì ìíŽ ìì Ryanì ì ì곌 ì ì¬íì§ë§ 컎íìŒ íìì íìžëë ë°ìœë ìŽí°ë¥Œ ì¬ì©íì¬ override í€ìëì ëìŒí êž°ë¥ì ì ê³µíë ì¬ì©ì ì§ì tslint ê·ì¹ì ìì±íìµëë€. 곧 ê³µê°í ìì ìŽë©° ì¬ì© ê°ë¥í ê²œì° ë€ì ê²ìíê² ìµëë€.
'override' í€ìëì íìì±ë ê°íê² ëêŒìµëë€.
ì 겜ì°ìë Ʞ볞 íŽëì€ìì ìŒë¶ ë©ìë ìŽëŠì ë³ê²œíê³ ì¬ì ìíë ë©ìëì ìŽëŠ ì€ ìŒë¶ë¥Œ ë°êŸžë ê²ì ìììµëë€. ë¬Œë¡ ìŽê²ì ìŒë¶ ë²ê·žë¥Œ ì ë°í©ëë€.
ê·žë¬ë ìŽë¬í êž°ë¥ìŽ ìë€ë©Ž ìŽë¬í íŽëì€ ë©ìë륌 ìœê² ì°Ÿì ì ììµëë€.
@RyanCavanaughê° ìžêžíë¯ìŽ ìŽ í€ìëê° ì íì í€ìëìž ê²œì° ìŽ êž°ë¥ìŽ íŒëì ì€ëë€. ê·žë ë€ë©Ž ìŽ êž°ë¥ì íì±ííêž° ìíŽ tscìì íë귞륌 ë§ëë ê²ì ìŽë»ìµëê¹?
ìŽ êž°ë¥ì ë€ì ê²í íììì€....
ì ìê² override í€ìëê° ì ì©íë €ë©Ž C#ììì ê°ìŽ ì ì©íŽìŒ í©ëë€. C#ìì Ʞ볞 ë©ìëì ìëª ì ì¬ì ìíë ë©ìë륌 ì§ì íë ê²œì° _ë°ëì_ ì¬ì ì ëë ì ë ìŽëžì ì§ì íŽìŒ í©ëë€.
C++ë ë묎 ë§ì í€ìë륌 ì í ì¬íìŒë¡ ë§ë€ìŽ _ìŒêŽì±_ì ë°°ì íêž° ë묞ì ìŽë€ ê³³ììë C#ì ë¹íŽ ì±ê°ìê³ ìŽë±í©ëë€. ì륌 ë€ìŽ, ê°ì ë©ìë륌 ì€ë²ë¡ëíë ê²œì° ì€ë²ë¡ëë ë©ìëë ê°ì ëë ê°ììŒë¡ íìëì§ ìì ì ììµëë€. ìŽë 쪜ìŽë ê°ììŽ ë©ëë€. ëë íìê° ìœë륌 ìœë ë€ë¥ž ê°ë°ììê² ëììŽ ëêž° ë묞ì ì ížíì§ë§ 컎íìŒë¬ê° ê°ì ë¡ ìœì íëë¡ í ì ììµëë€. ìŠ, ì°ëŠ¬ì ìœë êž°ë°ìë ìì¬í ì¬ì§ ììŽ ê°ì í€ìëê° ììŽìŒ í ìì¹ì ëëœë ê°ì í€ìëê° ìì ê²ì ëë€. override í€ìëë ì ì¬íê² ì í ì¬íì ëë€. ì ìê°ìë ë ë€ êœì ëë€. ì¬êž°ì ê°ê³Œëë ì ì ìœëê° ë¬žìì ìí ì í ì ìê³ "ì¬ì©íê±°ë ëšê²šëë" ì ê·Œ ë°©ìë³Žë€ í€ìëì ëí íìì±ì ì ì©íì¬ ì ì§ êŽëŠ¬ì±ì í¥ììí¬ ì ìë€ë ê²ì ëë€. C++ì "throw" í€ìëë ë¹ì·í©ëë€.
TypeScriptìì ìì 목ì ì ë¬ì±íêž° ìíŽ ì»ŽíìŒë¬ë ìŽ ì격í ëìì "íì±í"íë íëê·žê° íìí©ëë€.
Ʞ볞 ë° ì¬ì ìì êž°ë¥ ìëª ì êŽí í ëìŒíŽìŒ í©ëë€. ê·žë¬ë 컎íìŒ ìê° ê²ì¬ë¥Œ ìííêž° ìíŽ ë°í ì íì ì¬ììì ê³µë¶ì°ì íì©íë ê²ìŽ ë°ëì§í ê²ì ëë€.
ì ë AS3ìì TSë¡ ì€ê³ ììŒë¯ë¡ ì¬êž°ììë override
í€ìëì í í륌 ëì§ ê²ì
ëë€. 죌ìŽì§ ìœëë² ìŽì€ë¥Œ ì²ì ì íë ê°ë°ììê² override
륌 볎ë ê²ì (ìì) íŽëì€ìì ë¬Žìš ìŒìŽ ìŒìŽëê³ ìëì§ì ëí í° ëšìì
ëë€. ê·žë° í€ìëê° ê°ì¹ë¥Œ ëíŽì£Œë ê² ê°ìì. ëë ê·žê²ì íìë¡ ë§ë€êž°ë¡ ì ííì§ë§ ê·žê²ìŽ ìŽë»ê² 죌ì ë³ê²œ ì¬íìŽ ë ê²ìŽë©° ì í ì¬íìŽìŽìŒ íëì§ ì ì ììµëë€. ì íì ìž override
ì Ʞ볞 public
í€ìë ì¬ìŽì ì°šìŽì 믌ê°íꞎ íì§ë§ ë¶ê³Œíë 몚ížì±ìë 묞ì ê° ìë€ê³ ìê°í©ëë€.
몚ë +1 ì¬ì©ì륌 ìíŽ -- ìì íìë ë°ìœë ìŽí° ì룚ì ì ëíŽ ì¶©ë¶íì§ ìì ì ì ëíŽ ìŽìŒêž°í ì ììµëê¹?
ëìê² ê·žê²ì ìžìŽ ì첎ì ìì±ìŽ ìëëŒ ìžê³µ 구조묌ì²ëŒ ë껎ì§ë€. ê·žëŠ¬ê³ ê·žê²ìŽ ìëë ê²ìŽëŒê³ ìê°í©ëë€. ê·žê²ìŽ ë°ë¡ ê·žê²ìŽêž° ë묞ì ëë€. ì ìê°ìë ê°ë°ì(ìŽìšë ì ìê²)ê° ëªšë² ì¬ë¡ê° ìëëŒ ìŒìì ìŽëŒë ë©ìì§ë¥Œ 볎ë ëë€.
ë¶ëª
í 몚ë ìžìŽìë ê³ ì í íšë¬ë€ììŽ ììŒë©° TypeScript륌 ì²ì ì íêž° ë묞ì íšë¬ë€ì ì íìŽ ë늜ëë€. override
ë ì¬ë¬ ê°ì§ ìŽì ë¡ ëìê² ëªšë² ì¬ë¡ì²ëŒ ë껎ì§ëë€. ê°ë ¥í íìì koolaid륌 ìì í ìŒìŒ°ê³ ì€ë¥ ìë ìœëì ìœë ìŽíŽ 몚ëì ëí ìŽì ìŽ ë¹ì©(í€ ì
ë ¥ ë° íìµ ê³¡ì ìž¡ë©Žìì)ë³Žë€ íšì¬ ë í¬ë€ê³ 믿Ʞ ë묞ì TypeScriptë¡ ì ííê³ ììµëë€. override
ë ê·ž íŒìŠì ë§€ì° ì€ìí ë¶ë¶ìŽë©° ì¬ì ì ë©ìëì ìí ì ëí ëª ê°ì§ ë§€ì° ì€ìí ì 볎륌 ì ë¬í©ëë€.
ëìê² ê·žê²ì IDEì ížëŠ¬ì±ë³Žë€ë ì ì íê² ì§ìë ë ë¶ìží ì ììŽ êµì¥íì§ë§ ìŽ ìžìŽë¥Œ 구ì¶í ìì¹ì ëíŽ ëŽê° 믿ë ê²ì 충족ìí€ë ë° ë ì€ì ì ë¡ëë€.
@RyanCavanaugh ëŽê° 볞 ëª ê°ì§ 묞ì :
ê·žë¬ë 컎íìŒë¬ë ìŽë¯ž ìžì 목ë¡ê³Œ ë°í ì íì íìžíê³ ììµëë€. ê·žëŠ¬ê³ override
ê° ìŒêž í€ìëë¡ ì¡Žì¬íëëŒë ìëª
ëìŒì±ì ëí ìë¡ìŽ ê·ì¹ì ìííì§ ìì ê²ìŽëŒê³ ìê°í©ëë€.
ê·žëŠ¬ê³ overrideê° ìŒêž í€ìëë¡ ì¡Žì¬íëëŒë ìëª ëìŒì±ì ëí ìë¡ìŽ ê·ì¹ì ìííì§ ìì ê²ìŽëŒê³ ìê°í©ëë€.
@RyanCavanaugh ê·žë ë€ë©Ž í€ìëì ìëì ëíŽ ë€ë¥ž íìŽì§ì ìì ì ìë€ê³ ìê°í©ëë€. ìì ì ìëª ëìŒì±ì _ìíë_ 겜ì°ë¥Œ ìí ê²ì ëë€. ìŽê²ì ìží°íìŽì€ ë©ìëì ê³ìœì ì ìíë Ʞ볞 íŽëì€ì ìë ê¹ê³ ë³µì¡í ê³ìžµ êµ¬ì¡°ê° ìê³ ê³ìžµ 구조ì 몚ë íŽëì€ê° íŽë¹ ìëª ê³Œ _ì íí_ ìŒì¹íŽìŒ íë ëììž íšíŽì ìí ê²ì ëë€. 몚ë íì íŽëì€ì ìŽë¬í ë©ìëì override í€ìë륌 ì¶ê°íë©Ž Ʞ볞 íŽëì€ì ì€ì ë ê³ìœìì ìëª ìŽ ë€ë¥ž 몚ë 겜ì°ì ëíŽ ê²œê³ ë¥Œ ë°ìµëë€.
ëŽê° ê³ì ë§íì§ë§ ìŽê²ì ëíŽí ì¬ì© ì¬ë¡ê° ìëëë€. ëê·ëªš ìœë êž°ë°(ì: ìë°± ëë ìì² ê°ì íŽëì€ í¬íš)ìì ìì í ë ìŽê²ì _맀ìŒ_ ë°ìí©ëë€. ìŠ, ëêµ°ê°ê° Ʞ볞 íŽëì€ì ìëª ì ë³ê²œíŽìŒ íê³ (ê³ìœ ìì ) 컎íìŒë¬ê° ì¬ì©ììê² ê²œê³ ë¥Œ 죌Ʞ륌 ìí©ëë€. ë ìŽì ìŒì¹íì§ ìë ì 첎 ê³ìžµ 구조ì ì¬ë¡.
컎íìŒë¬ë ìŽë¯ž ë¶ë² ì¬ì ìì ëíŽ ê²œê³ í©ëë€. 묞ì
íì¬ êµ¬íì ì¬ì ì륌 ì ìží ë ìëê° ë¶ì¡±í©ëë€.
ë°©ë².
ììì ìžêží ë°ìœë ìŽí°ë ìžìŽì ìŽêžëë ê² ê°ìµëë€.
ë¬ì±íêž° ìíŽ ë
žë ¥íê³ ììµëë€. ì ëí ë°íì ë¹ì©ìŽ ë°ìíì§ ìììŒ í©ëë€.
컎íìŒ ìê°ì ì²ëŠ¬í ì ìì§ë§ ë¹ì©ì ì ìµëë€.
ì°ëŠ¬ë í íì ììŽ ê°ë¥í í ë§ì ê²ì ì¡ìëŽê³ ì í©ëë€.
ìœë륌 ì€ííì¬ ììëŽììì€.
ë°ìœë ìŽí°ë¥Œ ì¬ì©íê³ ì¬ì©ì ì ì tslint륌 ì¬ì©ì ì ìíë ê²ìŽ ê°ë¥í©ëë€.
íì§ë§ íŽë§ ìíê³ì 컀뮀ëí°ì ë ì¢ì ê²ì
ëë€.
ê³µì í€ìëê° ìë ìžìŽ.
ì í ì¬íìŽ íëì ì ê·Œ ë°©ììŽëŒê³ ìê°íì§ë§ ìŒë¶ C++ 컎íìŒë¬ì ë§ì°¬ê°ì§ë¡
ì¬ì©ì ìííëë¡ ì€ì í ì ìë íëê·žê° ììµëë€(ì: ì ì ì¬ì ì,
ë¶ìŒì¹-ëëœ-ì¬ì ì). ìŽê²ì íŒíë ê°ì¥ ì¢ì ë°©ë²ìŒë¡ ë³ŽìŒ ê²ì
ëë€.
죌ì ë³ê²œ ì¬í ë° ì¶ê°ëë ë€ë¥ž ìë¡ìŽ êž°ë¥ê³Œ ìŒì¹íë ê²ìŒë¡ 볎ì
ëë€.
ìµê·Œìë nullable ì í ë° ë°ìœë ìŽí°ì ê°ì
2016ë 3ì 23ìŒ ìììŒ 21:31ì Rowan Wyborn [email protected] ìì ë€ì곌 ê°ìŽ ìŒìµëë€.
ì¬ì ìê° ìŒêž í€ìëë¡ ì¡Žì¬íëëŒë
ìëª ëìŒì±ì ëí ëª ê°ì§ ìë¡ìŽ ê·ì¹ì ìííì§ ììµëë€.@RyanCavanaugh https://github.com/RyanCavanaugh ê·žë ë€ë©Ž ëë ë¹ì ìŽ í ì ìë€ê³ ìê°í©ëë€
í€ìëì ìëì ëíŽ ë€ë¥ž íìŽì§ì ììŽìŒ í©ëë€. ì ì 첎 ìì
ìëª ëìŒì±ì _ìíë_ 겜ì°ë¥Œ ìí ê²ì ëë€. ìŽ
ê¹ê³ ë³µì¡í ê³ìžµ êµ¬ì¡°ê° ìë ëììž íšíŽì ìí ê²ì ëë€.
ìží°íìŽì€ ë©ìëì ê³ìœì ì ìíë Ʞ볞 íŽëì€ì 몚ë
ê³ìžµ 구조ì íŽëì€ë íŽë¹ ìëª ê³Œ _ì íí_ ìŒì¹íŽìŒ í©ëë€. ì¶ê°íì¬
몚ë íì íŽëì€ìì ìŽë¬í ë©ìëì ëí override í€ìëë ë€ì곌 ê°ìµëë€.
ìëª ìŽ ëª ìë ê³ìœê³Œ ë€ë¥ž ê²œì° ê²œê³
Ʞ볞 íŽëì€ìì.ëŽê° ê³ì ë§íì§ë§ ìŽê²ì ëíŽí ì¬ì© ì¬ë¡ê° ìëëë€. ìì í ë
í° ìœë êž°ë°(ì: ìë°± ëë ìì² ê°ì íŽëì€ í¬íš) ìŽê²ì _everyì ëë€.
day_ ë°ì, ìŠ ëêµ°ê°ê° Ʞ볞 ìëª ì ë³ê²œíŽìŒ í©ëë€.
íŽëì€(ê³ìœ ìì )ìŽê³ 컎íìŒë¬ê° ë€ì ì¬íì ëíŽ ê²œê³ íꞰ륌 ìí©ëë€.
ë ìŽì ìŒì¹íì§ ìë ì 첎 ê³ìžµ 구조ì ì¬ë¡.â
ìŽ ì€ë ëì ê°ì íêž° ë묞ì ìŽ ë©ìì§ë¥Œ ë°ê³ ììµëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHubìì íìžíìžì.
https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -200551774
@kungfusheep fwiw 컎íìŒë¬ë ì ìžë 맀ê°ë³ì ê°ì ì§ì ì ìž ì¶©ëìŽ ìë í¹ì íŽëì€ì ë¶ë² ì¬ì ìë§ í¬ì°©í©ëë€. 맀ê°ë³ìì ì¶ê° ëë ì 거륌 í¬ì°©íì§ _not_ íì§ ììŒë©° ë°í ì í ë³ê²œì í¬ì°©íì§ë ììµëë€. ìŽë¬í ì¶ê° ê²ì¬ë ì¬ì ì í€ìëê° ìŒë ê²ì ëë€.
ì¬ì ì íšìì 맀ê°ë³ì륌 _add_íë©Ž 컎íìŒë¬ìì ì¬ë°ë¥Žê² ê²œê³ í©ëë€.
ê·žë¬ë 맀ê°ë³ì륌 ì ê±°íë ê²ì _ìì í ì íší©ëë€_:
class BaseEventHandler {
handleEvent(e: EventArgs, timestamp: number) { }
}
class DerivedEventHandler extends BaseEventHandler {
handleEvent(e: EventArgs) {
// I don't need timestamp, it's OK
}
}
ë°í ì íì ë³ê²œíë ê²ë _ìì í ì íší©ëë€_:
class Base {
specialClone(): Base { ... }
}
class Derived extends Base {
specialClone(): Derived { ... }
}
@RyanCavanaugh ì, ê·žë€ì ì격í ìžìŽ êŽì ìì ì íšíì§ë§ ìŽê²ìŽ ì ê° ìì "ê³ìœ"ìŽëŒë ì©ìŽë¥Œ ì¬ì©íêž° ììí ìŽì ì ëë€. Ʞ볞 íŽëì€ê° í¹ì ìëª ì ë°°ì¹íë ê²œì° ì¬ì ì륌 ì¬ì©í ë íì íŽëì€ê° íŽë¹ ìëª ì ì격íê² ë°ë¥Žëë¡ íê³ ì¶ìµëë€. Ʞ볞 íŽëì€ê° ì¶ê° 맀ê°ë³ì륌 ì¶ê°íê±°ë ë°í ì íì ë³ê²œíë ê²œì° ìë ìì±ë ê³ìœìŽ ìŽì ìŽë€ ììŒë¡ë ë³ê²œëììŒë¯ë¡ ë ìŽì ìŒì¹íì§ ìë ìœë êž°ë°ì 몚ë ì§ì ì ìê³ ì¶ìµëë€.
Ʞ볞 ë©ìëì ìœê° ë€ë¥ž ììŽìŽ ìë í° íŽëì€ ê³ìžµ 구조륌 ê°ë ììŽëìŽë(ìžìŽ êŽì ìì ì íšíëëŒë) ì 몜ì ë¶ë¬ìŒìŒí€ê³ íìŽíì€í¬ëŠœížê° ë±ì¥íêž° ì ì ëì ìë ìë°ì€í¬ëŠœížë¡ ëìê°ëë€. :)
ì í ì¬íìŽ í€ìëì 죌ì 묞ì ìž ê²œì° êž°ë³ž íŽëì€ ë©ìëê° abstract
ë¡ ì ìë ë ì í ì¬íì íìë¡ ì§ì íì§ ìë ìŽì ë 묎ìì
ëê¹? ìŽë° ììŒë¡ íšíŽì ì격íê² ì ì©íë €ë©Ž ì¶ì Ʞ볞 íŽëì€ë¥Œ ì¶ê°íêž°ë§ íë©Ž ë©ëë€. ìœë ììì ë°©ì§íêž° ìíŽ ì»ŽíìŒë¬ ì€ìì¹ë ê²ì¬ë¥Œ ë¹íì±íí ì ììµëë€.
ì°ëŠ¬ë ì§êž ë ê°ì§ ë€ë¥ž êž°ëì¹ì ëíŽ ìŽìŒêž°íê³ ìë ê² ê°ìµëë€. ëëœë ì¬ì ì/ë¶ë² ì¬ì ì ìí©ìŽ ìê³ ëª ìì ìëª ìí©ìŽ ììµëë€. ì ìê° ìŽ í€ìëìì êž°ëí ì ìë ì ë ìµìê°ìŽëŒë ë° ëªšë ëìí ì ììµëê¹?
ìží°íìŽì€ì ê°ìŽ íì¬ ëª ìì ë©ìë ìëª ì ì ì©íë ë€ë¥ž ë°©ë²ìŽ ìêž° ë묞ì ìŽ ë§ì íë ê²ë¿ì ëë€. íì§ë§ íì¬ë¡ìë ì¬ì ìí ìë륌 ëª ìì ìŒë¡ ì€ëª í ë°©ë²ìŽ ììµëë€.
ì¢ìµëë€. ì¬ì ìë ë©ìëì ëª ìì ìëª ì ì ì©í ë°©ë²ì ìì§ë§ 컎íìŒë¬ìì ìëª ë³ê²œìŽ ìµìí 'ìì 'íëë¡ ê°ì íë ê²œì° íŽë¹ 묞ì ì ëí ì룚ì ì ëíŽ ë³ëì ëíê° ìë ê²ì²ëŒ 볎ì ëë€.
ë€ ëìíìµëë€. ëŽê° ì ííŽìŒ íë€ë©Ž, ëëœë ì¬ì ì/ë¶ë² ì¬ì ì ìí©ìŽ íŽê²°íŽìŒ í ë ì€ìí 묞ì ì ëë€.
ëë íí°ì ì¡°êž ëŠììµëë€ ... Typescriptì ìì ì ë°íììŽ ìëëŒ ì»ŽíìŒ íìì ê·ì¹ì ì ì©íë ê²ì
ëë€. ê·žë ì§ ììŒë©Ž ì°ëŠ¬ 몚ë ìŒë° Javascript륌 ì¬ì©íê² ë ê²ì
ëë€. ëí ë§ì ìžìŽìì íì€ ìì
ì ìííêž° ìíŽ íµ/íŽë¬ì§ë¥Œ ì¬ì©íë ê²ìŽ ìœê° ìŽìí©ëë€.
Typescriptì override
í€ìëê° ììŽìŒ í©ëê¹? ëë íì€í ê·žë ê² ë¯¿ìµëë€. íìëŒê³ íŽìŒ í ê¹ì? ížíì±ì ìíŽ ì»ŽíìŒë¬ ìžìë¡ ëìì ì§ì í ì ìë€ê³ ë§íê³ ì¶ìµëë€. ì íí ìëª
ì ì ì©íŽìŒ í©ëê¹? ìŽê²ì ë³ëì ë
Œìê° ëìŽìŒ íë€ê³ ìê°í©ëë€ë§, ì§êžê¹ì§ë íì¬ì íëì 묞ì ê° ìììµëë€.
ìŽê²ì ë«ë ìë ìŽì ë ì¬ì ìë 몚ë ë©ìëì override
ì§ì ìê° íìíë€ë 죌ì ë³ê²œ ì¬íì ëì
í ì ìêž° ë묞ì override
ë¡ íìëì§ ìì ë©ìëë ì¬ì€ì 묎ìë©ëë€.
컎íìŒë¬ ìµì
ì ì¬ì©íê±°ë íŽëì€ì override
ë¡ íìë _ì ìŽë íëì_ ë©ìëê° ìë ê²œì° ìŽë¥Œ ì ì©íì§ ìë ìŽì ë 묎ìì
ëê¹? ì¬ì ìëë 몚ë ë©ìëë ê·žëë¡ íìëìŽìŒ í©ëë€. ê·žë ì§ ììŒë©Ž ì€ë¥ì
ëë€.
ê³µì€ì ë ìë ëì ìŽê²ì ë€ì ìŽ ê°ì¹ê° ììµëê¹?
2016ë 4ì 8ìŒ êžììŒ 14:38 Peter Palotas [email protected] ì ë€ì곌 ê°ìŽ ìŒìµëë€.
ìŽê²ì ë«ë ìë ìŽì ë ì°ëŠ¬ê° ìê° í ììë ê² ê°ìµëë€
ì¬ì ìë 몚ë ë©ìëì ì¬ì ìê° íìí 죌ì ë³ê²œ ì¬í
ë¡ íìëì§ ìì ë©ìë ë묞ì íŒëì ìŒìŒí¬ ì ìë ì§ì ì
'ì¬ì ì'ë ì€ì ë¡ ì¬ì ìë ì ììµëë€.컎íìŒë¬ ìµì ë°/ëë ìë ê²œì° ê°ì ë¡ ì ì©íì§ ìë ìŽì
íŽëì€ìì ì¬ì ìë¡ íìë ìµì 'íëì' ë©ìë, ë€ììŒë¡ ì§ì ë 몚ë ë©ìë
ì¬ì ìë ê·žë ê² íìëìŽìŒ í©ëë€. ê·žë ì§ ììŒë©Ž ì€ë¥ì ëê¹?â
ë¹ì ìŽ ìžêžëìêž° ë묞ì ìŽê²ì ë°ë ê²ì ëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHubìì íìžíìžì.
https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -207434898
ë€ì ìŽìŽì£Œìžì! ëë 컎íìŒë¬ ìµì ì ë§ì¡±í ê²ì ëë€.
ë€ - ë€ì ìŽìŽì£Œìžì
ìŽê²ì ë€ì ìŽìŽëŒ!
ES7ì ëìŒí ë°©ë²ì ê°ì§ ì¬ë¬ ë©ìë륌 ì¬ì ì/ì€ë²ë¡ë©í íìê° ììµëë€.
ìŽëŠ?
2016ë
4ì 8ìŒ ì€ì 10ì 56ë¶ì "Aram Taieb" [email protected] ìŽ ìì±íìµëë€.
ë€, ë€ì ìŽìŽì£Œìžì!
â
ìŽ ì€ë ëì ê°ì íêž° ë묞ì ìŽ ë©ìì§ë¥Œ ë°ê³ ììµëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHubìì íìžíìžì.
https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -207466464
+1 - ëìê² ìŽê²ì ìŒìì ìž TypeScript ê°ë°ìì ì í ìì ì±ì ê°ì¥ í° ê²©ì°šì ëë€.
"componentDidMount"ì ê°ì React ìëª ì£Œêž° ë©ìë륌 구íí ëë§ë€ êŽë š ë°ì 묞ì íìŽì§ë¥Œ ê²ìíê³ ë©ìë ìŽëŠì ë³µì¬/ë¶ì¬ë£êž°íì¬ ì€íê° ìëì§ íìží©ëë€. ì€íë¡ ìží ë²ê·žë ê°ì ì ìŽê³ 믞ë¬íë©° ì¶ì íë ë° íšì¬ ë ì€ë 걞늎 ì ìì§ë§ 20ìŽê° 걞늬Ʞ ë묞ì ìŽ ìì ì ìíí©ëë€.
5ê° ë©ìëê° ìë íŽëì€(ê·ž ì€ 3ê°ë ì¬ì ìë¡ íìëš)ë ë€ë¥ž 2ê°ê° ì¬ì ìëì§ ììì ì믞íì§ ììµëë€. ê·ž ì¡Žì¬ë¥Œ ì ë¹ííêž° ìíŽ ìì ìë ì€ì ë¡ ìžê³ë¥Œ ê·žë³Žë€ ë ê¹ëíê² ë¶í íŽìŒ í©ëë€.
ìŽê²ìŽ 죌ì êŽì¬ì¬ìž ê²œì° í€ìë check_override
륌 ížì¶íì¬ ê²ì¬ë¥Œ 묎ìíëë¡ ì ííê³ ììì ìŒë¡ ë€ë¥ž ë©ìëë _ì¬ì ìëì§ ìì_ìŽ ìëëŒ _ê²ì¬ëì§ ìì_ì ë¶ëª
í í©ëë€.
implements.
륌 ì¬ì©íë ê²ì ìŽë»ìµëê¹? ë€ì곌 ê°ìŽ ëë ê²:
class MyComponent extends React.Component<MyComponentProps, void>{
implements.componentWillMount(){
//do my stuff
}
}
ìŽ êµ¬ë¬žìë ëª ê°ì§ ì¥ì ìŽ ììµëë€.
implements.
륌 ìì±í í IDEìë ìë ìì± íì
ì íìí ì ìë ë°ìŽë êž°íê° ììµëë€.class MyComponent<MyComponentProps, MyComponentState> {
implements.state = {/*auto-completion for MyComponentState here*/};
implements.componentWillMount(){
//do my stuff
}
}
ì°žê³ : ëë base.
륌 ì¬ì©í ì ììµëë€. ë¶ë¥êž°ìŽê³ ë ì§êŽì ìŽì§ë§ ë íŒëì€ëœê³ (ì ì ëë ížì¶?) ìë¯žê° ìží°íìŽì€ 구í곌 ížíëì§ ììµëë€. ìì:
class MyComponent<MyComponentProps, MyComponentState> {
base.state = {/*auto-completion for MyComponentState here*/};
base.componentWillMount(){ //DEFINING
//do my stuff
base.componentWillMount(); //CALLING
//do other stuff
}
}
implements
ê° ëªšë ì¬ì© ì¬ë¡ë¥Œ 충ë¶í ë€ë£šì§ ìëë€ê³ ìê°í©ëë€.
ìŽì ì ìžêžíìŒë©° ìœê° 몚íží©ëë€. ë ìŽì ì£Œì§ ìëë€
override
ë í ì ìë IDEì ëí ì 볎ìŽë¯ë¡
ë€ë¥ž ë§ì ìžìŽìì ì¬ì©íë ì©ìŽë¥Œ ê³ ìíë ê²ìŽ í©ëŠ¬ì ì
ëë€.
ê°ì ê²ì ë¬ì±íììì€.
2016ë
4ì 13ìŒ ìììŒ 19:06ì Olmo [email protected] ìì ë€ì곌 ê°ìŽ ìŒìµëë€.
ë구륌 ì¬ì©íë ê²ì ìŽë»ìµëê¹? ë€ì곌 ê°ìŽ ëë ê²:
íŽëì€ MyComponentë React.Component륌 íì¥í©ëë€.
{
구í.componentWillMount(){
//ëŽ ìŒì íë€
}
}ìŽ êµ¬ë¬žìë ëª ê°ì§ ì¥ì ìŽ ììµëë€.
- ìŽë¯ž ì¡Žì¬íë í€ìë륌 ì¬ì©í©ëë€.
- íꞰ구 í. IDEìë 볎ì¬ì€ íë¥í êž°íê° ììµëë€.
ìë ìì± ë°©ë².- í€ìëë ì¶ìì ê°ì ë¡ íìžíë ë° ì¬ì©í ì ììì ëª íí í©ëë€.
Ʞ볞 íŽëì€ì ë©ìëë¿ ìëëŒ êµ¬íë ìží°íìŽì€ë ììµëë€.- 구묞ì ë€ì곌 ê°ì íëìë ì¬ì©í ì ìì ë§íŒ 충ë¶í 몚íží©ëë€.
ìŽê²:íŽëì€ MyComponent
{
implements.state = {/_MyComponentStateì ëí ìë ìì± here_/};implements.componentWillMount(){ //do my stuff }
}
â
ë¹ì ìŽ ìžêžëìêž° ë묞ì ìŽê²ì ë°ë ê²ì ëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHubìì íìžíìžì.
https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -209571753
ì¬ì ìì 묞ì ë ëìŒí í€ìë륌 ì¬ì©íë©Ž ëìŒí êž°ëì¹ë¥Œ ê°ê² ëë€ë ê²ì ëë€.
abstract
ìž ê²œì° íìì¬ìŒ í©ëë€.virtual
í€ìë륌 ëì¹ê² ë©ëë€.TS íìŽ ìžìŽì ë묎 ë§ì OO ìí묌ì ì¶ê°íê³ ì¶ì§ ìë€ê³ ìê°íê³ ì¢ì ìê°ìŽëŒê³ ìê°í©ëë€.
implements.
륌 ì¬ì©íë©Ž ì í€ìë륌 ë°ëª
íê±°ë ê°ë
ì륌 ëëŠ¬ì§ ìê³ ë ìë ìì± ë° ì»ŽíìŒ ìê° íìž ìŽëŠê³Œ ê°ì 죌ì ìŽì ì ì»ì ì ìë ê°ëší 구묞ì ì¬ì©í ì ììµëë€.
ëí íŽëì€ ë° ìží°íìŽì€, ë©ìë(íë¡í íì ) ëë ì§ì íëì ëí ìì ì ìŽì ìŽ ììµëë€.
override
륌 íìë¡ ë§ëë ë°©ë²ì ìŽë¯ž ì€ë ëìì ë
ŒìëììŒë©° ì룚ì
ì 컎íìŒë¬ìì 구ííë ë€ë¥ž êž°ë¥ê³Œ ë€ë¥Žì§ ììµëë€.
virtual
í€ìëë ìžìŽì 맥ëœìì ì€ì ë¡ ìë¯žê° ììŒë©° ìŽì ì C++ì ê°ì ìžìŽë¥Œ ì¬ì©íì§ ìì ì¬ëë€ìê² ì§êŽì ìž ë°©ììŒë¡ ëª
ëª
ëì§ë ìììµëë€. íìí ê²œì° ìŽë¬í ì íì ê°ë륌 ì ê³µíë ë ëì ì룚ì
ì final
í€ìëìŒ ê²ì
ëë€.
'ìí묌'ì ìì±í ì ìë ìžìŽ êž°ë¥ì ì±êžíê² ì¶ê°íŽìë ì ëë€ë ë° ëìíì§ë§ override
ë ë€ë¥ž ë§ì ìžìŽê° íìíë€ê³ ìê°íë ìì ìì€í
ì í©ë²ì ìž êµ¬ë©ì ë§ìµëë€. ê·ž êž°ë¥ì ìë¡ìŽ í€ìëë¡ ê°ì¥ ì ë¬ì±ëë©°, ë첎 ì ê·Œ ë°©ììŽ ê·Œë³žì ìž êµ¬ë¬ž ë³ê²œì ì ìíë ê²œì° íì€í ê·žë ìµëë€.
ììë íë륌 ì€ì íë ê²ê³Œ ì íë륌 ì¬ì ìíë ê²ì ìŽë»ìµëê¹? React state
ê° ì¢ì ìì
ëë€.
ëë ì íì ìží°íìŽì€ ë°©ë²ì 구ííê³ ììµëê¹?
ì¬ì ìë ë€ì ì ìžëë ê²œì° íëìì ì ì¬ì ìŒë¡ ì¬ì©ë ì ììµëë€.
íì íŽëì€ ë³žë¬žìì. ì íì ìží°íìŽì€ ë©ìëë ì¬ì ìê° ìëë¯ë¡
ì¬êž°ì ë§íë ë²ì륌 ë²ìŽë©ëë€.
2016ë 4ì 14ìŒ ëª©ììŒ 11ì 58ë¶ì Olmo [email protected] ìì ë€ì곌 ê°ìŽ ìŒìµëë€.
ììë íë륌 ì€ì íë ê²ê³Œ ì íë륌 ì¬ì ìíë ê²ì ìŽë»ìµëê¹? ë°ì ìí
ì¢ì ìì ëë€.ëë ì íì ìží°íìŽì€ ë°©ë²ì 구ííê³ ììµëê¹?
â
ë¹ì ìŽ ìžêžëìêž° ë묞ì ìŽê²ì ë°ë ê²ì ëë€.
ìŽ ìŽë©ìŒì ì§ì ëµì¥íê±°ë GitHubìì íìžíìžì.
https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -209879217
ì íì ìží°íìŽì€ ë©ìëë ì¬ì ìê° ìëë¯ë¡ ì¬êž°ì ë§íë ë²ì륌 ë²ìŽë©ëë€.
ì íì ìží°íìŽì€ ë©ìëë ëŽê° ìë í TypeScriptì ìë¹í ê³ ì í ê°ë ìŽë©° "ì¬ì ì"ì TypeScript 구íìŽ ì ì©ëìŽìŒ íë€ê³ ìê°í©ëë€.
componentDidMountì ê°ì React ëŒìŽíì¬ìŽíŽ ë©ìëì ê²œì° ìíŒíŽëì€ì 구íìŽ ìë ì íì ìží°íìŽì€ ë©ìëì ëë€.
componentDidMountì ê°ì React ëŒìŽíì¬ìŽíŽ ë©ìëì ê²œì° ìíŒíŽëì€ì 구íìŽ ìë ì íì ìží°íìŽì€ ë©ìëì ëë€.
ì ííë ì묎ê²ë 묎ìíì§ ììµëë€. override
í€ìëê° ì¬êž°ì ì ê³µíë €ë ìëì ëíŽ íŒëì€ë¬ìíê³ ìë€ê³ ìê°í©ëë€. ìëíë©Ž ë ëì ìœë ííž/ìží
늬ìŒì€ë¥Œ ì»ë ë°©ë²ì ì°Ÿê³ ìë€ë©Ž ì¶ê°íì§ ìê³ ë ë¬ì±í ì ìë ë€ë¥ž ë°©ë²ìŽ ìêž° ë묞ì
ëë€. ìžìŽì ëí ìë¡ìŽ í€ìë.
ì¬ë¬ë¶, ì°ëŠ¬ê° ì§ì€í ì ììê¹ì? í¹í 묞ì ê° í¹ì ìì²ìŒë¡ ììëìêž° ë묞ì ë첎 í€ìëì ëíŽ ë Œìíë ê²ì ë¹ìì°ì ìŽëŒê³ ìê°í©ëë€.
ì°ëŠ¬ 몚ëê° override
ê° íìíë€ë ë° ëìíê³ Typescript íì ìŽë¥Œ ì¶ê°íëë¡ ìì²íê±°ë ìì²ì ìì íê³ ë¬žì 륌 ì¢
ë£íëë¡ ë ì ììµëê¹?
묞ì ì 맥ëœìì ìì²ì ì êž°íë ê²ìŽ íì ì ì©íë€ê³ ìê°í©ëë€. 묞ì 륌 íŽê²°íë ë°©ë²ì íì ë€ìí©ëë€. ì¬ì ì ì ê³ ì°©ì ì íì í목ìžì§ ì¬ë¶ì ëë€(ìŒë¶ë C++ìì íì íëª©ìŽ ìëëŒë ì ì ì§ì íš). ë§ì ì¬ëë€ìŽ ìžêží 묞ì ë ì¬ì ì ê°ë¥í íšì(ìíŒ íŽëì€ìì 구íëê±°ë 구íëì§ ìì ì ìì)ì ìŽëŠì ì¬ë°ë¥Žê² ì§ì íë ê²ì ëë€. Reactì ìëª ì£Œêž° íšìê° ì£Œì 묞ì ì ëë€.
ì¬ì ì ê° ìëíì§ ììŒë©Ž ìŽ ë¬žì 륌 ë«ê³ ìŽ ë¬žì ì ëí ë³Žë€ ìŒë°ì ìž ì¬íì ìŽìŽìŒ í©ëë€. ì¬êž°ì ìŒë°ì ìž ë¬žì ë ìíŒíŽëì€ìì ìží°íìŽì€ ê³ìœìŽ íìíëì§ ìê³ íìžëì§ ìì ê°ë°ì륌 ë¹í©íê² íê³ TS ëë ëêµ¬ê° ëììŽ ë ì ìë€ë©Ž ì¢ì ê²ì ëë€.
@armandn ëë ì°ëŠ¬ì íì ë¶ì¡±ìŽë ì°ëŠ¬ ì ìì íë¥íšìŽ ìì²ì ê±°ë¶íë ììžìŽëŒê³ ìê°íì§ ìì§ë§ C#곌 TS ìë¯žë¡ ì ì°šìŽì ì ë€ì곌 ê°ìµëë€.
C# Ʞ볞 ë©ìë ì¬ì ì:
override
í€ìë íìC# ìží°íìŽì€ 구í:
ë°ëŒì C#ì ëìì íŽëì€ ëë ìží°íìŽì€ì ëíŽ ë¬»ëì§ ì¬ë¶ì ë°ëŒ ìë¹í ë€ë¥Žì§ë§ ìŽë€ 겜ì°ìë ë€ì ìž ê°ì§ 죌ì ìŽì ì ì»ì ì ììµëë€.
ìœê° ë€ë¥ž ìë¯žë¡ ìŽë¯ž 1) TSì ìì§ë§ ë¶ííë 2)ì 3)ìŽ ììµëë€. ëŽ ìê°ì override
ê° ê±°ë¶ë ìŽì ë ì ì¬í êµ¬ë¬žìŽ ì ì¬í ëìì ê°ì íê³ ë€ì곌 ê°ì ìŽì ë¡ ë°ëì§íì§ ìêž° ë묞ì
ëë€.
5ê° ë©ìëê° ìë íŽëì€(ê·ž ì€ 3ê°ë ì¬ì ìë¡ íìëš)ë ë€ë¥ž 2ê°ê° ì¬ì ìëì§ ììì ì믞íì§ ììµëë€.
_object literals_륌 ìì±í ë ìŽë¯ž 1) 2)ì 3)ìŽ ìì§ë§ ë€ë¥ž íŽëì€ë¥Œ íì¥íê±°ë ìží°íìŽì€ë¥Œ 구ííë íŽëì€ ë©€ë²ë¥Œ ìì±í ëë ê·žë ì§ ììµëë€.
ìŽë¥Œ ìŒëì ëê³ ì°ëŠ¬ 몚ëê° ìŽ ìë¯žë¡ ì ëìí ì ìë€ê³ ìê°í©ëë€.
check
ëë super.
ëë MyInterface.
)abstract/virtual
ì ëí ê²ì¬ë ìì§ë§ Ʞ볞 íŽëì€/구íë ìží°íìŽì€ì 구ì±ììŽ ìëì§ ê²ì¬í©ëë€. (íí 2)ëí ì룚ì ì ìì±ë륌 ìíŽ ë€ì ë ê°ì§ê° íìíë€ê³ ìê°í©ëë€*.
ìŽ ë ê°ì§ ì¬íì React êµ¬ì± ìì 구íì ì€ì ì¬ì© ì¬ë¡ìì ì ì©í©ëë€.
``` C#
íŽëì€ MyComponent
Implements.state = {/ ì¬êž°ìì MyComponentStateì ëí ìë ìì± /};
implements.componentWillMount(){
//do my stuff
}
}
```
@RyanCavanaugh ì 죌ì êž°ë° ì룚ì ì ë€ì곌 ê°ì ìŽì ë¡ ì¶©ë¶íì§ ììµëë€.
@override
륌 ìì±í í ìë ìì± ëª©ë¡ì ìì±í í QuickFix륌 ì¶ê°í ë°©ë²ìŽ ììµëë€.ì믞 첎ê³ê° 죌ìŽì§ë©Ž ì¬ë°ë¥ž 구묞ì ì ííë ê²ì ëë€. ë€ìì ëª ê°ì§ ëìì ëë€.
override componentWillMount()
: ì§êŽì ìŽì§ë§ ì€íŽì ìì§ê° ììµëë€.check componentWillMount()
: ëª
ìì ìŽì§ë§ í€ìë륌 ë§ìŽ ì¬ì©í©ëë€.super componentWillMount()
:implements componentWillMount()
:super.componentWillMount()
:implements.componentWillMount()
:this.componentWillMount()
:ReactComponent.componentWillMount()
:ì견?
@olmobrutall ì¢ì ììœì ëë€. ëª ê°ì§ í¬ìžíž:
íëì í€ìë ìµì (C#ìì ê°ì žìŽ)ì ì ì¬ë¡¯ì ëíë ëë€.
class MyComp extends React.Component<IProps,IState> {
...
new componentWillMount() { ... }
componentWillMount() { ...} // would compile, maybe unless strict mode is enabled
new componentwillmount() { ... } <-- error
ëì ë ë€ë¥ž ìì ì ìì ëŽì©ì ì묎ì ìŒë¡ ì¬ì©íë 묞ì ì ëë€. ìì ìì íŽëì€ì íì íŽëì€ ê°ì ê³ìœìŒë¡ ìì êµ¬ë¬žìŽ ì íší ìží°íìŽì€ í¬ìžížê° 묎ììžì§ ì§ì íë ê²ìŽ í©ëŠ¬ì ì ëë€. ìŽê²ë€ì ìíŒ íŽëì€ì ëí ëŽë¶ íì¥ ì§ì ìŽë¯ë¡ ë€ì곌 ê°ìµëë€.
class Component<P,S> {
extendable componentWillMount() {...}
}
ìží°íìŽì€ìë ëìŒíê² ì ì©ë©ëë€.
ê°ì¬ íŽì :)
this
륌 ì°ë ê²ì ìŽë»ìµëê¹?
class MyComponent<MyComponentProps, MyComponentState> {
this.state = {/*auto-completion for MyComponentState here*/};
this.componentWillMount(){
//do my stuff
}
}
extendable
$ ì ëíŽ TS 1.6ìë ìŽë¯ž abstract
ê° ììŒë©° ê°ìì ì¶ê°íë©Ž ë¶í ìžê³ 묞ì ê° ë€ì ë°ìí ì ììµëê¹?
ë§ìì ì¶ìí ì ëíŽ ìê°íŽëŽ€ëë° ìíŒ íŽëì€ì 구íìŽ ìì ì ììŒë ë§ìŽ ì ë©ëë€. virtual 곌 ë§ì°¬ê°ì§ë¡ ê°ì ìŽ ìë 구ì±ììŽ ê°ììŽ ìëì ì믞íë¯ë¡ ì€íŽì ìì§ê° ììµëë€.
this.
ìëí©ëë€. ìë§ë (ꞎ íììŒë¡):
this.componentWillMount = () => { }
ìŽê²ì ì ìŒí 묞ì ë Ʞ볞 íŽëì€ì 몚ë 구ì±ììŽ ìëëŒ ì§ì ë íì¥ ì§ì ìŒë¡ë§ ë²ì륌 ì§ì íŽìŒ íë€ë ê²ì ëë€.
ë¬Žìš ìŒìŽìŒ...
TypeScriptë C#ì ìë°ì€í¬ëŠœíž ë²ì ìŽ ìëë©° ê²°ìœ ê·žë° ì ìŽ ììµëë€. ë°ëŒì ê·ž ìŽì ë ì ìë êž°ë¥ìŽ C#ì ì믞 첎ê³ì ë€ë¥Žêž° ëë¬žìŽ ìëëë€. RyanìŽ ì€ëª í ë€ì Daniel RìŽ ì€ëª í íì ìŽì ë ë€ì곌 ê°ìµëë€.
RyanìŽ ì€ëª íë¯ìŽ 묞ì ë ë©ìë륌 ì¬ì ìë¡ íìíë ê²ìŽ ë€ë¥ž ë©ìëê° ì¬ì ìê° ìëì ì믞íì§ ìëë€ë ê²ì ëë€. ê·žê²ìŽ ìë¯žê° ìë ì ìŒí ë°©ë²ì 몚ë ì¬ì ìê° ì¬ì ì í€ìëë¡ íìëìŽìŒ íë 겜ì°ì ëë€(ì°ëŠ¬ê° ëª ë ¹í ê²œì° ì£Œì ë³ê²œ ì¬íìŽ ëš).
ê·žë¬ë ì¬ì í ìë ìì±ê³Œ êŽë šë 묞ì 륌 íŽê²°íì§ ëª»íê³ ììµëë€. ìë ìì±ì ê°ì ë ì ìì ì ê³µíêž° ìíŽ íŽë¹ ìžìŽë¡ ë ì í€ìëê° íìíì§ ììµëë€.
ìŽ ì€ë ëê° ì¡Žì¬íë ìŽì ë íšìê° ë¶ë²ì ìŒë¡ ì¬ì ìëê±°ë ë©ìëê° ì¬ì ìë¡ ì ìžëìì§ë§ ì€ì ë¡ êž°ë³ž íŽëì€ì íšì륌 ì¬ì ìíì§ ìì ê²œì° ì»ŽíìŒë¬ ì€ë¥ê° ë°ìíêž° ë묞ì ëë€. ìŽë typescriptê° ì ê³µíŽìŒ íë ë ë§ì ìžìŽ êž°ë¥ì ìëì§ë§ ëë¶ë¶ì ì§ìíë ì¬ë¬ ìžìŽì ê±žì³ ê°ëšíê³ ì ì ìë ê°ë ì ëë€. 몚ë ìžê³ì 묞ì 륌 íŽê²°í íìë ììŒë©° ì¬ì ìì ëíŽ override í€ìëë§ ììŒë©Ž ë©ëë€.
ìŽí ë ë§ì ì¬ëë€ìŽ ìë ì ìì êŽì¬ì 볎ììŒë¯ë¡ 묞ì ê° ì êž°ë 죌ì ì 충ì€íê³ ìë¡ìŽ ììŽëìŽì ëí ìë¡ìŽ 묞ì 륌 ì êž°í©ëë€.
TypeScriptë C#ì ìë°ì€í¬ëŠœíž ë²ì ìŽ ìëë©° ê²°ìœ ê·žë° ì ìŽ ììµëë€.
ìŽê²ìŽ ì¬ë¬ë¶ìŽ ê°ì íë ëììŽëŒê³ ê°ì íêž° ë묞ì ì°žì¡° ìžìŽë¡ C#곌 ë¹êµíê³ ììµëë€.
ìë ìì±ì ê°ì ë ì ìì ì ê³µíêž° ìíŽ íŽë¹ ìžìŽë¡ ë ì í€ìëê° íìíì§ ììµëë€.
ê·žë¬ë©Ž ìŽë»ê² ìŽë°ëëë¡ ì ìí©ëê¹? íŽëì€ ì»ší ì€ížìì ììì ìŽëŠì ìì±í ë ìë ìì± ìœ€ë³Ž ìì륌 íìíë©Ž ì íëë ë©ìë륌 ì ìžíë €ê³ í ë ë§€ì° ì±ê°ì€ ê²ì ëë€.
ìŽ ì€ë ëê° ì¡Žì¬íë ìŽì ë íšìê° ë¶ë²ì ìŒë¡ ì¬ì ìëê±°ë ë©ìëê° ì¬ì ìë¡ ì ìžëìì§ë§ ì€ì ë¡ êž°ë³ž íŽëì€ì íšì륌 ì¬ì ìíì§ ìì ê²œì° ì»ŽíìŒë¬ ì€ë¥ê° ë°ìíêž° ë묞ì ëë€.
ì ë ìŽ ì¬ì© ì¬ë¡ë¥Œ íí 2 ìëì ì ëì ìŒë¡ í¬íšíìµëë€.
몚ë ìžê³ì 묞ì 륌 íŽê²°í íìë ììŒë©° ì¬ì ìì ëíŽ override í€ìëë§ ììŒë©Ž ë©ëë€.
ë°ëŒì ê·íì ì ìì í ëšê³ ë€ë¡ ìŽëíì¬ ì ì¬/êŽë š 묞ì 륌 볎ë ëì _í ë²ì í ëšê³_ ìì íë ê²ì ëë€. ì€í¬ëŒ 볎ëìë ì¢ì ììŽëìŽìŒ ì ìì§ë§ ìžìŽë¥Œ ëììžíë ë°ìë ì í©íì§ ììµëë€.
ê·žë€ìŽ í€ìë ì¶ê°ì ëíŽ ë³Žìì ìž ìŽì ë ìžìŽìì êž°ë¥ì ì ê±°í ì ìêž° ë묞 ì ëë€.
ìë£ ë¶ì¡±ìŒë¡ ìží C#ì ìŒë¶ ì€ê³ ì€ì:
var
ë ìë ìŒë° 맀ê°ë³ì ëë ë°í ì íìŽ ìë ë³ì ì íìë§ ìëí©ëë€. Mayble auto
ê° C++ììì ê°ìŽ ë ëì í€ìëê° ë ê¹ì?ì ìë§ React륌 ì¬ì©íë €ê³ íë©Ž 귞늌ì ë€ë¥ž ë©ŽìŽ ë³ŽìŒ ê²ì ëë€.
Ʞ볞 íŽëì€ìì ìŽë¯ž 구íë ë©ìë륌 ì¬ì ìíê³ ìží°íìŽì€ ë©ìë륌 구ííë ê²ì _ ìì í ë€ë¥ž ë ê°ì§ ì ëë€. ì, ì ìë ê²ì ìŒë¶ Swiss-Army í€ìë륌 ìê°íŽ ëŽë ëì ì ì© í€ìëë¡ ìŽë¬í ìëëŠ¬ì€ ì€ íë륌 ìì íë ê²ì ëë€.
ì²ììŒë¡ ìœë륌 ìœë ê°ë°ììê² 3ê°ì§ ë€ë¥ž ì믞 ì€ íë륌 ì믞í ì ìë í€ìëê° ë¬Žìš ìì©ìŽ ììµëê¹? í¹í this
ì ê°ì í€ìë륌 ì¬ì©íì¬ ìŽë¯ž ìžìŽìì ë€ë¥ž(ìì í êŽë šìŽ ìë!) ìì
ì ìííë 겜ì°ìë 몚ížíê³ íŒëì€ëœìµëë€. ìŽë³Žë€ ë ìŒë°ì ìŒ ì ììŒë©° ê±°ì ââìžëªšê° ììµëë€.
죌ì êŽì¬ì¬ê° ìë ìì±ìž ê²œì° ížì§ìë 'ì ë ¥íë ëë¡' Ʞ볞 íŽëì€ ë° êµ¬íë ìží°íìŽì€ìì ë©ìë륌 ì ìí ì ìë _ì§êž_ 충ë¶í ì 볎륌 ê°ì§ê³ ììµëë€.
Ʞ볞 íŽëì€ìì ìŽë¯ž 구íë ë©ìë륌 ì¬ì ìíë ê²ê³Œ ìží°íìŽì€ ë©ìë륌 구ííë ê²ì ìì í ë€ë¥ž ê²ì ëë€.
ìŒë°ì ìž ê²œì°ìë ê·žë ìµëë€. ê·žë¬ë ì°ëŠ¬ë ìží°íìŽì€ ë°©ë²ì 구ííë ê²ì ëíŽ ìŽìŒêž°íê³ ìì§ ììµëë€. ì°ëŠ¬ë ë¶ëªš íŽëì€ê° ìží°íìŽì€ë¥Œ 구ííë ì íì ìží°íìŽì€ ë°©ë²ì ëíŽ ìŽìŒêž°íê³ ììµëë€. ìŽ ê²œì° 1) ìží°íìŽì€ê° undefined
ë¡ êµ¬íëë ë©ìë륌 íì©íê³ , 2) ë¶ëªš íŽëì€ì ì ìëì§ ìì 구íìŽ ìê³ , 3) ìì íŽëì€ê° ë©ìë 구íìŒë¡ ì ìëì§ ìì 구íì ì¬ì ìíë€ê³ ë§í ì ììµëë€.
@olmobrutall ìžìŽ ëììžê³Œ ì€í¬ëŒ 볎ëê° ìë ë°©ë²ì ëí ê·íì ì견ì ë€ì ìŽêž°ì ìž ê² ê°ìµëë€. ëë 1ë 믞ë§ì ê³µê°ìì TSì ëí ìœ 4ê°ì ì ë°ìŽížë¥Œ 볎ììµëë€.
ìžìŽ ëììžìŽ ë¹ì ìŽ ì믞íë ë§íŒ ì ê³ ë €ëìë€ë©Ž ì¬ì ìê° ìŽë»ê² ìëíŽìŒ íëì§ ì íí ìë €ì£Œë ìžìŽ ì¬ì 묞ìê° ìŽë¯ž ìì ê²ìŽê³ ì°ëŠ¬ë ìŽ ëíì¡°ì°š íì§ ìì ê²ì ëë€.
TSë ìŽë¯ž ì°ìíê³ íì€ JS륌 ëì ì¬ì©íŽìŒ íë ê²ìŽ ëë µêž° ë묞ì TS ê°ë°ì/ëììŽë륌 íííë ë§ì íì§ ììµëë€.
ì TSë C#ìŽ ìëë©° C++ë ìëëë€. ê·žë¬ë ë§ì ìžìŽê° ì¬êž°ìì ë Œìë 목í륌 충족íêž° ìíŽ override í€ìë륌 ì ííêž° ë묞ì ìì í ë¯ì 구묞ì ì ìíë ê²ì ìíšê³Œë¥Œ ë³ë ê² ê°ìµëë€.
죌ì 묞ì ë ëžë ìŽí¹ 첎ìžì§ë¥Œ ëì íê³ ì¶ì§ ìì ê² ê°ìµëë€. ê°ëší ëëµì ìŽìŒêž°ì ëìž ì»ŽíìŒë¬ íëê·žì ëë€. ë ê°ì ì¬ëìê²ë ì íì ì¬ì ì í€ìëê° ìžëªšê° ììµëë€. ë€ë¥ž ì¬ëë€ì ìœë륌 ì ì§ì ìŒë¡ ꟞믞Ʞ륌 ìí©ëë€. 컎íìŒë¬ íëê·žë ëë ë§ë¥Œ íŽê²°í©ëë€.
ìëª ì°šìŽë ë€ë¥ž ëíì ëë€. JSê° ëìŒí ìŽëŠì ì¬ë¬ ë©ìë륌 ì§ìí ì ìêž° ë묞ì new í€ìëê° ë¶íìíŽ ë³Žì ëë€(TSê° ìëª íìë 맹êžë§ë ìŽëŠ a'la C++ì ìì±íì§ ìë í, ê°ë¥ì±ì ê±°ì ìì).
ëë 1ë 믞ë§ì ê³µê°ìì TSì ëí ìœ 4ê°ì ì ë°ìŽížë¥Œ 볎ììµëë€.
ë¹ ë¥Žì§ ìê³ ë¹ ë¥Žê² ë°ë³µí ì ìë€ë ì믞ë ìëëë€. ES6ì TSê° ë¹ ë¥Žê² ë°ì íê³ ìë€ë ì¬ì€ì ë구볎ë€ë êž°ì©ëë€. ëŽ ë§ì ìžìŽë¥Œ ë§ë€ë¥ž 곚목ì ëì§ ììŒë €ë©Ž 믞ë륌 ììž¡íë €ê³ ë žë ¥íŽìŒ íë€ë ê²ì ëë€.
override
í€ìë ì¬ì©ì ëìí ì ììµëë€. ì ì í ìžì륌 ì¬ì©íë©Ž íëì ìží°íìŽì€ë¥Œ ë²ì ë°ìŒë¡ ì ì§íì§ë§ '_ë€ë¥ž ìžìŽê° ë묎 ë§ìŽ ìê°íì§ ìê³ íŽê²°íë ë°©ììŒë¡ ì§ì€íê³ ìŽ í¹ì 묞ì 륌 íŽê²°íì_'' ìžììë ëìí ì ììµëë€.
ê·žë¬ë ë§ì ìžìŽê° ì¬êž°ìì ë Œìë 목í륌 충족íêž° ìíŽ override í€ìë륌 ì ííêž° ë묞ì ìì í ë¯ì 구묞ì ì ìíë ê²ì ìíšê³Œë¥Œ ë³ë ê² ê°ìµëë€.
ìŽ ìžìŽë€ ì€ ìŽë€ ê²ë íë¡í íì ìììŽë ì íì ë©ìë(ì¶ìì ìŽê±°ë ê°ììŽ ìë ë©ìë, ë°íìì _ì¡Žì¬íì§ ìì_ ì ìë ë©ìë)ê° ììŒë©°, ìŽë ìœìì íêž° ì ì ë ŒìíŽìŒ íë(ìë§ë ë²ë €ìŒ í ) êŽë š 묞ì ì ëë€.
ë€ì ë§íŽì, ë¹ì ìŽ ì ìí ê²ì²ëŒ ì°ëŠ¬ê° ë§ì ìê° ììŽ ì¬ì ì륌 구ííë€ê³ ê°ì íŽ ëŽ
ìë€. ê·žë° ë€ì ë ëë TSX륌 ì¬ì©íë ë€ë¥ž ì¬ëìŽ override
ê° React êµ¬ì± ìììì ìëíì§ ìë ìŽì ì ëí 묞ì 륌 ì¶ê°í©ëë€. ë¹ì ì ê³íì 묎ìì
ëê¹?
ìŒë°ì ìž ê²œì°ìë ê·žë ìµëë€. ê·žë¬ë ì°ëŠ¬ë ìží°íìŽì€ ë°©ë²ì 구ííë ê²ì ëíŽ ìŽìŒêž°íê³ ìì§ ììµëë€. ì°ëŠ¬ë ë¶ëªš íŽëì€ê° ìží°íìŽì€ë¥Œ 구ííë ì íì ìží°íìŽì€ ë°©ë²ì ëíŽ ìŽìŒêž°íê³ ììµëë€.
ìží°íìŽì€ê° ìŽëì ì€ì ëìëì§ë ì€ìíì§ ììµëë€. ì¬ì€ ê·žê²ë€ì ê°ì§ ììŒë©° íë¡ê·žëšì _ìë_ê° ëª ííì§ ìêž° ë묞ì í€ìë륌 ê³µì íŽìë ì ë©ëë€.
ì륌 ë€ìŽ Ʞ볞 íŽëì€ìì ìží°íìŽì€ ì€ì륌 ìíŽ êµ¬íë ë©ìë륌 ì¬ì ìí ì ììµëë€. ì°ëŠ¬ê° ìŽ ë ê°ì§ ë€ë¥ž ê²ì ëí íëì í€ìëì 몚ë ê³ëì ë£ëë€ë©Ž ìŽê²ìŽ ê·ž íšìì ìŽêž° ì ìžìžì§ ëë Ʞ볞 íŽëì€ìì ìŽì ì ì ìë ê²ì ëí ì¬ì ììžì§ ìŽë»ê² ëê° ìê² ìµëê¹? Ʞ볞 íŽëì€ì ëí ì¶ê° ê²ì¬ ììŽë ì ì ììŒë©° íì¬ .d.ts
íìŒì ìì ìë ììŒë¯ë¡ ìŒë§ë ê¹ìŽì ë°ëŒ ì°Ÿêž°ê° ì ëì ìž ì
ëªœìŽ ë ì ììµëë€. ìì 첎ìžìì íšìë ìë 구íëììµëë€.
ë€ì ë§íŽì, ë¹ì ìŽ ì ìí ê²ì²ëŒ ì°ëŠ¬ê° ë§ì ìê° ììŽ ì¬ì ì륌 구ííë€ê³ ê°ì íŽ ëŽ ìë€. ê·žë° ë€ì ë ëë TSX륌 ì¬ì©íë ë€ë¥ž ì¬ëìŽ ì€ë²ëŒìŽëê° React êµ¬ì± ìììì ìëíì§ ìë ìŽì ì ëí 묞ì 륌 ì¶ê°í©ëë€. ë¹ì ì ê³íì 묎ìì ëê¹?
React륌 ìì íŽìŒ íë ìŽì ë 묎ììžê°ì? Reactê° íŽê²°íë €ë ê²ê³Œ ë€ë¥ž 묞ì ê° ìë€ë©Ž íì override
ìì íŽê²°íŽìŒ íë ìŽì 륌 ìŽíŽí ì ììµëë€. ìží°íìŽì€ 구íì ëíŽ ìíë ìì
ì ì ìíêž° ìíŽ ë€ë¥ž 묞ì 륌 ìŽìŽ 볎ì
šìµëê¹?
ëë ìŽê²ì ëíŽ ì¶©ë¶í ìê°íì§ ììë€ë ë° ëìíì§ ìì ê²ì ëë€. ì°ëŠ¬ë ëŽê° ìê°í ì ìë ë€ë¥ž 몚ë ìžìŽìì ì±ê³µí ìëëê³ í ì€ížë êž°ì ì ì ìíê³ ììµëë€.
ì¬ì€ ê·žê²ë€ì ê°ì ê²ìŽ ìëë¯ë¡ íë¡ê·žëšì ìëê° ëª ííì§ ìêž° ë묞ì í€ìë륌 ê³µì íŽìë ì ë©ëë€.
ê·žë ì§ ììµëê¹? BaseClass
ì ë ê°ì§ ë첎 ì ì륌 볎ììì€.
class BaseClass {
abstract myMethod();
}
interface ISomeInterface {
myMethod?();
}
class BaseClass extends ISomeInterface {
}
ê·žë° ë€ì ìœëìì ë€ìì ìíí©ëë€.
``` C#
íŽëì€ ìœí¬ëŠ¬íž íŽëì€ {
ì¬ì ì myMethod() {
// ìŒì íë€
}
}
You think it should work in just one case and not in the other? The effect is going to be 100% identical in Javascript (creating a new method in ConcreteClass prototype), from the external interface and from the tooling perspective.
Even more, maybe you want to capture `this` inside of the method, implementing it with a lambda (useful for React event handling). In this case you'll write something like this:
``` C#
class ConcreteClass {
override myMethod = () => {
// Do stuff
}
}
ë©ìëê° ì¶ììŽê±°ë ìží°íìŽì€ìì ê°ì žìš ê²œì° ëìì ë€ì ëìŒí©ëë€. ìŽë¥Œ 구ííë ëë€ê° ìë íŽëì€ì íë륌 ì¶ê°í©ëë€. íì§ë§ override
íëìë ìœê° ìŽìíê² ë³Žì
ëë€. ê°ì í ë¹íë ê²ìŽêž° ë묞ì
ëë€.
super.
(ì§êžì ëŽê° ê°ì¥ ì¢ìíë 구묞ìŽì§ë§ ëììŽ ìì)륌 ì¬ì©íì¬ ìŽíŽë³Žê² ìµëë€.
``` C#
íŽëì€ ìœí¬ëŠ¬íž íŽëì€ {
super.myMethod() { //íë¡í íì
ì ë©ìë
// ìŒì íë€
}
super.myMethod = () => { //method in lambda
// Do stuff
}
}
```
ìŽì ê°ë ì ê°ë ì ìŒë¡ ë ê°ëší©ëë€. ì ìíŒ íŽëì€ë ë©ìë ëë íëê° ìê³ ConcreteClassê° íë¡í íì ìì ì ìí ì ìë€ê³ ë§í©ëë€/í ë¹/ìœêž°/ížì¶í ì ììµëë€.
React륌 ìì íŽìŒ íë ìŽì ë 묎ììžê°ì?
ëšìí ë°ìíë ê²ìŽ ìëëŒ ê°ë륌 ìŽíŽë³Žììì€.
ë¬Œë¡ ëë¶ë¶ì ìží°íìŽì€ê° 구íëì§ ìê³ ëªšë íŽëì€ê° ì¬ì ìëì§ë ìì§ë§ í ê°ì§ ë¶ëª í ê²ì Typescriptìì ìží°íìŽì€ê° íŽëì€ë³Žë€ ë ì€ìíë€ë ê²ì ëë€.
ìží°íìŽì€ 구íì ëíŽ ìíë ìì ì ì ìíêž° ìíŽ ë€ë¥ž 묞ì 륌 ìŽìŽ ë³Žì šìµëê¹?
ìŽë»ê² ë¶ë¬ìŒ íëì? ìží°íìŽì€ ë° íëì© override
?
ì°ëŠ¬ë ëŽê° ìê°í ì ìë ë€ë¥ž 몚ë ìžìŽìì ì±ê³µí ìëëê³ í ì€ížë êž°ì ì ì ìíê³ ììµëë€.
ë¹ì ìŽ ìê°íë ìžìŽë ìë¹í ë€ëŠ ëë€. ì ì VTableì êž°ë°ìŒë¡ íë ìììŽ ììµëë€.
Typescriptìì íŽëì€ë ëšì§ ìží°íìŽì€ + ë©ìëì ìë íë¡í íì ììì ëë€. ê·žëŠ¬ê³ ë©ìëë ëŽë¶ì íšìê° ìë íëìŒ ë¿ì ëë€.
override
êž°ë¥ì TSì ì ì©íë €ë©Ž ìŽ ë ê°ì§ 귌볞ì ìž ì°šìŽì ì ê³ ë €íŽìŒ í©ëë€.
@kungfusheep ìŽ ëŽ ë¬žì ì ëí íŽê²°ì± ì ìê°íëë¡ ë žë ¥íììì€. ë€ë¥ž í€ìë륌 ì¶ê°íê³ ë ë²ì§ž ëšê³ìì 구ííë €ë ê²œì° êŽì°®ì§ë§ ì ì ìê°ì ëŽìŽ ìŽë»ê² ëìŽìŒ íëì§ ììíŽ ë³Žìžì.
ëŽê° ìŽë¯ž ë§í ê²ì ë€ë¥ž ë§ë¡ ííí ë°©ë²ìŽ ìê°ëì§ ìëë€. ê·žë€ì ëìŒíì§ ììµëë€. ê·žê²ë€ì ë¹ì·íì§ë§ ê°ì§ë ììµëë€. TS devs RE ì€ í ëª ìŽ ìì±í ìŽ ëêžì ì°žì¡°íìžì. ìœêž° ì ì© í€ìë - https://github.com/Microsoft/TypeScript/pull/6532#issuecomment -179563753 - ìŽë ëŽê° ë§íë ê²ì ê°íí©ëë€.
ëë ìŒë°ì ìž ìê°ì ëìíì§ë§ ì€ì ë¡ ë³Žì:
class MyComponent extends React.Component<{ prop : number }, { value: string; }> {
//assign a field defined in the base class without re-defining it (you want type-checking)
assign state = { value : number};
//optional method defined in an interface implemented by the base class
implement componentDidMount(){
}
//abstract method defined in the base class
override render(){
}
}
ìŽê²ì VBë Cobolì²ëŒ 볎ìŽì§ ììµëê¹?
ì ìŽë ë§ìŽ ëë ê² ê°ìµëë€.
override(ëë íëë§) í€ìëë§ ìë ê²œì° ìŽ ì륌 ê³ ë €íììì€.
interface IDo {
do?() : void;
}
class Component implements IDo {
protected commitState() : void {
/// do something
}
override public do() : void {
/// base implements 'do' in this case
}
}
ìŽì ë°©êž ìì±í ëŽì©ì ì¬ì©íì¬ ì첎 êµ¬ì± ìì륌 구ííŽ ë³Žê² ìµëë€.
class MyComponent extends Component {
override protected commitState(){
/// do our own thing here
super.commitState();
}
override do() : void {
/// this is ambiguous. Am I implementing this from an interface or overriding a base method? I have no way of knowing.
}
}
ì ì ìë í ê°ì§ ë°©ë²ì super
ì íì
ëë€.
override do() : void {
super.do(); // this compiles, if it was an interface then super wouldn't support `do`
}
ë°ë¡ ê·žê±°ì£ ! ì€ê³ê° ì못ëìë€ë ë»ì ëë€. ì€í€ë° ìœëì êŽë šë ì¡°ì¬ë ììŽìŒ íë©° ìœì ë ìë¯žê° ììŽìŒ í©ëë€.
ìŽê²ì 몚íží©ëë€. ìží°íìŽì€ìì ìŽê²ì 구ííê³ ììµëê¹, ìëë©Ž Ʞ볞 ë°©ë²ì ì¬ì ìí©ëê¹? ì ë°©ë²ìŽ ììµëë€.
ì€ì²ì ì°šìŽì ì 묎ìì
ëê¹? ê°ì²Žìë ìŽëŠ ê³µë°±ìŽ íëë§ ììŒë©° do
íëìë íëì ëë€ë§ ë°°ì¹í ì ììµëë€. ìŽìšë ìží°íìŽì€ë¥Œ ëª
ìì ìŒë¡ 구íí ë°©ë²ì ììµëë€. 구íì ë€ì곌 ê°ìµëë€.
MyComponent.prototype.do = function (){
//your stuff
}
ë¹ì ìŽ ì°ë ê²ê³Œ ë 늜ì ìŒë¡.
ì¶ë ¥ìŽ 묎ììžì§ë ì€ìíì§ ììµëë€. ìëì ìŒë¡ ëë ìëíì§ ìê² êž°ë³ž íŽëì€ì ìŒë¶ êž°ë¥ì ì¬ì ìí ì ìì§ë§ 몚íží í€ìëìë ìëê° ììµëë€.
ë ê°ì í€ìë륌 ì¬ì©íë©Ž ìŽë€ ì€ë¥ ëë ìêž°ì¹ ìì ëììŽ íŽê²°ë©ëê¹?
ì, ìŽì ì¹êµ¬. ë¹ì ì ë¶ëª í ëëí ì¬ëì ëë€. ë°©êž "Ʞ볞 íŽëì€ì ìŒë¶ êž°ë¥ì ìëíì§ ìê² ì¬ì ì"íë€ê³ ë§íìµëë€. ì ì¬ì ìŒë¡ ë°©êž ë°ìíì ì ìë ìêž°ì¹ ìì ëìì ìŽë¡ë¶í° ì¶ë¡ í ì ììµëê¹?
ë¶ëª í íìë©Ž, ì ë ìŽ ë¬žì 륌 ë ê°ì í€ìëì ëí ì ììŒë¡ ë°êŸžë ê²ì ì ìíì§ ììµëë€. ìŽ ë¬žì ë ì¬ì ì í€ìëì ëí ê²ì ëë€. ë€ë¥ž 몚ë í목ìë ìë¯žë¡ ì ëí ì첎 ë Œìì ìë¡ìŽ ì ììŽ íìí©ëë€.
ë¶ëª í íìë©Ž, ì ë ìŽ ë¬žì 륌 ë ê°ì í€ìëì ëí ì ììŒë¡ ë°êŸžë ê²ì ì ìíì§ ììµëë€. ìŽ ë¬žì ë ì¬ì ì í€ìëì ëí ê²ì ëë€. ë€ë¥ž 몚ë í목ìë ìë¯žë¡ ì ëí ì첎 ë Œìì ìë¡ìŽ ì ììŽ íìí©ëë€.
ìŒë§ë ë§ì 묞ì 륌 ë ŒìíŽìŒ íëì§ ëë ììŽëìŽê° ë구ìê²ì ëì€ëì§ë ë³ë¡ ì€ìíì§ ììµëë€. ë¹ì ì ë§€ì° êŽë šë ë ê°ì§ ìê°ì ë¶ëŠ¬í ê²ì ì ìíê³ ìŒêŽë 구묞 ì¡°ì°š ê³ ë € íì§ ììµëë€.
1, 2 ëë 3ê°ì í€ìëê° íìíì§ ì¬ë¶ì ëí ìžìë ìŽ ì€ë ëì ìíë©° ìë£ëì§ ìììµëë€(...ê·žë¬ë ë°ë³µì ìŒë¡ ëš). ê·žë° ë€ì ë€ë¥ž ì€ë ëìì 구묞ì ëíŽ ë Œìí ì ììµëë€(ìŽìšë ì믞 첎ê³ë ëìŒí ê²ìŽêž° ë묞ì :P).
ëŽ ììì :
class MyComponent extends React.Component<{ prop : number }, { value: string; }> {
//assign a field defined in the base class without re-defining it (you want type-checking)
assign state = { value : number};
//optional method defined in an interface implemented by the base class
implement componentDidMount(){
}
//abstract method defined in the base class
override render(){
}
}
assign
, implement
ë° override
ê° ì íí ëìŒí ìì
ì ìííì§ ë§ììì€. ìŽëŠìŽ ì¡Žì¬íëì§ íìžíììì€(Ʞ볞 íŽëì€ìì 구íë ìží°íìŽì€, Ʞ볞ìì 구íë ìží°íìŽì€ ìì
ë±...).
Ʞ볞 íŽëì€ì ìŒë¶ 구íë ìží°íìŽì€ ê°ì ìŽëŠ 충ëìŽ ìë ê²œì° 1, 2 ëë í€ìëê° ì í í¬íšëì§ ìì 컎íìŒ ìê° ì€ë¥ê° ë°ìí©ëë€.
ëí ê°ì²Ž 늬í°ëŽì ëíŽ ìê°íŽ 볎ììì€.
var mc = new MyComponent();
mc.state = null;
mc.componentDidMount =null;
mc.render = null;
ì íí ëìŒí 구묞ì ì¬ì©íì¬ êž°ë³ž íŽëì€, ì§ì ìží°íìŽì€ 구í ëë Ʞ볞 íŽëì€ì 구íë ìží°íìŽì€ìì ê°ì žìš ê²œì° íë ëë ë©ìë륌 ë 늜ì ìŒë¡ ë€ì í ë¹í ì ììµëë€.
í ë¹, 구í ë° ì¬ì ìë ì íí ëìŒí ìì ì ìííì§ ë§ììì€. ìŽëŠìŽ ì¡Žì¬íëì§ íìžíììì€(Ʞ볞 íŽëì€, 구íë ìží°íìŽì€, Ʞ볞 íŽëì€ì ìíŽ êµ¬íë ìží°íìŽì€ ë±...).
ë°©êž ê±°êž°ìì 3ê°ì§ ë€ë¥ž ìë늬ì€ë¥Œ ì€ëª íìŒë¯ë¡ ë¶ëª í ëìŒíì§ ììµëë€. ëë ê·žë€ìŽ ì ë¹ì 곌 í룚 ì¢ ìŒ ë€ë¥žì§ ì€ëª í ì ìì ê² ê°ì ëëìŽ ë€ììµëë€. ê·žëŠ¬ê³ ë¹ì ì ì¬ì í ââê·žë€ìŽ ìëëŒê³ 죌ì¥íê³ ìì ê²ì ëë€. ê·žëì ì§êžì ìŽ í¹ì í ë¡ ëŒìžìì ê³ ê°ë¥Œ ììŽê² ìµëë€. ìŽìšë TS ì¬ëë€ìŽ íì¬ ìŽê²ì ê³ ë €íê³ ìë€ê³ ë§í ìë ììµëë€.
#6118ì íìë¡ ê·žê³³ì 묞ì ì ì¬êž°ì 묞ì ê° ëìì íŽê²°ë ì ìëì§ ë Œìí ìŽì ê° ìë€ê³ ìê°í©ëë€.
https://github.com/Microsoft/TypeScript/pull/6118ì ìì§ ëª»íìµëë€. ììŽëìŽë override
ì¶ê°ì ëí ê°ë¥í ëìì²ëŒ 볎ì
ëë€.
ëŽê° 묞ì 륌 ì ëë¡ ìŽíŽíë€ë©Ž, 묞ì ë íží ê°ë¥íì§ë§ ëìŒíì§ ìì ë©€ë² ì ìžì ê°ì§ Ʞ볞 íŽëì€/ìží°íìŽì€ë¥Œ ë ìŽì ê°ì§ ì ììŒë©° ì íìŽ ìë ìì íŽëì€ìì ìŽêž°íë ë íµí©ëìŽìŒ íë€ë ê²ì ëë€.
결곌ì ëí ì¢ì ìê° ììŽ ë€ì곌 ê°ì ê²œì° íë³µí ê²ì ëë€.
ë ì€ìí IMOë íŽëì€ ë©€ë²ë¥Œ ìì±í ë ìë ìì±ì ížëŠ¬ê±°íë ë°©ë²ìŽ ìë€ë ê²ì ëë€(Ctrl+Space). 컀ìê° íŽëì€ ëŽë¶ì ì§ì ììŒë©Ž ììë ë©€ë²ë¥Œ ì¬ì ìíë ì ë©€ë²ë¥Œ ì ìí ì ììŒë¯ë¡ ìë ìì±ìŽ ë묎 공격ì ìŽì§ ìì ì ìì§ë§ ìëìŒë¡ ížëŠ¬ê±°íë©Ž ëììŽ êŽì°®ì ê²ì ëë€.
@RyanCavanaugh ì견ì êŽíì¬:
ì°ëŠ¬ë ì¬êž°ìì ì¬ì© ì¬ë¡ë¥Œ íì€í ìŽíŽíê³ ììµëë€. 묞ì ë ìžìŽì ìŽ ëšê³ìì ì¶ê°íë©Ž ì ê±°íë ê²ë³Žë€ ë ë§ì íŒëìŽ ì¶ê°ëë€ë ê²ì ëë€. 5ê° ë©ìëê° ìë íŽëì€(ê·ž ì€ 3ê°ë ì¬ì ìë¡ íìëš)ë ë€ë¥ž 2ê°ê° ì¬ì ìëì§ ììì ì믞íì§ ììµëë€. ê·ž ì¡Žì¬ë¥Œ ì ë¹ííêž° ìíŽ ìì ìë ì€ì ë¡ ìžê³ë¥Œ ê·žë³Žë€ ë ê¹ëíê² ë¶í íŽìŒ í©ëë€.
ë³ì륌 any
ë¡ ì
ë ¥íë€ê³ íŽì ë€ë¥ž ë³ìê° any
ìžì§ ìëì§ë¥Œ ì믞íì§ë ììµëë€. ê·žë¬ë ëª
ìì ìŒë¡ ì ìžíëë¡ ê°ì íë 컎íìŒë¬ íë« --no-implicit-any
ìŽ ììµëë€. ì°ëŠ¬ë ëë±íê² --no-implicit-override
ì ê°ì§ ì ììµëë€. ì¬ì© ê°ë¥í ê²œì° ìŽë¥Œ 쌀 ê²ì
ëë€.
override
í€ìë륌 ì¬ì©íë©Ž ê°ë°ìê° ìµìíì§ ìì ìœë륌 ìœì ë ìì²ë ìì íµì°°ë ¥ì ì»ì ì ììŒë©° ìŽë¥Œ ì ì©íë êž°ë¥ì ì¬ì©íë©Ž 컎íìŒ ìê°ì ì¶ê°ë¡ ì ìŽí ì ììµëë€.
몚ë +1 ì¬ì©ì륌 ìíŽ -- ìì íìë ë°ìœë ìŽí° ì룚ì ì ëíŽ ì¶©ë¶íì§ ìì ì ì ëíŽ ìŽìŒêž°í ì ììµëê¹?
ì¬ì ì í€ìëë³Žë€ ë°ìœë ìŽí°ê° ë ëì ì룚ì ìŽ ììµëê¹? ë ëë¹ ì§ë ë°ë ì¬ë¬ ê°ì§ ìŽì ê° ììµëë€. 1) ìì§ë§ ë°íì ì€ë²í€ë륌 ì¶ê°í©ëë€. 2) 컎íìŒ ìê° ê²ì¬ê° ìëëë€. 3) ëŽ ëªšë ëŒìŽëžë¬ëŠ¬ì ìŽ ìœë륌 í¬íšíŽìŒ í©ëë€. 4) override í€ìëê° ëëœë íšì륌 ì¡ì ë°©ë²ìŽ ììµëë€.
ì륌 ë€ìŽ ë³Žê² ìµëë€. ìž ê°ì íŽëì€ ChildA
, ChildB
, Base
ê° ìë ëŒìŽëžë¬ëŠ¬ê° ììµëë€. ChildA
ë° ChildB
ì doSomething()
ë©ìë륌 ì¶ê°íìµëë€. ëª ê°ì§ 늬í©í ë§ íì ëª ê°ì§ ì¶ê° ë
ŒëŠ¬ë¥Œ ì¶ê°íê³ ìµì ííê³ doSomething()
륌 Base
íŽëì€ë¡ ìŽëíìµëë€. ííž, ëŽ ëŒìŽëžë¬ëŠ¬ì ìì¡Žíë ë€ë¥ž íë¡ì ížê° ììµëë€. ê±°êž°ì doSomething()
ê° ìë ChildC
$ ê° ììµëë€. ChildC
ê° ìŽì ììì ìŒë¡ doSomething()
륌 ì¬ì ìíì§ë§ ìµì íëì§ ìì ë°©ììŒë¡ ìŒë¶ ê²ì¬ê° ëëœë ê²ì ì°Ÿêž° ìíŽ ì¢
ìì±ì ì
ë°ìŽíží ë ë°©ë²ìŽ ììµëë€. ìŽê²ìŽ @overrides
ë°ìœë ìŽí°ê° ê²°ìœ ì¶©ë¶íì§ ìì ìŽì ì
ëë€.
ì°ëŠ¬ìê² íìí ê²ì override
í€ìëì --no-implicit-override
컎íìŒë¬ íëê·žì
ëë€.
override
í€ìëë ëŽ íë¡ì ížìì 몚ë êµ¬ì± ìì륌 ë§ë€êž° ìíŽ êž°ë³ž íŽëì€ì ê°ëší ê³ìžµ 구조륌 ì¬ì©íêž° ë묞ì ë§ì ëììŽ ë©ëë€. ëŽ ë¬žì ë ìŽë¬í êµ¬ì± ììê° ë€ë¥ž ê³³ìì ì¬ì©í ë©ìë륌 ì ìžíŽìŒ í ìë ìê³ ìŽ ë©ìëê° ë¶ëªš íŽëì€ìì ì ìëê±°ë ì ìëì§ ìì ìë ìê³ ëŽê° íìí ìì
ì ìŽë¯ž ìííê±°ë ìííì§ ìì ìë ìë€ë ì¬ì€ì ììµëë€.
ì륌 ë€ìŽ validate
íšìê° getValue()
ë©ìë륌 맀ê°ë³ìë¡ ì¬ì©íë íŽëì€ë¥Œ ì¬ì©íë€ê³ ê°ì íŽ ë³Žê² ìµëë€. ìŽ íŽëì€ë¥Œ ë¹ëíêž° ìíŽ ìŽë¯ž ìŽ getValue()
ë©ìë륌 ì ìí ì ìë ë€ë¥ž íŽëì€ë¥Œ ììí ì ìì§ë§ ìì€ ìœë륌 ë³Žì§ ìë í ìŽê²ì ì€ì ë¡ ì ì ììµëë€. ëŽê° 볞ë¥ì ìŒë¡ í ìŒì ëŽ íŽëì€ìì ìŽ ë©ìë륌 구ííë ê²ìŽê³ ìëª
ìŽ ì ííêž°ë§ íë©Ž ì묎ë ëìê² ì묎 ë§ë íì§ ìì ê²ì
ëë€.
íì§ë§ ìë§ë ëë ê·žë ê² íì§ ë§ììŽìŒ íë€. ë€ì ê°ë¥ì±ì 몚ë ëŽê° ììì ì¬ì ì륌 ìííë€ê³ ê°ì í©ëë€.
super
륌 ížì¶íë ê²ìŽì§ë§ ì묎ë ê·žë ê² íëë¡ ì ìíì§ ìììµëë€.íì ì¬ì ì í€ìëê° ììŒë©Ž "ìŽëŽ, ì¬ì ìíê³ ììŒë¯ë¡ ìì ì ìííêž° ì ì ìë ë°©ë²ìŽ ìŽë»ê² ì게ëì§ íìžíŽìŒ í ê²"ìŽëŒê³ ëìê² ë§íì ê²ì ëë€. ê·žë¬ë©Ž ììì ëí 겜íìŽ í¬ê² í¥ìë ê²ì ëë€.
ë¬Œë¡ , ì ìë ëë¡, ìŽê²ì ëžë ìŽí¹ 첎ìžì§ìŽê³ ëë¶ë¶ì ì¬ëë€ìŽ ìŽ ëªšë ê²ì ëíŽ ê·žë€ì§ ì 겜 ì°ì§ ìêž° ë묞ì --no-implicit-override
íëê·ž ìëì ë°°ì¹ëìŽìŒ í©ëë€.
any
ë° --no-implicit-any
ë¡ ë§ë ë¹êµ @eggers ê° ë§ìì ëëë€. 죌ìì ì¢
ë¥ê° ê°ê³ ì íí ê°ì ë°©ììŒë¡ ìëíêž° ë묞ì
ëë€.
@olmobrutall ì¶ì ë©ìë ë° ìží°íìŽì€ ë©ìë ì¬ì ìì ëí ê·íì ìŽìŒêž°ë¥Œ ë³Žê³ ìììµëë€.
ëŽ ì견ìŒë¡ë override
ê° super.
ì ì¡Žì¬ë¥Œ ììíë€ë©Ž ìží°íìŽì€ì ì ìë ì¶ì ë©ìëë ë©ìëë 몚ë super.
ížì¶ì íµíŽ ížì¶í ì ììŒë¯ë¡ ì¬ì ìí ì ììµëë€( ì¬ì ìí ê²ìŽ ìì). ëì ìŽë¬í 겜ì°ì ëíŽ ë ëª
ìì ìž ìì
ì ìííë ê²œì° implements
í€ìëì¬ìŒ í©ëë€. ê·žë¬ë ê·žê²ì ë³ëì êž°ë¥ ë
Œìê° ë ê²ì
ëë€.
ì¬êž°ì ëŽê° 볌 ë ê°ì¥ ì€ìí 묞ì ë¶í° ê°ì¥ ë®ì ììê¹ì§ ââ묞ì ê° ììµëë€. ëŽê° ëì¹ ê² ìë?
ë€ì곌 ê°ì 겜ì°ê° ìëë©Ž Ʞ볞 íŽëì€ ë©ìë륌 ì¬ì ìíê³ ìë€ê³ _ìê°_íêž° ìœìµëë€.
class Base {
hasFilename(f: string) { return true; }
}
class Derived extends Base {
// oops
hasFileName(f: string) { return false; }
}
ìŽê²ìŽ ê°ì¥ í° ë¬žì ìŒ ê²ì ëë€.
ìŽê²ì í¹í 구íë ìží°íìŽì€ì ì íì ìì±ìŽ ìë ê²œì° ë§€ì° ë°ì íê² êŽë šëìŽ ììµëë€.
interface NeatMethods {
hasFilename?(f: string): boolean;
}
class Mine implements NeatMethods {
// oops
hasFileName(f: string) { return false; }
}
ìŽê²ì _ì¬ì ì ì€íš_ë³Žë€ ë ì€ìí 묞ì ìŽì§ë§ ì¬ì í ëì©ëë€.
깚ë«ì§ 못í ì± êž°ë³ž íŽëì€ ë©ìë륌 ì¬ì ìí ì ììµëë€.
class Base {
hasFilename(f: string) { return true; }
}
class Derived extends Base {
// I didn't know there was a base method with this name, so oops?
hasFilename(f: string) { return true; }
}
ìŽê²ì ê°ë¥í ë©ìë ìŽëŠì ê³µê°ìŽ ë§€ì° í¬ê³ ì²ìë¶í° ìŽ ìì ì ìííë€ë ìë¯žê° ìë _ê·žëŠ¬ê³ _ ížíëë ìëª ë ìì±í ê°ë¥ì±ìŽ ë®êž° ë묞ì ë¹êµì ë묌ìŽìŒ í©ëë€.
any
sì¬ì ì ë©ìëê° êž°ë³ž 맀ê°ë³ì ì íì ì»ì ê²ìŽëŒê³ ìê°íêž° ìœìµëë€.
class Base {
hasFilename(f: string) { return true; }
}
class Derived extends Base {
// oops
hasFilename(f) { return f.lentgh > 0; }
}
ìŽ ë§€ê°ë³ì륌 ìëìŒë¡ ì
ë ¥íë €ê³ íì§ë§ 묞ì ê° ë°ìíìµëë€. hasFilename
ê° ëª
ìì ìŒë¡ override
ë¡ íìë ê²œì° ìŽë¬í 묞ì 륌 ë ìœê² íŽê²°í ì ììµëë€.
ë©ìëê° êž°ë³ž íŽëì€ ë©ìë륌 ì¬ì ìí ëì ì¬ì ìíì§ ìì ë ìŠì ëª ííì§ ììµëë€. ì€ëë ì¬ì©í ì ìë í©ëŠ¬ì ìž íŽê²° ë°©ë²(ìœë©íž, ë°ìœë ìŽí°)ìŽ ìêž° ë묞ì ìŽê²ì ë ìì 묞ì ì²ëŒ 볎ì ëë€.
íì íŽëì€ ì¬ì ì ë©ìë륌 ìì±í ë Ʞ볞 ë©ìë ìŽëŠì ìëìŒë¡ ì ë ¥íŽìŒ íë¯ë¡ ì±ê°ì ìŒì ëë€. ìì± ëª©ë¡ì íì íŽë¹ ìŽëŠì ì ê³µíì¬ ìŽ ë¬žì 륌 ìœê² ê³ ì¹ ì ììŒë¯ë¡(ì¬ì€ ìŽë¯ž ìŽì ëí ë²ê·žê° ìë€ê³ ìê°í©ëë€) ìŽ ë¬žì 륌 íŽê²°íêž° ìí ìžìŽ êž°ë¥ìŽ ì€ì ë¡ íìíì§ ììµëë€.
ìŽê²ì ë³ëì 묞ì ì ìíê±°ë ëšìí ìŒìŽëì§ ìì ê²ìŒë¡ ëìŽ:
override
ì íŒí©ëìŽìŒ íë ê²ìŽ ìëë©° ì€ì ë¡ ë§ì ì¢ì ìë늬ì€ìì ë°ëì§íì§ ìì ì믞륌 ê°ì§ê³ ììµëë€.implements.foo = ...
). ì¬êž°ìì ìì 거륌 í íìê° ììµëë€.@RyanCavanaugh ì ë ê·ž ììì ëíŽ ìì 몚ë ëŽì©ì ëìí©ëë€. ì견ìŒë¡ override
í€ìëê° "구í ì€íš" 묞ì 륌 íŽê²°íŽìŒ íë€ê³ ìê°íì§ ììµëë€. ììì ë§íë¯ìŽ ìŽ ë¬žì ë ë€ë¥ž í°ìŒì ìŒë¶ë¡ ë€ë¥ž í€ìë(ì: implements
)ë¡ íŽê²°íŽìŒ íë€ê³ ìê°í©ëë€. ( override
ë super.
ë©ìë륌 ì믞íŽìŒ íš)
@RyanCavanaugh 몚ë ìì ì ëìíì§ë§ ì íì ì¬ì ìíì§ ìê³ (ê·žë° ë€ì ì í ê²ì¬ë¥Œ ìì) ìì ì íìì ì ìžë ìŽêž°íë íëì ë§€ì° êŽë šë 묞ì ì ëí 찞조륌 볌 ì ììµëë€. ë©ìëê° ê°ì²Ž íëì íšììŒ ë¿ìž ìžìŽì ë©ìë ì ìžì êž°ë¥ìŽ êµíëìŽìë ì ëë€ê³ ìê°í©ëë€.
@eggers ë§ì§ë§ì ë ê°ì í€ìëê° íìíëëŒë ìë¯žë¡ ì ë§€ì° ì ì¬í ê²ìŽê³ êž°ë¥ì íšê» ë ŒìëìŽìŒ íë€ê³ ìê°í©ëë€.
ì¬ì ìë ìíŒë¥Œ ì믞íŽìŒ í©ëë€. ë°©ë²
C#ìì ì¬ì ìë ì¶ì ë©ìë(.super ììŽ)ìë ì¬ì©í ì ìê³ ì¬ì©íŽìŒ í©ëë€. Javaìì @override ë ìì±ì ëë€. ë¬Œë¡ ìžìŽë ë€ë¥Žì§ë§ ì ì¬í í€ìë륌 ì¬ì©íë©Ž ì ì¬í ëìì ììí©ëë€.
ëë @RyanCavanaugh ì ìì ì ëìíì§ë§ "ì°ë°ì ì¬ì ì" 묞ì ê° ê·žê° ìê°íë ê²ë³Žë€ ì¡°êž ë ìŒë°ì ìŒ ì ìë€ê³ ë§íê³ ì¶ìµëë€(í¹í ìŽë¯ž ë€ë¥ž ê²ì íì¥íë íŽëì€ë¥Œ íì¥í ë ìŽë¯ž 첫 ë²ì§ž íì¥ìì componentWillMount
ë©ìë륌 ì ì).
@eggers ê° ë§íë¯ìŽ "구í ì€íš" 묞ì ë ìë¹í ë€ë¥ž 묞ì ìŽë©° ë¶ëªš íŽëì€ì ì¡Žì¬íì§ ìë ë©ìëì ëíŽ override
í€ìë륌 ì¬ì©íë ê²ìŽ ìŽìíê² ëê»Žì§ ê²ìŽëŒê³ ìê°í©ëë€. ëë ìŽê²ìŽ ë€ë¥ž 묞ì 륌 ê°ì§ ë€ë¥ž ìžìŽëŒë ê²ì ìê³ ìì§ë§ C#ììë override
ê° ìží°íìŽì€ì ì¬ì©ëì§ ììµëë€. --no-implicit-override
íë귞륌 ì»ì ì ìë€ë©Ž íŽë¹ ìží°íìŽì€ ë©ìëì ìží°íìŽì€ ìŽëŠì ì ëìŽë¡ ë¶ì¬ìŒ íë€ê³ ì ìí©ëë€(C#곌 ë§€ì° ì ì¬íë¯ë¡ ë ìì°ì€ëœê² ëê»Žì§ ê²ì
ëë€).
ê°ì ê²
interface IBase {
method1?(): void
}
class Base {
method2() { return true; }
}
class Test extends Base implements IBase {
IBase.method1() { }
override method2() { return true; }
}
@RyanCavanaugh ê° ê·Œë³žì ìž ë¬žì 륌 ëìŽíë€ê³ ìê°í©ëë€. ëë ê·žê²ì "ë¶ìŒì¹ë 묎ììžê°"ë¡ ë³Žìí ê²ì ëë€.
override
ë¡ ê°ì£Œë©ëê¹? ì륌 ë€ìŽ: interface IDrawable
{
draw?( centerPoint: Point ): void;
}
class Square implements IDrawable
{
draw( centerPoint: Point ): void; // is this an override?
}
override
ë¡ ê°ì£Œëë ìží°íìŽì€ì ìŒì¹íëë¡ ìì±ì ì ìžíê³ ììµëê¹? interface IPoint2
{
x?: number;
y?: number;
}
class Circle implements IPoint2
{
x: number; // is this an override?
y: number; // is this an override?
radius: number;
}
override
í€ìë ëì ìì 겜ì°ë¥Œ ì²ëŠ¬íêž° ìíŽ ìŒì¢
ì implements
í€ìëê° íìíê³ íììŽ íìí©ëë€.@kevmeister68 ë¶ìŒì¹ë¥Œ ëª ìì ìŒë¡ ìžêžíŽì£Œì ì ê°ì¬í©ëë€.
í ê°ì§: ì€ì ë¡ ë¬žì 륌 íìíë €ë©Ž ìží°íìŽì€ ë©€ë²ë¥Œ ì í ì¬íìŒë¡ ë§ë€ìŽìŒ í©ëë€. ìŽì ê°ìŽ typescript 컎íìŒë¬ë íë ëë ë©ìëê° êµ¬íëì§ ìì ë "구í ì€íš"륌 íŽê²°íë©Žì ë¶íí ê²ì ëë€.
@olmobrutall ê°ì¬í©ëë€. ì ë ë©ìë륌 ì íì ìŒë¡ ì ìží ì ìŽ ììµëë€. ê°ë¥í©ëê¹(ì ë C# 배겜ìì ììŒë©° ê·žë¬í ê°ë ì ììµëë€)? ë©€ë² ë³ì륌 ì í ì¬íìŒë¡ ë³ê²œíêž° ìíŽ ìì ëìŽë ìì 륌 ì ë°ìŽížíìµëë€. ë ëìê°ì?
@kevmeister68 draw
ë©ìëë IDrawable
ìì :)
@RyanCavanaugh
충ë¶íì§ ìì ìŽêµì ìž êµ¬ë¬ž(ì:implements.foo = ...). ì¬êž°ìì ìì 거륌 í íìê° ììµëë€.
ìë¡ìŽ íí ì ê°ë¥Žì³ 죌ì ì ê°ì¬í©ëë€. êž°ë¥ì ìë¯žë¡ ìì ë§ì 묞ì ê° ë³ŽìŽì§ ììµëë€.
ëë¶ë¶ì 묞ì ë ë€ì곌 ê°ìŽ ììíë 구묞곌 ëìì ìì¡Ží©ëë€.
ížëŠ¬ë¥Œ ë ì ë§í 구묞ì ë¹êµíŽ ë³Žê² ìµëë€.
class Person{
dateOfBirth: Date;
abstract talk();
walk(){ //...}
}
interface ICanFly{
fly?();
altitude?: number;
}
class SuperMan extends Person implements ICanFly {
dateOfBirth = new Date(); //what goes here?
override talk(){/*...*/}
walk = () => {/* force 'this' to be captured*/} //what goes here
implements fly() {/*...*/}
altitude = 1000; //what goes here?
}
ì¥ì :
extends
/ implements
ì ë¹êµí ë ëëìŽ ì³ìµëë€.ëšì :
override
ëë implements
ê° ì³ë€ê³ ë껎ì§ì§ ììµëë€. ìë§ë super.
ìŽì§ë§ ìží°íìŽì€ë¡ 묎ìì í ê¹ì?function()
ì ëë€(ìŽë¥Œ 캡ì²íë ë° ì ì©)륌 ì¬ì©íì¬ ë©ìë륌 ì¬ì ìíë©Ž ëìŒí 묞ì ê° ë°ìí©ëë€.InterfaceName.
class Person{
dateOfBirth: Date;
abstract talk();
walk(){ //...}
}
interface ICanFly{
fly?();
altitude?: number;
}
class SuperMan extends Person implements ICanFly {
dateOfBirth = new Date(); //what goes here?
override talk(){/*...*/}
walk = () => {/* force 'this' to be captured*/} //what goes here
ICanFly.fly() {/*...*/}
ICanFly.altitude = 1000; //what goes here?
}
ì¥ì :
super.
륌 ì¬ì©í ì ììµëë€.ëšì :
this.
class Person{
dateOfBirth: Date;
abstract talk();
walk(){ //...}
}
interface ICanFly{
fly?();
altitude?: number;
}
class SuperMan extends Person implements ICanFly {
this.dateOfBirth = new Date();
this.talk(){/*...*/}
this.walk = () => {/* force 'this' to be captured*/}
this.fly() {/*...*/}
this.altitude = 1000;
}
ì¥ì :
this.
륌 ì¬ì©íì¬ ìë ìì±ì ì€ííë ê²ì ìì°ì€ëœìµëë€.ëšì :
ì í ì¬íìŽ ìë ìží°íìŽì€ ë©ìë륌 구ííì§ ëª»íë©Ž 컎íìŒë¬ ì€ë¥ê° ë°ìíì§ë§ ìží°íìŽì€ê° 믞ëì ìŽë ìì ìì ë³ê²œëë©Ž(ë©ìëê° ì ê±°ëë€ê³ ê°ì íŽ ëŽ ìë€) íŽë¹ ë©ìë륌 구íí 몚ë íŽëì€ì ëíŽ ê²œê³ ê° íìëì§ ììµëë€. ìŽê²ì ì í ì¬íë§íŒ í° ë¬žì ê° ìë ìë ìì§ë§ ìŽê²ì ë²ìë ê·žê²ë€ì ëìŽì ë€ê³ ë§íë ê²ìŽ ê³µì íë€ê³ ìê°í©ëë€.
ê·žë¬ë ëë ì¬ì í override
ê° ë¶ëª
í ë€ë¥ž ê²ìŽë©° ì ì¬ì ìŒë¡ íëê° ìë ë ê°ì í€ìë륌 ê°ë ê²ìŽ íë¡ê·žëšì ìë륌 ë ì ì ë¬í ê²ìŽëŒê³ 믿ìµëë€.
ì륌 ë€ìŽ ê°ë°ìê° ì€ì ë¡ êž°ë³ž íŽëì€ìì ìŽë¯ž ì ìžë ë©ìë륌 ì¬ì ìí ë ìží°íìŽì€ ë©ìë륌 구ííê³ ìë€ê³ _믿ë_ ìë늬ì€ë¥Œ ìê°íŽ 볎ììì€. ë ê°ì í€ìë륌 ì¬ì©íì¬ ì»ŽíìŒë¬ë ìŽë¬í ì¢
ë¥ì ì€ì륌 ë°©ì§íê³ method already implemented in a base class
í€ì ì€ë¥ë¥Œ ëì§ ì ììµëë€.
interface IDelegate {
execute?() : void;
}
class Base implements IDelegate {
implement public execute() : void { /// fine, this is correctly implementing execute
}
}
class Derived extends Base {
implement public execute() : void {
/// ERROR: `method "execute():void" already implemented in a base class`
}
}
ìŽê²ìŽ JSì êŽë šìŽ ìëì§ë ëªšë¥Žê² ì§ë§ íŽëì€ íëë OOìì ë¹ê³µê°ë¡ ê°ì£Œëë¯ë¡ íëê° ë¹ê³µê°ëŒë ì¬ì€ìŽ ìŽë¯ž ì°ëŠ¬ê° ìì í ì¬ì ìíë ê²ì ë°©ì§íêž° ë묞ì ëª ìì ìŒë¡ íë륌 ì¬ì ìí íìê° ìë€ê³ ìê°í©ëë€. .
íì§ë§ ìžì€íŽì€ ë©ìëë íëìŽê³ ëŽê° ìì§í ê²ìì ë§ì ì¬ëë€ìŽ íë¡í íì ë©ìë ëì ì¬ì©í©ëë€. ê·žê²ì ëíŽ,
class Person{
walk(){ //...}
}
class SuperMan extends Person {
walk = () => {/* force 'this' to be captured*/}
}
walk
ë Person
SuperMan
ì ìžì€íŽì€ ë©ìëìŽêž° ë묞ì 컎íìŒë¬ ì€ë¥ì
ëë€.
ìŽìšë override
ê° ì¬êž°ì ì í©íì§ ì ëªšë¥Žê² ìµëë€. ìëíë©Ž ì°ëŠ¬ë íë륌 ì¬ì ìíì§ ìêž° ë묞ì
ëë€. ë€ì ë§íì§ë§ C#ì²ëŒ 볎ìŽì§ë§ ì¬êž°ìë override
ëì new
í€ìë륌 ì¬ì©í©ëë€. ë©ìë ì¬ì ìì ëìŒíì§ ìêž° ë묞ì
ëë€(ì¬êž°ê° ìëëŒ ì¬ì ììì super.myMethod
륌 ížì¶í ì ìì).
ëŽê° ì ížíë ì룚ì ì ë€ì곌 ê°ìµëë€(ì격í ì¬ì ì 몚ëì ìë€ê³ ê°ì ).
class Person{
dateOfBirth: Date;
talk() { }
walk = () => { }
}
interface ICanFly {
fly?();
altitude?: number;
}
class SuperMan extends Person implements ICanFly {
new dateOfBirth = new Date();
override talk() { }
new walk = () => { }
implements fly() {/*...*/}
implements altitude = 1000;
}
ëŽ ì£Œì êŽì¬ì¬ë ìží°íìŽì€ì êŽí ê²ì
ëë€. ì°ëŠ¬ë 컎íìŒë¬ì ìíŽ ìŽë¯ž ì¡í ê²ìŽêž° ë묞ì ì íì ìží°íìŽì€ ë©€ë²ê° ìë ê²œì° implements
륌 ìž íìê° ììµëë€. ê·žë° ë€ì ê·žë ê² íë©Ž 몚ë ìží°íìŽì€ ë©€ë²ì ì ëì¬ê° implements
ê° ìëêž° ë묞ì ìží°íìŽì€ìì ê°ì žìš ê²ê³Œ ê·žë ì§ ìì ê² ì¬ìŽì íŒëìŽ ìì ê²ì
ëë€. ê·žëŠ¬ê³ ê·ž ëšìŽë í ì
ì
ëë€. ëë ë€ì곌 ê°ìŽ ìž ì€ë¹ê° ëì§ ìììµëë€.
class C extends React.Component {
implements componentWillMount() { }
implements componentDidMount() { }
implements componentWillReceiveProps(props) { }
/// ... and the list goes on
}
ëë ë ìŒì° ìží°íìŽì€ ìŽëŠìŒë¡ ì ëì¬ë¥Œ ë¶ìŒ ê²ì ì ìíì§ë§ @olmobrutall ì ê·žê²ìŽ ë ëì ìê°ìŽëŒë ê²ì ëìê² ë³Žì¬ì£Œìë€.
ìŽìšë ìŽ ë¬žì 륌 ì ëë¡ íŽê²°íë €ë©Ž 3ê°ì ë€ë¥ž ì í€ìëê° íìíë€ê³ íì í©ëë€.
ëë ëí 컎íìŒë¬ê° ìŽë¯ž ížíëì§ ìë ê²ì ìì±íë ê²ì ë°©ì§íêž° ë묞ì, í¹í ì¬ë°ë¥Žê² íêž°ê° ë¶ëª í ìŽë µêž° ë묞ì ì¬ì ì륌 ììì ìŒë¡ ì ë ¥í íìê° ìë€ê³ ìê°íì§ ììµëë€.
new
, override
ë° implement
볞ì§ì ìŒë¡ ëìŒí JS ì믞 첎ê³ì ëíŽ ë묎 ë§ì í€ìë ì€ë²í€ëê° ìëê°ì? C#ìì ê·žê²ë€ìŽ ë€ë¥ž ê²ìŽëëŒë JS/TSììë ì¬ì€ì ì°šìŽê° ììµëë€.
ëí ìë¹í 몚íží©ëë€.
new
implements
ìž ìŽì ë 묎ìì
ëê¹?override
, implements
, ë ì€ íë ëë ë ë€ ëìì?ëí ìŽê²ì ëíŽ ìê°íŽë³Žììì€.
class Animal {
}
class Human extends Animal {
}
class Habitat {
owner: Animal;
}
class House extends Habitat {
owner = new Human();
}
var house = new House();
house.owner = new Dog(); //Should this be allowed??
ì§ë¬žì ~ìŽìŒ:
owner = new Human();
ë ìë¡ìŽ(ê·žë¬ë íží ê°ë¥í) ì íìŒë¡ íë륌 ì¬ì ìíê±°ë ê°ì í ë¹í©ëë€.
_magic í€ìë_륌 ì¬ì©íë 겜ì°ë¥Œ ì ìžíê³ ìŒë°ì ìŒë¡ íë륌 ì¬ì ìíë€ê³ ìê°í©ëë€. ëŽ ì ížëë ì§êž this.
ì
ëë€.
class House extends Habitat {
this.owner = new Human(); //just setting a value, the type is still Animal
}
@olmobrutall ê·žê²ì ì€ì ë¡ ìœê°ì í€ìë ì€ë²í€ëê° ë ì ìì§ë§ 3ê°ì§ 몚ë ì€ì ë¡ _ë€ë¥ž_ ê²ì ëë€.
override
ë ë©ìë(íë¡í íì
ì ì ìëš)ì ì ì©ë©ëë€. ìŠ, super
ë€ìì ê³ì ì¡ìžì€í ì ìë ìë ë©ìë륌 ì§ì°ì§ _íì§_ ììµëë€.new
ë íëì ì ì©ëë©° ìë íëê° ì íëì ìíŽ ì§ìì¡ìì ì믞í©ëë€.implements
ë ìží°íìŽì€ì 몚ë ê²ì ì ì©ëë©° ìží°íìŽì€ê° "ì¡Žì¬íì§ ìêž°" ë묞ì ë¶ëªš íŽëì€ì ìŽë¯ž ì¡Žì¬íë ê²ì ì§ì°ê±°ë ë첎íì§ ìëë€ë ê²ì ì믞í©ëë€.ìží°íìŽì€ë¡ 구íë Ʞ볞 íŽëì€ìì ë©ìë륌 ë³ê²œíë ê²œì° ë¬Žìì ì¬ì©íŽìŒ í©ëê¹? ëë 4ê°ì§ ê°ë¥ì±ì 볌 ì ììµëë€.
ë¹ì ìŽ ì¬êž°ì íšê³Œì ìŒë¡ íê³ ìë ìŒìŽ override
ê° ë ê²ìŽëŒë ê²ìŽ ì ê²ë ꜀ ë
ŒëŠ¬ì ìž ê² ê°ìµëë€. implements
ë ê·žë ì§ ììŒë©Ž ì¡Žì¬íì§ ìë ìží°íìŽì€ìì 묎ìžê°ë¥Œ 구ííê³ ììì ì믞í©ëë€. ìŽë€ ì믞ìì override
ë° new
ë implements
ë³Žë€ ì°ì ììê° ëìµëë€.
ê·žëŠ¬ê³ íë ì¬ì ì ìì ì ëíŽ ì€ëë ìë ë°©ìì ëíŽ ì묎 ê²ë ë³ê²œíŽìë ì ë©ëë€. ì¬êž°ìì ë¬Žìš ìŒìŽ ìŒìŽëëì§ ì ëªšë¥Žê² ì§ë§ ê·žê²ìŽ 묎ììŽë ë³ê²œëìŽìë ì ë©ëë€.
ëë override
ê° ì¶ìì ìž ê²ì í¬íšíì¬ êž°ë³ž ë©ìëì ìì± ëªšëì ì í©í ê²ìŽëŒê³ ìê°í©ëë€(ìëì ì€ëª
ëš).
new
ë ê°ë
ì ìŒë¡ë í¥ë¯žë¡ìŽ ììŽëìŽìŽì§ë§ ìŽ í¹ì í€ìëë íŽëì€ ìžì€íŽì€íì íŒëë ì ììŒë¯ë¡ ìì±ì Ʞ볞, ìží°íìŽì€, ê³µì©ì²Žë¥Œ ê°ì§ ì ìììë ë¶êµ¬íê³ íŽëì€ììë§ ìëíë€ë ì못ë ìžìì ì€ ì ììµëë€. ëë íšì ì íë ììµëë€. ìë§ë reassign
ì ê°ì ë€ë¥ž í€ìëê° ê±°êž°ìì ë ì ìëí ì ìì§ë§ ê°ìŽ ë€ì ì ìžëì§ë§ ì€ì ë¡ íì íŽëì€( new
ìë ê·ž 묞ì ê° ìì ì ììµëë€). redefine
ë í¥ë¯žë¡ë€ê³ ìê°íì§ë§ 'ì¬ì ì' ìì±ë Ʞ볞 ìì±ê³Œ ë€ë¥ž ì íì ê°ì§ ì ìë€ë ì못ë ìììŒë¡ ìŽìŽì§ ì ììŒë¯ë¡ íì€íì§ ììµëë€. (_edit: ì€ì ë¡ íìžíìµëë€. ìë¡ìŽ ê²ìŽ Ʞ볞 ì íì íì ì íìž í ë€ë¥ž ì íì ê°ì§ ì ììŒë¯ë¡ ê·žë ê² ëìì§ ìì ì ììµëë€_).
implement
(ëë override
ìì ìŒêŽì±ì ìíŽ ìŽ í¹ì ëì¬ íìì ì ížíš) ìží°íìŽì€ìì ìëíë ê² ê°ìµëë€. êž°ì ì ìŒë¡ ì¶ì Ʞ볞 ë©ìëììë ìëí ì ìë€ê³ ìê°íì§ë§ ìœê° ë€ë¥ž ì믞 첎ê³ìë ë¶êµ¬íê³ override
륌 ì¬ì©íë©Ž ë ìŒêŽëê² ëë ì ììµëë€. ë ë€ë¥ž ìŽì ë ë©ìë륌 ì¶ìíìì ë¹ì¶ìíë¡ ë³ê²œíë ê²ìŽ ìœê° ë¶íží ì ìêž° ë묞ì
ëë€. íìí 몚ë íì íŽëì€ë¡ ìŽëíì¬ override
륌 implement
ë¡ ë³ê²œíŽìŒ íêž° ë묞ì
ëë€.
ë ì¢ì ììŽëìŽê° ìì ì ìì§ë§ íì¬ë¡ìë ê·žê² ì ë¶ì ëë€.
C#ìŽ ìŽ ì íí êž°ë¥ì ì¬ì©íë í€ìëìŽêž° ë묞ì new
í€ìë륌 ì ìíì§ë§ ìŽê²ìŽ ìµì ì í€ìëë ìëëŒë ë° ëìí©ëë€. implement
ë ì€ì ë¡ implements
ë³Žë€ ë ëì ì íì
ëë€. ì¶ì ë©ìëë ìží°íìŽì€ê° ìëëŒ êž°ë³ž íŽëì€ì ìŒë¶ìŽêž° ë묞ì ì¶ì ë©ìëì ì¬ì©íŽìë ì ëë€ê³ ìê°í©ëë€. override
+ new
-> Ʞ볞 íŽëì€, implement
-> ìží°íìŽì€. ê·žê² ë ëª
ííŽ ë³Žì
ëë€.
@JabX
ëë íìžíê³ ë¹ì ìŽ ì³ììµëë€.
class Person{
walk(){ //...}
}
class SuperMan extends Person {
walk = () => {/* force 'this' to be captured*/}
}
컎íìŒë¬ ì€ë¥ë¡ ì€íš: Class 'Person' defines instance member function 'walk', but extended class 'SuperMan' defines it as instance member property.
ë¶ëªš ì í ê³ìœìŽ ìŽíëê³ ìŽìšë ë€ì곌 ê°ìŽ ìì±í ì ìêž° ë묞ì ìŽ ê²œì° ì€íší ìŽì ê° ììµëë€.
var p = new SuperMan();
p.walk = () => { };
ëë
class SuperMan extends Person {
constructor() {
super();
this.walk = () => { };
}
}
override
ì¬ì ìë ë©ìë(íë¡í íì ì ì ìëš)ì ì ì©ë©ëë€. ìŠ, super ë€ìì ê³ì ì¡ìžì€í ì ìë ìë ë©ìë륌 ì§ì°ì§ ììµëë€.
ê·žê²ì ì€ì ë¡ ë
Œìì
ëë€. override
ì implements
ì¬ìŽìë ìµìí _ìŒë¶_ êŽì°° ê°ë¥í ì°šìŽê° ìì§ë§ ... ê·žë ì§ë ììµëë€.
override
ë° implements
몚ë prototype
super
super()
ì¬ì©í ì ìë ê²ì ë
늜ì ì
ëë€ super.walk()
super()
, 몚ë ë©ìë(ì¬ì ì, 구í, ëŽì€ ë° ìŒë° ì ì)ìì ì¬ì©í ì ììµëë€.
class SuperMan extends Person implements ICanFly {
new dateOfBirth = new Date();
override talk() { } //goes to prototype
new walk = () => { }
implements fly() {/*...*/} //also goes to the prototype
implements altitude = 1000;
}
ê·žëŠ¬ê³ super.walk()
륌 ì¬ì©í ì ìë ê²ì ìžì€íŽì€ì í ë¹íë 겜ì°ìë ìëí©ëë€.
class SuperMan extends Person {
constructor() {
super();
this.walk = () => { super.walk(); };
}
//or with the this. syntax
this.walk = () => { super.walk(); };
}
prototype
íë륌 ìžì€íŽì€ íëì 구ë³íë ëª
íí ë°©ë²ìŽ ìŽë¯ž ììŒë©° =
í í°ì
ëë€.
class SuperMan extends Person implements ICanFly {
this.dateOfBirth = new Date(); //instance
this.talk() { } //prototype
this.walk = () => { } //instance
this.fly() {/*...*/} //prototype
this.altitude = 1000; //instance
}
this.
구묞ì ì¬ì©íë©Ž 묞ì ê° ë³Žë€ ì°ìíê² íŽê²°ë©ëë€.
this.
ë ëŽ ì í(Ʞ볞 íŽëì€ ë° êµ¬íë ìží°íìŽì€)ì íìžíë ê²ì ì믞í©ëë€.=
ë íë¡í íì
ëì ìžì€íŽì€ì í ë¹ì ì믞í©ëë€.New
new
ë íëì ì ì©ëë©° ìë íëê° ì íëì ìíŽ ì§ìì¡ìì ì믞í©ëë€.
ì í 첎ê³ë¥Œ 깚ëšëŠŽ ê²ìŽêž° ë묞ì ë€ë¥ž ì íìŒë¡ íëë ë©ìë륌 ë³ê²œí ì ìë€ë ì ì ê³ ë €íììì€. C# ëë Javaìì new
륌 ìíí ë ì ë©ìëë ì ì íì ëíŽ ì ì ìŒë¡ ëì€íšì¹ë ížì¶ìë§ ì¬ì©ë©ëë€. Javascriptìì 몚ë ížì¶ì ëì ìŽë©° ì íì ë³ê²œíë©Ž ìœëê° ë°íìì ì€ëšë ì ììµëë€(ì í ê°ì ë³íì ì€ì©ì ìž ëª©ì ì ìíŽ íì©ë ì ìì§ë§ íëë íì©ëì§ ìì).
class Person {
walk() { }
run() {
this.walk();
this.walk();
this.walk();
}
}
class SuperMan extends Person {
new walk(destination: string) { } //Even if you write `new` this code will break
}
ë°ëŒì new
ìŽì í€ìëë assign
ìŽìŽìŒ í©ëë€. ìŽê²ìŽ ì ìŒíê² ì íìŽ ìì í ìì
ìŽêž° ë묞ì
ëë€.
class Person{
dateOfBirth: Date;
}
class SuperMan extends Person implements ICanFly {
assign dateOfBirth = new Date();
}
reassign
ë ìë¯žê° ììµëë€. Personì íëë§ ì ìžíê³ íëì ê°ì ì€ì íì§ ìêž° ë묞ì
ëë€.
assign
ì°ë ê²ì ì€ë³µëë ê²ì²ëŒ 볎ìŽì§ë§ ë°ë쪜ì =
ê° ìêž° ë묞ì í ë¹íë ê²ìŽ ë¶ëª
í©ëë€.
ë€ì this.
구묞ì 묞ì 륌 ì ìì ìŒë¡ íŽê²°í©ëë€.
class Person{
dateOfBirth: Date;
}
class SuperMan extends Person implements ICanFly {
this.dateOfBirth = new Date();
}
ëë ìŽê²ì ì믞ìë ë°©ììŒë¡ íëì ìŽë»ê² ì ì©íëì§ ì ëªšë¥Žê² ìµëë€.
ì°ëŠ¬ë íŽëì€ ë³žë¬žìë§ ì ì©í ì ìë í€ìë륌 ì¶ê°íë ê²ì ëíŽ ìŽìŒêž°íê³ ìì§ë§ íëë ìžì€íŽì€ ìëª ëì _몚ë ì§ì _ìì ì¬í ë¹í ì ììµëë€.
Typescript륌 ì¬ì©íë©Ž ìŽë¯ž íŽëì€ ë³žë¬žìì íë륌 ìŽêž°íí ì ììµëë€.
class Person {
dateOfBirth : new Date();
}
ëí ë¶ëªš íŽëì€ì ì ìžë íë륌 ë€ì ìŽêž°íí ì ìì§ë§ ìí©ì ì¢ì§ ììµëë€. ë¬Œë¡ ìŽëŠì ì못 ìž ìë ìì§ë§( override
ì ë¹ì·í 묞ì ) ì íë ì§ìì§ëë€. ìŽë ë€ìì ì믞í©ëë€.
class Person {
fullName: { firstName: string; lastName?: string };
}
class SuperMan extends Person {
fullName = { firstName: "Clark" };
bla() {
this.fullName.lastName; //Error
}
}
ìŽ ìœëë ë€ì곌 íšê» ì€íší©ëë€. ìì± 'lastName'ìŽ(ê°) ì í '{ firstName: string;ì ì¡Žì¬íì§ ììµëë€.
ì°ëŠ¬ë íŽëì€ ë³žë¬žìë§ ì ì©í ì ìë í€ìë륌 ì¶ê°íë ê²ì ëíŽ ìŽìŒêž°íê³ ìì§ë§ íëë ìžì€íŽì€ ìëª ëì ìžì ë ì§ ì¬í ë¹í ì ììµëë€.
ëí ë°©ë²:
class Person {
talk() { }
}
class SuperMan extends Person {
talk() { }
changeMe(){
this.talk = () => { };
}
changeMyPrototype() {
SuperMan.prototype.talk = () => { };
}
}
@kungfusheep ëìí©ëë€. íë륌 ì¬í ë¹í ì ìì§ë§ íë¡í íì
ì ë©ìëë ì¬í ë¹í ì ììµëë€.
"ì¬ì ì" íëì ëí í€ìëê° íìí 죌ë ìŽì ë ìžì€íŽì€ ë©ìëê° íëìŽê³ ì ì í íë¡í íì
ë©ìë ëì ë늬 ì¬ì©ëêž° ë묞ì
ëë€. ìëíë©Ž ëë€ìŽë¯ë¡ 컚í
ì€ížë¥Œ ìë ë°ìžë©íêž° ë묞ì
ëë€.
@olmobrutall
êžì§ëìŽ ìê³ í©ë¹í ìŽì ê° ìë€ê³ ìê°íì§ë§(ê°ì ê²ìŽ ìëë¯ë¡ ížíëì§ ìììŒ íš) íŽëì€ì ìžì€íŽì€ë¥Œ ì§ì ì¡°ìí ë ê·žë ê² í ì ìë€ë ê²ìŽ ì³ìµëë€. ì íì©ëëì§ ì íí 몚륎ì§ë§ ìžìŽ ìë ë°©ìì ë³ê²œíêž° ìíŽ ì¬êž°ì ìë ê²ìŽ ìëë¯ë¡ ì¬êž°ìì ê°ìíŽìë ì ëë€ê³ ìê°í©ëë€.
íŽëì€ ìží°íìŽì€ë íŽëì€ì ìžì€íŽì€ ìž¡, ìŠ íë¡í íì
ì ë©ìëë¿ë§ ìëëŒ íë륌 ì믞í©ëë€. ìží°íìŽì€ìì ìžì€íŽì€ ë©ìëì íë¡í íì
ë©ìë ì¬ìŽì ì°šìŽê° ìë€ê³ ìê°íì§ë ììµëë€. ë©ìë륌 ë ì€ íëë¡ ì€ëª
íê³ ë ì€ íëë¡ êµ¬íí ì ìë€ê³ ìê°í©ëë€. ë°ëŒì implement
ë íëìë ì ì©ë ì ììµëë€.
new
ë override
ì ê°ì ì믞륌 ê°ì žìŒ íë¯ë¡ ë¶ëª
í ì íì ížíëì§ ìë ê²ìŒë¡ ë³ê²œí ì ììµëë€. ë€ì ë§íì§ë§, ì°ëŠ¬ë ìžìŽê° ìëíë ë°©ìì ë³ê²œíì§ ììµëë€. ê°ì ì¢
ë¥ì ì¬ì ìê° ìëêž° ë묞ì ë³ëì í€ìë륌 ìíìµëë€. ê·žë¬ë ëë ë¹ì ìŽ ëìê² ë³Žì¬ì€ ê²ì²ëŒ ìŽë¯ž =
륌 ì¬ì©íì¬ íëì ë©ìë륌 구ë³í ì ìë€ë ë° ëìí©ëë€. ê·žëì ìë§ë ëìŒí í€ìë/구묞ì 몚ížíšìŽ ììŽ ì¬ì©í ì ìì ê²ì
ëë€.
ê·žë¬ë íµí© íë/ë©ìë ì¬ì ì 구묞ì this.method()
ëë this.field
ê° ìëìŽìŒ í©ëë€. ìëíë©Ž ì íší JavascriptìŒ ì ìë ê²ê³Œ ë§€ì° ì ì¬íì§ë§ ê·žë ì§ ìêž° ë묞ì
ëë€. ë©€ë² ìì í€ìë륌 ì¶ê°íë©Ž ì€ì ë¡ TypescriptëŒë ì¬ì€ìŽ ë ëª
ííŽì§ëë€.
this
ë ì¢ì ììŽëìŽìŽë¯ë¡ ì ì ë¹Œê³ ë€ì곌 ê°ìŽ ë 몚íží ê²ì ìì±í ì ììµëë€.
class Superman {
this walk() { }
}
íì§ë§ ê·žëë ìŽìíŽ ë³Žì
ëë€. ê·žëŠ¬ê³ implement
implement
íŒí©íë©Ž ìœê° ìë±íê² ë³ŽìŒ ê²ì
ëë€ this
implement
/ override
ëì€. íëì override
ìì ìë ì¬ì í ì 륌 ì§ìŠëê² íì§ë§ ìž ë²ì§ž 몚íží new
í€ìë륌 ì¬ì©íë ê²ìŽ ë ëì ìë ììµëë€. í ë¹( =
)ì ë©ìëì íëì ì°šìŽë¥Œ ëª
ííê² íêž° ë묞ì ì§êžì êŽì°®ì ê²ì
ëë€(ëª ìê° ì ì ë§í ê²ê³Œë ëì¡°ì ìŒë¡).
ëìí©ëë€. íë륌 ì¬í ë¹í ì ìì§ë§ íë¡í íì ì ë©ìëë ì¬í ë¹í ì ììµëë€.
ë€, TypeScriptìì íë¡í íì ì ì§ì ìì íë ê²ì ëŽë¶ì ìŒë¡ ìŽì§ëœíë ììì ììµëë€. ëšìí 묎ìžê°ì ìžì€íŽì€ì ìì±ì ë€ì í ë¹íë ê²ë§íŒ ìŒë°ì ìŽì§ ììµëë€. 150,000 ëŒìž ìŽìì ìœëë² ìŽì€ìì íë륌 íšìë¡ ì¬ì©íë 겜ì°ë ë§€ì° ë묌Ʞ ë묞ì ë늬 ì¬ì©ëë€ê³ ë§íë ê²ì 죌êŽì ìŒ ì ììµëë€.
ëë ê·íì ë€ë¥ž ì견 ëë¶ë¶ì ëìíì§ë§ ìŽ ë¬žë§¥ìì new
í€ìë륌 ì¬ì©íë ê²ì ëíŽìë ëìíì§ ììµëë€.
150,000 ëŒìž ìŽìì ìœëë² ìŽì€ìì íë륌 íšìë¡ ì¬ì©íë 겜ì°ë ë§€ì° ë묌Ʞ ë묞ì ë늬 ì¬ì©ëë€ê³ ë§íë ê²ì 죌êŽì ìŒ ì ììµëë€.
ëë íì§ ìì§ë§ ëŽ ë©ìëìì this
륌 ì ì íê² ë°ìžë©íë €ë©Ž @autobind
ë°ìœë ìŽí°ì ìì¡ŽíŽìŒ í©ëë€. ìŽë ëì ëšìí ëë€ë¥Œ ìì±íë ê²ë³Žë€ ë²ê±°ë¡ìµëë€. ê·žëŠ¬ê³ ììì ì¬ì©íì§ ìë í íë륌 ì¬ì©íë©Ž ììí ëë¡ ìëí©ëë€. ì ìŽë JS/React ìžê³ììë ES6 íŽëì€ë¥Œ ì¬ì©íë ëë¶ë¶ì ì¬ëë€ìŽ íìŽí íšì륌 ë©ìëë¡ ì¬ì©íê³ ìë€ë ìžìì ë°ììµëë€.
ê·žëŠ¬ê³ ìží°íìŽì€ ë©ìëë ì ì í ë©ìëë ìžì€íŽì€ ë©ìëë¡ êµ¬íë ì ìëë°, ìŽë ì°šìŽì ì ëª íí íë ë° ëììŽ ëì§ ììµëë€.
ì¬ì ìì êŽí í íëìë ë©ìëì ëìŒí 묞ì ê° ìë€ê³ ìê°í©ëë€.
class A {
firstName: string;
get name() {
return this.firstName;
}
}
class B extends A {
firstname = "Joe" // oops
}
ì¬êž°ì ê°ë¥í íŽê²° ë°©ë²ì ìì±ìì íë륌 í ë¹íë ê²ì ëë€.
class B extends A {
constructor() {
this.firstName = "Joe"; // can't go wrong
}
}
ê·žë¬ë ìží°íìŽì€ìë ì ì©ëì§ ììµëë€. ê·žë êž° ë묞ì ì (ê·žëŠ¬ê³ ì¬êž° ìë ë€ë¥ž ì¬ëë€)ë íŽëì€ ë³žë¬žìì íë륌 ì§ì ì ìží ë íëì ì¬ì ì¡Žì¬ë¥Œ íìžíêž° ìíŽ ë¬Žìžê°ê° íìíë€ê³ 믿ìµëë€. ê·žëŠ¬ê³ override
ê° ìëëë€. ìŽì ì¬êž°ì ëª ê°ì§ ë ìê°ì ë£ìŽë³Žë íë 묞ì ê° ìží°íìŽì€ ë©€ë² ë¬žì ì ì íí ëìŒíë€ê³ ìê°í©ëë€. ìŽë¯ž ë¶ëªš íŽëì€ì 구íìŽ ìë ë©ìë(íë¡í íì
ë©ìë ë° ìžì€íŽì€ ë©ìëë ê°ë¥)ì ëíŽ override
í€ìëê° íìíê³ , ì ìëìì§ë§ 구íìŽ ìë í목(ë¹íšì íë í¬íš).
ëŽ ìë¡ìŽ ì ìì ì ì ì ìž member
í€ìë륌 ì¬ì©íë ê²ì
ëë€(ìë§ë ìµì ì ì íì ìë).
interface IBase {
interfaceField?: string;
interfaceMethod(): void
}
abstract class Base {
baseField: number;
baseMethod() { }
baseLambda: () => { };
abstract baseAbstractMethod();
}
class Derived extends Base implements IBase {
member interfaceField = "Hello";
member interfaceMethod() { }
member baseField = 2;
override baseMethod() { }
override baseLambda = () => { };
member baseAbstractMethod() { }
}
override
ë 구íì ìí ê²ìŽëŒê³ ë§íêž° ë묞ì ì¶ì ë©ìëì ëíŽ member
í€ìë륌 ì ííê³ êž°ì¡Ž ëìì ë첎íë€ë ê²ì ëíë
ëë€. ìžì€íŽì€ ë©ìëë í¹ë³í ì¢
ë¥ì íëìŽêž° ë묞ì override
륌 ì¬ì©íŽìŒ í©ëë€(ìŽë ë©ìë ìê·žëì²ê° 구íë ì ìêž° ë묞ì 컎íìŒë¬ì ìíŽ ìŽë¯ž ìžìëš).
Typescriptë JavaScriptì 컎íìŒ íì ì²Ží¬ ë²ì ìŽìŽìŒ íë©° TS륌 ë°°ì°ë©Ž JSë ë°°ììŒ íê³ C#ì ë°°ì°ë©Ž CLRì ëí ì¢ì ì§êŽì ì»ì ì ìë€ê³ ìê°í©ëë€.
íë¡í íì ììì JSì ë©ì§ ê°ë ìŽì ë§€ì° íµì¬ì ìž ê°ë ìŽë©°, TSë ì¬êž°ìì ê·žë€ì§ ìë¯žê° ìë ë€ë¥ž ìžìŽì ê°ë ìŒë¡ ìŽë¥Œ ìšêž°ë €ê³ íŽìë ì ë©ëë€.
íë¡í íì ììì ë©ìëë íë륌 ììíë ê²œì° ìë¬Žë° ì°šìŽê° ììµëë€.
ì륌 ë€ìŽ:
class Rectangle {
x: number;
y: number;
color: string;
}
Rectangle.prototype.color = "black";
ì¬êž°ìë íë¡í íì ê°ì²Žì ê°ëší íë륌 ì€ì íë¯ë¡ 몚ë ì¬ê°íì ìžì€íŽì€ íëê° ììŽë Ʞ볞ì ìŒë¡ ê²ìììŽ ë©ëë€.
class BoundingBox {
override color = "transparent"; // or should be member?
}
ëí member
í€ìëë íŽëì€ì ë€ë¥ž ë©€ë²ë¥Œ ì§í¬íê² ë§ëëë€.
ì°ëŠ¬ìê² íìí ê²ì ê°ì²Ž 늬í°ëŽìŽë ë©€ë² ííììì ìŽë¯ž ê°ì§ê³ ìë ê²ê³Œ ê°ì ì¢ ë¥ì ëì(컎íìŒ ìê° íìž/ìë ìì±/ìŽëŠ ë³ê²œ)ì íŽëì€ ì ìž ì»ší ì€ížìì íì©íë 구묞ì ëë€.
this.
ì ëí ë ëì ëìì .
ê²ì
ëë€.
class Derived {
.interfaceField = "hello";
.interfaceMethod() {}
.baseField = 2;
.baseMethod() {}
.baseLambda = () => {};
.baseAbstractMethod(){};
someNewMethod(){}
someNewField = 3;
}
ê²°ë¡ ì ìŒë¡ ì ë TypesystemìŽ íë¡í íì ìì ìŽë€ ê°ìŽ ì€ê³ ìŽë€ ê°ìŽ ìžì€íŽì€ìì ì€ëì§ ì¶ì íŽìŒ íë€ê³ ìê°íì§ ììµëë€. ìëíë©Ž íë¡í íì ì ëª ë ¹ì ìŒë¡ ì¡ìžì€í ì ììŒë©Ž ìŽë €ìŽ 묞ì ìŽê³ ê° ë¬žì 륌 íŽê²°íì§ ìì ê²ìŽêž° ë묞ì ëë€. JSì ííë ¥ì ì íí©ëë€.
ë°ëŒì íšì íëì íìŽí íšì íëì ë©ìë ì¬ìŽìë ì°šìŽê° ììŒë©°, ì í ìì€í
ììë, ìì±ë ìœëììë ì°šìŽê° ììµëë€( this
ê° ì¬ì©ëì§ ìë 겜ì°).
ìë€ì, ìŽê²ì í¥ë¯žë¡ìŽ ìŒìŽì§ë§ 구첎ì ìŒë¡ override
ìž¡ë©Žìì 볎멎 ꜀ ì 맀íë€. ìŽë¬í ì견ì ìë ì ìì ë 구첎ì ìŒë¡ ì°ê²°í ì ìë€ë©Ž ìŽë° ì¢
ë¥ì 묞ì ì ëí ìë¡ìŽ í ë¡ ë¬žì ê° ë°ìíê² ëìŽ êž°ì©ëë€.
ì¬êž°ì ë§íë ë§ì ëŽì©ì ì€ì ë¡ TypeScriptìë§ êµíë ê²ìŽ ìëë¯ë¡ ESDiscuss ì€ë ë륌 ììíë ê²ë ì ì í ì ììµëë€. íì€í ê·žë€ì ìŽë° ì¢ ë¥ì ìŒì ëíŽ ë§ìŽ ìê°íìµëë€(íë¡í íì ë ìžì€íŽì€ì ìž¡ë©Žìì).
@olmobrutall
ES6 íŽëì€ë ìŽë¯ž íë¡í íì
ì ìšêž°ê³ ììŒë©° @kungfusheep ìŽ ë§íë¯ìŽ ì§ì ë§ì§ë ê²ì ì ìì ìž ìŒìŽ ìëëë€.
ë°ëŒì íšì íëì íìŽí íšì íëì ë©ìë ì¬ìŽìë ì°šìŽê° ììŒë©°, ì í ìì€í ììë, ìì±ë ìœëììë(ì¬ì©íì§ ìë 겜ì°) ì°šìŽê° ììµëë€.
ì, ìì±ë ìœëìì íŽëì€ ë©ìëë íë¡í íì
ì ì
ë ¥ëê³ ë€ë¥ž 몚ë í목(ì ëì¬ static
ê° ë¶ì§ ìì)ì ìžì€íŽì€ì ì
ë ¥ëë¯ë¡ ìì곌 ì°šìŽê° ììµëë€.
ìŽìšë , ëë ìŽì ì°ëŠ¬ê° ë ì¢
ë¥ì ë©ìëì ëíŽ ë³ëì 구묞ì ê°ì§ íìê° ìë€ë ë° ëìíì§ë§ override
í€ìë륌 ì¬ì©íë €ë©Ž ë©ìëë¡ ì íëìŽìŒ íê³ ëëšžì§ë ë€ë¥ž ê². 몚ë ê²ì ëíŽ ê³ ì í í€ìë륌 ê°ë ê²ì ì¢ì ì ìì§ë§ ê·ž ì믞ì ëíŽ ë§€ì° ëª
ííŽìŒ í©ëë€. override
ë ëª
ííì§ë§ ë©ìëìë§ íŽë¹ë©ëë€. this.
ì ê°ì ì 구묞ì ì¬ì í ââëŽ ì·ší¥ì êž°ì¡Ž JSì ë묎 ê°ê¹ìµëë€.
@RyanCavanaugh
override
ì êŽì ìì 볎멎 ꜀ ê·Œì¬í©ëë€.
ì¬ì ìì ëí ëŽ ë¬žì ë ìží°íìŽì€ ë©ìë ë° íëì ëíŽ ì¶©ë¶í ìŒë°ì ìŽì§ ìë€ë ê²ì ëë€. ìž ê°ì§ ìµì ìŽ íìë©ëë€.
override
륌 ì¬ì©í©ëë€.override
ì¬ì©member
, implement
, this.
, .
ë±...)ëë ìŽ ê²°ì ìŽ ì¬êž°ì ëŽë €ì žìŒ íë€ê³ ìê°íë€.
ë¹ì ìŽ ë§íë ë§ì ê²ì ì€ì ë¡ Typescriptìë§ êµíëì§ ììµëë€.
ì ì ìŒë¡! ì°ëŠ¬ë 몚ë íì¬ ížëì€íìŒ ìíì ë§ì¡±íì§ë§ ì í ê²ì¬/ë구ì ëíŽìë ê·žë ì§ ììµëë€.
í€ìëê° ë¬ŽììŽë Typescriptë§ ê°ë¥í©ëë€(ì¶ì곌 ë§ì°¬ê°ì§ë¡).
@JabX
ë¬Œë¡ ìì±ë ìœëì ëíŽìë ë§ìµëë€. ëŽ ìì ì ë€ì곌 ê°ìŽ ìì±í ì ìë€ë ê²ì ëë€.
class Person {
name: string = "John";
saySomething() {
return "Hi " + this.name;
}
}
íŽëì€ë¥Œ ì ìžíë©Ž name
ë ìžì€íŽì€ë¡ ìŽëíê³ saySomething
ë íë¡í íì
ìŒë¡ ìŽëí©ëë€. ê·žëë ëë ìŽê²ì ìž ì ìë€:
Person.prototype.name = "Unknown";
Person.prototype
ì ì íì ì 첎 ì¬ëìŽêž° ë묞ì
ëë€. Typescriptë ëšìíšì ìíŽ ê·žì ì í ìì€í
ìì ìŽëë¡ ê°ëì§ ì¶ì íì§ ììµëë€.
몚ë ê²ì ëíŽ ê³ ì í í€ìë륌 ê°ë ê²ì ì¢ì ì ìì§ë§ ê·ž ì믞ì ëíŽ ë§€ì° ëª ííŽìŒ í©ëë€.
ëŽê° ìê°íêž°ì ë ì€ìíê³ ì°ëŠ¬ 몚ëê° ëìí ì ìë ê²ì ìë¯žë¡ ì ëë€.
ìì ë XXX
ë ìŒë°ì ìŒë¡ Ʞ볞 íŽëì€ì íšì륌 ì¬ì ìíë ë° ì¬ì©ëë Ʞ볞 íŽëì€ ëë 구íë ìží°íìŽì€ìì ë©€ë²ê° ìŽë¯ž ì ìžëìëì§ íìží©ëë€.
.
ëë this.
ê° ë묎 ììíŽ ë³ŽìŽê³ member
ê° ì€ë³µëë¯ë¡ 몚ë 겜ì°ì ëíŽ override
륌 ëšì© íë ê²ìŽ ê°ì¥ ì¢ì ì íìŒ ê²ì
ëë€. íë륌 ì€ì íê±°ë ìží°íìŽì€ ë©ìë륌 구ííë ê²ì ìŽìšë ë¶ìì ìž êž°ë¥ì
ëë€.
ë§ì ì ë¡ê° ììµëë€:
static class
ë ë ìŽì _ê°ì²Ž íŽëì€_ê° ìëëë€.static
íëìë _ì ì _ìž ê²ìŽ ììµëë€.virtual
ë©ìëë ìë¹í _구첎ì ì
ëë€(VBë Overrideable
ì¬ì©).ë€ì곌 ê°ìŽ íìë©ëë€.
class Person{
dateOfBirth: Date;
abstract talk();
walk(){ //...}
}
interface ICanFly{
fly?();
altitude?: number;
}
class SuperMan extends Person implements ICanFly {
override dateOfBirth = new Date();
override talk(){/*...*/}
override walk = () => {/* force 'this' to be captured*/}
override fly() {/*...*/}
override altitude = 1000;
}
ì°ëŠ¬ë ê·žê²ì ëíŽ íŽê²°í ì ììµëê¹?
ìží°íìŽì€ìì ì€ë 몚ë í목ì ëíŽ ë³ëì implement
í€ìë륌 ë³Žê³ ì¶ìµëë€(ë ê°ì§ 몚ëì ìë ê²œì° override
ì°ì ). ìëíë©Ž ì¬ì ìê° ìëëŒ êµ¬íìŽêž° ë묞ì
ëë€.
ê·žë ì§ ììŒë©Ž ë¶ëªš íŽëì€ì 몚ë ê²ì ëíŽ override
륌 ëšì©íë ê²ìŽ ê°ì¥ ì¢ë€ë ë° ëìí©ëë€.
ê·žë¬ë implement
ì override
ì¬ìŽìë ì믞ì ì°šìŽê° ììµëë€.
ë ë€ ì ì¬í ìë ìì±/ì€ë¥ ë©ìì§/JSë¡ì ë³íì ê°ì§ ê²ì ëë€... ê·žê²ì ëšì§ ì² íì ì°šìŽìŒ ë¿ì ëë€.
ë ê°ì í€ìë륌 ì€ëª
íë ê²ì ì ë§ ê°ì¹ê° ììŒë©° pedanting 컎íìŒë¬ê° ìë €ì£Œë Error you should use 'override' instead of 'implement'
ì
ëë€.
ìŽ ê²œì°ë ìŽë»ìµëê¹?
interface IComparable {
compare(): number;
}
class BaseClass implements IComparable {
implement compare();
}
class ChildClass extends BaseClass implements IComparable { //again
override compare(); // or implements...
}
ì§ë¬žì... ëê° ì 겜ì°ëì?
ëí implement
/ implements
묞ì ê° ììµëë€.
override
ëšì©í©ìë€. íëì ê°ë
íëì í€ìë, ìŽê²ìŽ ì€ìí ê²ì
ëë€.
êžì, ëë ìŽë¯ž override
ê° implement
ë³Žë€ ì°ì ìì륌 ê°ì žìŒ íë€ê³ ì ìíì§ë§ ìë§ë 충ë¶í ëª
ííì§ ììì ê²ì
ëë€.
ëë ìŽê²ìŽ ê°ì ê²ìŽëŒë ê²ìŽ ìì§ë 믿겚ì§ì§ ìëë€. ë ë€ë¥ž ì: íì ìží°íìŽì€ ë©€ë²ì ê²œì° êµ¬í ì€íšë 컎íìŒë¬ ì€ë¥ìž ë°ë©Ž ì¬ì ì ì€íšë 묞ì ê° ìëëë€(Ʞ볞 ë©€ë²ê° ì¶ìì ìž ê²œì°ê° ìëë©Ž...).
ëë ë¶ëªš íŽëì€ì ì ìžëì§ ìì ê²ì override
ê° ìë¯žê° ìë€ê³ ìê°í©ëë€. íì§ë§ 구ë³ì ìíë ì¬ëì ëë¿ìŒ ê²ì
ëë€. ìŽìšë , ì°ëŠ¬ê° ìŽê²ì ì¬ì©íë í€ìëê° ë¬ŽììŽë ê°ì, ëë ì°ëŠ¬ê° 묎ìžê°ë¥Œ ê²°ì íê³ ê·ž ì¬ì©ì ê°ì íë ì격í 몚ë륌 ì ê³µí ì ìꞰ륌 ë°ëëë€.
êžì, ëë ìŽë¯ž ì¬ì ìê° êµ¬íë³Žë€ ì°ì íŽìŒíë€ê³ ì ìíì§ë§ ìë§ë 충ë¶í ëª ííì§ ììì ê²ì ëë€.
ë¬Œë¡ ë€ ê°ì§ 겜ì°ê° ìë€ê³ ë§íê³ ì¶ììµëë€. Base Class, Interface, Base Classì Interface, BaseClassì Interface ì¬êµ¬í.
@JabX
ë¶ëªš íŽëì€ì ì ìžëì§ ìì í목ì ëí ì¬ì ìê° ìë¯žê° ìë€ê³ ìê°í©ëë€. íì§ë§ 구ë³ì ìíë ì¬ëì ëë¿ìŒ ê² ì ëë€.
ë ìëìŒ. ê·žê²ë€ì 귌볞ì ìŒë¡ ë€ë¥ž ë ê°ì§ìŽë©° ìžìŽ ìì€ìì ê·ž ë¶ëŠ¬ë¥Œ ê°ë ìŽì ìŽ ììµëë€.
ìŽ ìë¡ìŽ êž°ë¥ìì ìží°íìŽì€ê° ì§ìëë€ë©Ž override
ì 볌ížë¡ ê³ ì ë ë°ì¯€ êµ¬ìŽ ì룚ì
ìŽ ë ì ìë€ê³ ìê°í©ëë€. extends
ê° íŽëì€ ìì€ìì implements
ì ë³ê°ì ìí°í°ë¡ ì¡Žì¬íë ê²ê³Œ ê°ì ìŽì ë¡ $# override
ë implement
ëŒìžì ë°ëŒ ììëë¡ ì§ì ì§ìŽìŒ í©ëë€. ìŽ ë¬žì 륌 íŽê²°íêž° ìíŽ. _êž°ë¥ êµì²Ž_ ë _êž°ë¥ ì ì_ì
ëë€.
@olmobrutall
ë ê°ì í€ìë륌 ì€ëª íë ê²ì ì ë§ ê°ì¹ê° ììŒë©° pedanting 컎íìŒë¬ë ë€ì곌 ê°ìŽ ìë €ì€ëë€. ì€ë¥ '구í' ëì 'ì¬ì ì'륌 ì¬ì©íŽìŒ í©ëë€.
ì§êžê¹ì§ ìŽ êµ¬ë¶ì 4ë² ì ë í ê² ê°ì§ë§ ííì ìž ê²ì ìëëë€. ì ë§ ì€ìí ì 볎ì ëë€!
ìì ì ì륌 ê³ ë €íììì€
interface IComparable {
compare(): number;
}
class BaseClass implements IComparable {
implement compare();
}
class ChildClass extends BaseClass implements IComparable { //again
override compare(); // or implements...
}
'ëë 구í...'ì ìŽ ê²œì° ìì í ì못ë ê°ì ì
ëë€. íì¥íë €ë Ʞ볞 íŽëì€ì ëìŒí ìží°íìŽì€ë¥Œ 구ííê³ ì¶ë€ê³ 컎íìŒë¬ì ë§íë€ê³ íŽì ìŽë¯ž compare
륌 구ííë€ë ì¬ì€ì ë°ëì§ ììµëë€.
override
ëì ChildClassì implement
륌 ìŽë€ë©Ž 컎íìŒë¬ê° ì못ë ê°ì ì ìë €ì€ ê²ì ê°ì¬íŽìŒ í©ëë€. ìŽì ì 구íë ë°©ë²ì ë°ìŒë¡!
ëŽê° ì± ìì§ê³ ìë ìœëë² ìŽì€ììë ìì¬í ì¬ì§ ììŽ í° ë¬žì ê° ë ê²ì ëë€. ê·žëì ì ë ê·žë¬í ê°ë°ì ì€ì륌 ë°©ì§í ì ìë 몚ë 컎íìŒë¬ êž°ë¥ì íìí©ëë€!
@kungfusheep
ì¬ì ì ëì ChildClassì 구íì ìì±íë€ë©Ž 컎íìŒë¬ê° ì못ë ê°ì ì ëíŽ ìë €ì€ ê²ì ê°ì¬íŽìŒ í©ëë€.
ìŽë¯ž 구íë ë©ìë륌 ì¬ì ìíë ê²ìŽ ê·žë ê² ì€ìí ê²°ì ìŽëŒë©Ž ì¶ì ë©ìëìë implement
륌 ì¬ì©íŽìŒ í©ëë€. abstract
ìì virtual
ë¡ ë©ìë륌 ë³ê²œíê±°ë ê·ž ë°ëì ê²œì° super
ížì¶ ëë ë©ìë ì 거륌 ê³ ë €íëë¡ êµ¬íë 몚ë ë²ì ì íìž(ë° ë³ê²œ)íŽìŒ í©ëë€.
ì€ì ë¡ ìŽê²ì C#ìì 묞ì ê° ë ì ìŽ ììµëë€.
구íë ë©ìëì ê²œì° override
, 구íëì§ ìì ë©ìë(ì¶ì/ìží°íìŽì€)ì ê²œì° implements
ì ëìí©ëë€.
ì¶ìì ìŒë¡ ì¬ì©ë ì ììµëë€. ê·žë ìµëë€.
C#ìë 'ì íì ' ìží°íìŽì€ ìë늬ì€ê° ìììŒë¯ë¡ ìë§ë ê·žë ê² í° ë¬žì ë¡ ê°ì£Œëì§ ììì ê²ì ëë€.
ê·žë¬ë ì ìì ì C#ìì ì°ëŠ¬ë override
구íë ë©ìëì 구íëì§ ìì ë©ìë륌 몚ë ì¬ì©íê³ ììŒë©° ëêµ°ê°ê° ë¶ííë€ë ë§ì ë€ìŽë³ž ì ìŽ ìë€ë ê²ì
ëë€.
êž°ë¥ì ì€ëª íë ê²ì ìµì ë ë°° ìŽì ìŽë µê² ë§ë€ ê°ì¹ê° ìë 묞ì ë ìëëŒê³ ìê°í©ëë€.
implement
í€ìëê° íìí ì ìŒí ìŽì ë ìží°íìŽì€ ë©€ë²ê° ì í ì¬íìŒ ì ìì§ë§ C#ììë ë¶ê°ë¥íêž° ë묞ì
ëë€(ìë§ë ëë¶ë¶ì OO ìžìŽììë). ìží°íìŽì€ë¥Œ ìì í 구íí ì _not_ ì ìêž° ë묞ì ê±°êž°ì ëí í€ìëê° ììŒë¯ë¡ 묞ì ê° ëì§ ììµëë€. ì¬êž°ìë ë€ë¥ž 묞ì ê° ìêž° ë묞ì "C#ììë ëìŒí©ëë€"ì ë묎 ë§ì 귌거륌 ëì§ ë§ììì€.
override
ë ì¶ìì ìžì§ ì¬ë¶ì êŽê³ììŽ _base class_ ë©ìëì ì¬ì©ë©ëë€. ëë 구ë³ìŽ ì¡Žì¬ê° ìë ë©ìë(íŽëì€ ëë ìží°íìŽì€)ì êž°ìì ììŽìŒ íë€ê³ 믿Ʞ ë묞ì ì¬êž°ììë ëìŒíŽìŒ íë€ê³ ê°ì í©ëë€(ì¶ì ë©ìëì ê²œì° implement
override
). 구íì. ê·žëŠ¬ê³ ë¯žëì ì¶ì ë©ìëì Ʞ볞 구íì ì ê³µíêž°ë¡ ê²°ì íë€ë©Ž í€ìë륌 êµì²Žíêž° ìíŽ ìœë륌 ìŽíŽë³Žì§ ììë ë©ëë€.
ëŽ ì£Œì ì§ë¬žì ìŽì ì격í override
/ implement
íëê·žê° ììŽìŒ í©ëê¹(ëë ìŽê²ì ìí©ëë€), íì ìží°íìŽì€ 구ì±ìì implement
í€ìë륌 ê°ì ì ì©íŽìŒ í©ëê¹? ë§ì ëììŽ ëì§ ìê³ (ê·žë ì§ ììŒë©Ž 컎íìŒëì§ ìêž° ë묞ì 구íì ì€íší ì ìì) ë¶íìí ì¥í©íšì ë§ìŽ ì ë°í ì ìêž° ë묞ì
ëë€. ê·žë¬ë ë€ë¥ž íížìŒë¡ ìŒë¶ ìží°íìŽì€ ë©€ë²ìë implement
ê° ìì§ë§ 몚ë ë©€ë²ìë ìë ê²ì ììŒ ì ììµëë€.
@JabX Ʞ볞 íŽëì€ì ì¶ì ë©ìë 구íìŽ ì¶ê°ë ê²œì° ê°ìžì ìŒë¡ ê²œê³ ë¥Œ ìí©ëë€.
ê·žë¬ë ëë ì²ìë¶í° ë구 í€ìëì ììŽëìŽì 100% 맀ëë ê²ì ìëëë€. 컎íìŒë¬ë ë¹ì ìŽ ëê°ë¥Œ 구ííì§ ììë€ë©Ž ìŽë¯ž ê²œê³ í ê²ì ëë€. ê·žê²ìŽ ì ë§ë¡ ëììŽ ëë ì ìŒí ê³³ì ì íì ë©ìëì ëë€.
ê·žëŠ¬ê³ ìŽìšë , ëŽê° ìŽ ì€ë ëì ìë ìŽì ì ì묎 êŽë šìŽ ììµëë€. íšì륌 ë¶ëªš íŽëì€ì ì¬ì ìë¡ ì§ì íë ë°©ë²ìŽ ìëì§ ì°Ÿê³ ìììµëë€.
ëŽ ì£Œì ì§ë¬žì ìŽì ì격í ì¬ì ì/구í íëê·žê° ììŽìŒ í©ëê¹(ìì í ìŽê²ì ìí©ëë€), íì ìží°íìŽì€ 구ì±ìì ëíŽ êµ¬í í€ìë륌 ê°ì ë¡ ì ì©íŽìŒ í©ëê¹?
ì°ì§ ìë ê²ì ê²œê³ ëŒê³ ìê°í©ëë€.
ê·žê²ìŽ ì ë§ë¡ ëììŽ ëë ì ìŒí ê³³ì ì íì ë©ìëì ëë€.
ë€, ì¬êž°ê° íµì¬ì ëë€.
ìŽê²ìŽ ììŒë©Ž ì¬ì ìíê³ ì¶ì§ë§ ì€ì ë¡ ì ë°©ë²ì ìì±íë ë°©ë²ì ì€íì ëí ë§€ì° ìŒë°ì ìž ì€ë¥ì ëë€. ìŽë¬í í€ìëì ëì ì êž°ë¥ì ì¬ì ìíë €ë ìë륌 ì§ì íë ì ìŒí ë°©ë²ì ëë€.
ê·žê²ì ê²œê³ ëë 묎ììŽë ë ì ìì§ë§ íì¬ë ë§€ì° ê³ íµì€ëœìµëë€.
alm.tools :roseì UML íŽëì€ ë·°ì ì¬ì ì 죌ìì ì¶ê°íê³ ììµëë€.
ëí alm ì Ʞ볞 íŽëì€ ë©€ë²ë¥Œ ì¬ì ìíë íŽëì€ ë©€ë²ì ëí ì¬ë°± íìꞰ륌 ì¶ê°íìµëë€.
ë²ìê° ì§ì ë ì룚ì ì ëí PRì ìëœíë©Ž ë³µì¡ì±ì ìµìííë©Žì ìµë ê°ì¹ë¥Œ ë¬ì±í ì ììµëë€.
override
ë íŽëì€ ë©ìë ë° ìì± ì ìž(get/set í¬íš)ìì ì íší©ëë€.override
ê° ììŽìŒ í©ëë€.get
ë° set
ë ì€ íëê° ë€ì곌 ê°ì ê²œì° override
ë¡ íìíŽìŒ í©ëë€.override
ê° ìë ê²ì ì€ë¥ì
ëë€.--noImplicitOverride
(ì¬êž°ì ìŽëŠì ìì ë¡ê² ì§ì )ì ì¬ì ìëë í목ì ëíŽ override
륌 íìë¡ ë§ëëë€.declare class
ëë .d.ts íìŒ)ìë ìí¥ì ì£Œì§ ììµëë€.íì¬ ë²ì ìž:
@RyanCavanaugh
ì ë íì¬ ìŽê²ì 구ííë €ê³ ë
žë ¥íê³ ììµëë€(ë°©êž ììíìŒë©° í¹í í
ì€ížë¥Œ ìíŽ ìŽì ëí ëìì íìí©ëë€). íì§ë§ ë€ì 묎ììŽ ìëì§ ì ëªšë¥Žê² ìµëë€.
몚ë ìëª (구í í¬íš)ìë
override
ê° ììŽìŒ í©ëë€.
íŽëì€ìì ë©ìëì ì¬ë¬ ìëª
ì ê°ì§ ì ììŒë¯ë¡ ìì 컚í
ì€ížì ëíŽ ìŽìŒêž°íê³ ììµëê¹? ë¹ì ì ê·žê²ì ì믞í©ëê¹ ( override
ì ì¬ì©ì ê°ì íë íëê·ž ììŽ, ê·žë ì§ ììŒë©Ž ë¶ëª
í ì€ë¥ì
ëë€)
class A {
method() {}
}
class B extends A {
override method() {}
}
class C extends B {
method() {}
}
method
override
륌 ì°ì§ ììêž° ë묞ì íŽëì€ Cìì ì€ë¥ë¥Œ ì¶ë ¥íŽìŒ í©ëê¹?
ê·žë ë€ë©Ž ì ì°ëŠ¬ê° ê·žê²ì ìííê³ ì¶ìì§ ì ëªšë¥Žê² ìµëë€. ê·žëŠ¬ê³ ë€ë¥ž ë°©í¥ìŒë¡ë ìëíŽìŒ í©ëê¹? Cìì override
륌 ì§ì íê³ Bììë ì§ì íì§ ììŒë©Ž íŽëì€ Bìì ì€ë¥ë¥Œ ì¶ë ¥í©ëê¹?
ì, ìì ížëŠ¬ ìëª
ì ì ì©ëë ê² ê°ìµëë€.
ê·žëŠ¬ê³ ëë ê·žê²ìŽ ë€ë¥ž ë°©ììŒë¡ ìëí ê²ìŽëŒê³ ìê°íì§ ììµëë€. ìŒëš ê³ìžµ 구조ì ìì€ìì ì¬ì©ëë©Ž ì¬ì ì ê·ì¹ì ìííêž° ììíŽìŒ í©ëë€. ìŽë€ 겜ì°ìë ê°ë°ìê° ìì íì§ ìì íŽëì€ìì íìë íŽëì€ì ì¬ì ì륌 ì ì©íêž°ë¡ ê²°ì í ì ììµëë€. ë°ëŒì ìŒëš ì¬ì©ëë©Ž 몚ë íì íŽëì€ìë§ ì ì©ëìŽìŒ í©ëë€.
ì ëíŽ ë€ë¥ž ì§ë¬žìŽ ììµëë€.
get
ë°set
ë ë€ $#override
ë¡ íìëìŽìŒ í©ëë€.
ëŽ ë¶ëªš íŽëì€ê° getterë§ ì ìíê³ íì íŽëì€ìì setter륌 ì ìíë €ë ê²œì° ìŽë»ê² ë©ëê¹? ìŽ ê·ì¹ì ë°ë¥Žë©Ž ëŽ setterê° ì¬ì ìë¡ ì ìëìŽìŒ íì§ë§ ë¶ëªš íŽëì€ì setterê° ìê³ ì¡Žì¬íì§ ìë ê²ì ì¬ì ìíë ê²ì ì€ë¥ì¬ìŒ íë€ë ì믞ì
ëë€. êžì, ì€ì ë¡ (ëŽ íì¬ ìì§í 구íìì) getterì setterê° ëìŒí ìì±ì ëí ê²ìŽêž° ë묞ì 몚ììŽ ììµëë€.
ë€ì곌 ê°ìŽ ìì±í ìë ììµëë€.
class A {
get value() { return 1; }
}
class B extends 1 {
override set value(v: number) {}
}
ëìê² ëª ë°±í ì못ë ê²ì²ëŒ 볎ì ëë€.
íŽëì€ìì ë©ìëì ì¬ë¬ ìëª ì ê°ì§ ì ìêž° ë묞ì
ëìŒí ë©ìëì ëíŽ ì¬ë¬ ì€ë²ë¡ë ìëª ì ê°ì§ ì ììµëë€.
class Base { bar(): { } }
class Foo extends Base {
// Must write 'override' on each signature
override bar(s: string): void;
override bar(s?: number): void;
override bar(s: string|number) { }
}
ë€ë¥ž 겜ì°ì ëí ê·íì ì§êŽìŽ ì³ë€ê³ ìê°í©ëë€.
getter ë° setterì êŽë šíì¬ override
ë ìì± ì¬ë¡¯ìë§ ì ì©ëë€ê³ ìê°í©ëë€. íŽë¹ getter ììŽ ì¬ì ìíë setter륌 ìì±íë ê²ì ë¶ëª
í ë§€ì° ìì¬ì€ëœìµëë€ override
Ʞ볞 íŽëì€ê° ìŽë»ê² 구íëìëì§ íì ìì§ ëª»íêž° ë묞ì override
getter ëë setterìë _some_ íŽë¹ Ʞ볞 íŽëì€ ìì±ìŽ ììŽìŒ íê³ override get {
ëŒê³ ë§íë©Ž ê·ì¹ìŽ ê°ëšíë€ê³ ìê°í©ëë€. , 몚ë set
ì ìžìë override
ë ììŽìŒ í©ëë€(ë°ëì 겜ì°ë ë§ì°¬ê°ì§).
ì€, ì°ëŠ¬ê° ê·žë° íŽëì€ìì ë©ìë ìëª ì ìì±í ì ìë€ë ê²ì 몰ëìµëë€. ꜀ ê¹ëí©ëë€.
virtual
ë ìë¯žê° ìë€ê³ ìê°í©ëë€.
몚ë í€ìë: virtual
, override
, final
ì€ì ë¡ íŽëì€ë¥Œ 늬í©í ë§í ë ë§ì ì°šìŽê° ììµëë€.
ì ë ììì ë§ìŽ ì¬ì©íê³ ììµëë€. ìŽì "ì€ìë¡" ë©ìë륌 ì¬ì ìíë ê²ìŽ ë묎 ìœìµëë€.
virtual
ë ëí ì€ë²ëŒìŽë í€ìë ë€ì ì¶ì/ê°ì ë©ìëë§ ì ìí ì ììŒë¯ë¡ ìží
늬ìŒì€ë¥Œ í¥ììíµëë€.
ìŽê²ë€ì ì°ì ìì륌 ëìêž° ë°ëëë€. ê°ì¬ íŽì!
@pankleks ì ëìí©ëë€. ììì ë§ìŽ ì¬ì©íê³ ììŒë©°, ì§ì ì§ì íì§ ìê³ íšì륌 ì¬ì ìíë ê²ì ì못ë ê² ê°ìµëë€.
"virtual", "override" ë° "final"ì ì벜í©ëë€.
ìŽê²ì ì ìê² ì€ìí 묞ì ì ëë€.
@RyanCavanaugh
맀ê°ë³ì ëë ìŽëì ëŒìŽì ì 컚í ì€íž ì ë ¥(ìŽì ì ìëíì§ë§ ì¬ììŽììµëë€)
ìŽì ëíŽ ììží ì€ëª íŽ ì£Œìê² ìµëê¹? ì€ì ë¡ TSê° ë©ìë ì¬ì ììì ëŽ ë§€ê°ë³ì ì íì ì¶ë¡ íì§ ìë ìŽì 륌 ììëŽë €ê³ íë ëì ìŽ ë¬žì 륌 ë°ê²¬íëë°, ìŽë ì 륌 ëëŒê² íìµëë€. ì¬ì ìí ë ëìŒíì§ ìì 맀ê°ë³ì 목ë¡ìŽ ì¬ë°ë¥žì§ ëë ížíëì§ ìë ë°í ì íìŽ ìžì ìžì§ ì ì ììµëë€.
@pankleks
virtual
ë ìë¯žê° ìë€ê³ ìê°í©ëë€.
볞ì§ì ìŒë¡ JSììë 몚ë ê²ìŽ "ê°ì"ì
ëë€. final
ì ëí ì§ìì IMHOë¡ ì¶©ë¶í©ëë€. ì¬ì ìíŽìë ì ëë ë©ìë(ëë ìì±)ê° ìë ê²œì° ìŽë¥Œ ìë°íì ë 컎íìŒë¬ ì€ë¥ë¥Œ ížëŠ¬ê±°íëë¡ ìŽë¥Œ íìí ì ììµëë€. ê·žëŒ virtual
íììê² ì£ ? ê·žë¬ë ìŽê²ì 묞ì #1534ìì ì¶ì ë©ëë€.
@avonwyss ì¬êž°ìë ë ê°ì§ 묞ì ê° ììµëë€.
ìí©ì ë°ëŒ _property initializer_륌 ì ë ¥íë €ê³ íì ë https://github.com/Microsoft/TypeScript/pull/6118#issuecomment -216595207ì ì€ëª ë ëª ê°ì§ 묞ì ê° ë°ìíìµëë€. ì°ëŠ¬ë #10570ìì ìë¡ê³ ë ì±ê³µì ìž ì ê·Œ ë°©ìì ê°ì§ê³ ìë€ê³ ìê°í©ëë€.
ë©ìë ì ìžì ë€ë¥ž ë°ëë©ìŽëŠ¬ìŽë©° ì¬êž°ìì ìŽë€ ìŒìŽ ìŒìŽëìŒ íëì§ì ê°ìŽ ììëŽìŒ í ëª ê°ì§ ë€ë¥ž ì¬íìŽ ììµëë€.
declare class Base {
method(x: string): string[];
method(x: number, count: number): number[];
}
class Derived extends Base {
method(x) { // x: ???
return x;
}
}
ëšìŒ ìëª ë©ìëë§ êž°ë³žìì 맀ê°ë³ì ì íì ê°ì žì€ëë¡ ê²°ì í ì ììµëë€. ê·žë¬ë ìŽê²ì 몚ë ì¬ëì íë³µíê² ë§ë€ì§ ìì ê²ìŽë©° "ëŽ íì íŽëì€ê° ëìŒí _signatures_륌 ê°ì§ì§ë§ ëšì§ ë€ë¥ž _implementation_ì ì ê³µíꞰ륌 ìí©ëë€."ëŒë ë¹ë²í 묞ì 륌 ì€ì ë¡ íŽê²°íì§ ëª»í©ëë€.
ì, x
ì ì íì ìŽ ê²œì° string | number
ìŽì§ë§ ìŒêŽëê² ì°Ÿêž°ê° êœ€ ìŽë €ìž ì ììì ìŽíŽí©ëë€.
ê·žë¬ë x
string | number
$ Base
$ê° ëë ê²ì ìíì§ ìì ê²ì
ëë€ Derived
(3)
ëë ('foo', 3)
륌 ì¬ì©íì¬ ížì¶í ì ììµëë€.
í ê·žë, ëë ê·žê²ì ëì³€ë€.
ëšìŒ ìëª ë°©ë²ìŒë¡ ì ííëë¡ ì ìí ê²ì 볎ìì§ë§ ê·íì ìììì ê°ìŽ "ìëª ìŒì¹" ë°©ë²ìŒë¡ "ìœê²" íì¥ë ì ìë€ê³ ìê°í©ëë€.
declare class Base {
method(x: string): string[];
method(x: number, count: number): number[];
}
class Derived extends Base {
method(x, count) { // x: number, count: number
return [];
}
}
ìŒì¹íë Ʞ볞 íŽëì€ì ìëª ìë§ ìêž° ë묞ì ëë€.
ê·žê²ì ì°ëŠ¬ê° ê°ì§ ê²(ì묎ê²ë ìë ê²)ë³Žë€ íšì¬ ë«ê³ ê·žë ê² íêž°ê° _ê·žë ê²_ ìŽë €ìž ê²ìŽëŒê³ ìê°íì§ ììµëê¹? (ì¬ì í ìŽ ë¬žì ì ë²ì륌 ë²ìŽëê³ ë ë§ì ìì ìŽ íìí ì ìì)
@RyanCavanaugh ëµë³ ê°ì¬í©ëë€. ìžêžíë¯ìŽ override
ì ëí ì í¬ë§ì 맀ê°ë³ì(ë° ë°í ì í) 묞ì 륌 ì ë ¬íë ê²ì
ëë€. ê·žë¬ë ì€ë²ë¡ëìë íì 몚ë ì€ë²ë¡ëì ížíëë ëšìŒ "ë¹ê³µê°" 구íìŽ ììŽìŒ íêž° ë묞ì ê·íì ìì ê° ë¬žì ê° ìë€ê³ ìê°íì§ ììµëë€(ìŽê²ìŽ @JabX ì ì ììŽ ê°ë
ì ìŒë¡ ìëíì§ ìë ìŽì ì
ëë€).
ê·žëì, ì°ëŠ¬ë ë€ì곌 ê°ì ê²ì ê°ì§ ê²ì
ëë€:
declare class Base {
method(x: string): string[];
method(x: number, count: number): number[];
// implies: method(x: string|number, count?: number): string[]|number[]
// or fancier: method<T extends string|number>(x: T, count?: number): T[]
}
class Derived extends Base {
override method(x, count?) { // may only be called like the method on Base
return [x];
}
}
ìŽ ë ŒëŠ¬ë ìŽë¯ž ì¡Žì¬íë©° ì¬ì ìë ë³ê°ì ì¬ì ìê° ìë "ê°ìž" 구í ë°©ë²ìë§ ì¬ì©í ì ììµëë€(ìŽìšë ëšìŒ ì€ë²ë¡ë륌 ëª ìì ìŒë¡ 구íí ì ìë ê²ì²ëŒ). ê·žëì ì¬êž°ì 묞ì ê° ë³ŽìŽì§ ììµëë€. ìëë©Ž ì ê° ëì¹ ê²ìŽ ììµëê¹?
ì¬ì ìëëë¡ ì€ê³ë ë©ìëìë ìŒë°ì ìŒë¡ ì€ë²ë¡ëê° ììŒë¯ë¡ ê°ëší ë°©ë²ì ííê³ ì€ë²ë¡ëê° ìë ê²œì° ë§€ê°ë³ì ë° ë°í ì íì ì ì¶íì§ ìë ê²ìŽ ì벜íê³ ì ì©í ê²ì
ëë€. ë°ëŒì ì€ë²ë¡ëë ë©ìë륌 ì¬ì ìí ë ëììŽ ìë ê·žëë¡ìë€ê³ íŽë --no-implicit-any
몚ëìì ì€íí ë ì€ë¥ê° ë°ìíê³ íží ê°ë¥í ì íì ì§ì íŽìŒ íë¯ë¡ ì벜íê² êŽì°®ì ì ê·Œ ë°©ìì²ëŒ ë³ŽìŒ ê²ì
ëë€.
ëë ìë§ë ëê°ë¥Œ ëì¹ê³ ìì§ë§ Javascript (ë°ëŒì Typescript)ììë ìëª ìŽ ë€ë¥ž 겜ì°ìë ê°ì ìŽëŠì ê°ì§ ë ê°ì§ ë°©ë²ì ê°ì§ ì ììµëë€.
C#ììë ë€ìì ìíí ì ììµëë€.
public string method(string blah) {};
public int method(int blah) {};
íì§ë§ ì¬êž°ììë ìëª ìŒë¡ 묎ìì íë ê°ì ìŽëŠì ê°ì§ 2ê°ì íšì륌 ê°ì§ ì ììµëë€... ê·žëì ìŽë€ ìì ë ìŽìšë ë¶ê°ë¥íì§ ììµëê¹? ëìŒí íŽëì€ìì ì¬ë¬ íì¥ì ëíŽ ìŽìŒêž°íì§ ìë í ... ê·žë¬ë ê·žê²ì ê·íì ìì ê° ë³Žì¬ì£Œë ê²ìŽ ìëë¯ë¡ ìë§ë ê·žë ì§ ììµëê¹? ìŽê² 묞ì ê° ìëë걎ê°ì?
ì§êžì ììì ì¬ì©íê³ ìëë° ë§€ì° ì€ë§ì€ëœìµëë€... íšìì ëí 죌ìì ë¬ì íšìê° ê°ì(ì: ìŽëê°ì ì¬ì ìíê³ ìì) ëë ì¬ì ì(ìŠ, ìŽ íšìê° êž°ë³ž êž°ë¥ì ì¬ì ìíê³ ììµëë€). ì§ìŠëê³ ì§ì ë¶íŽ! ê·žëŠ¬ê³ ìì íì§ ììµëë€!
@sam-s4s ì, ë©ìëì ëíŽ ì¬ë¬ ë
ŒëŠ¬ì ì€ë²ë¡ë ìëª
ì ì ìží ì ìì§ë§ 몚ë ëìŒí ëšìŒ 구íìŒë¡ ëë©ëë€(ê·žë° ë€ì "ì€ë²ë¡ë"ê° ížì¶ëë ì ë¬ë 맀ê°ë³ì륌 íì
íŽìŒ íš). ìŽê²ì $(function)
ê° ready íšì륌 ì¶ê°íì§ë§ $(string)
ê° ì íêž°ë¡ DOMì ê²ìíë jQueryì ê°ì ë§ì JS íë ììí¬ìì ë§ìŽ ì¬ì©ë©ëë€.
묞ìë ì¬êž°ë¥Œ ì°žì¡°íììì€: https://www.typescriptlang.org/docs/handbook/functions.html#overloads
@avonwyss ì ë€, ì ìžì íì§ë§ 구íì ìëììµëë€. ìŽíŽê° ëë€ì :) ê°ì¬í©ëë€.
ìŽê²ì ë묎 ì€ë ì§ìëììŒë©° TSì ì¬ì í ìŽ êž°ë³ž 컎íìŒ íì ìŽì€ì ìŽ ìë ìŽì 륌 íì íêž° ììíêž°ê¹ì§ ìŽ ì 첎 ë¶íë €ì§ ì€ë ë륌 ìœìŽìŒ íë€ë ê²ìŽ ì§ìŠì€ëœìµëë€.
ì°ëŠ¬ë (a) override
í€ìë ëë (b) 컎íìŒë¬ìê² "ëìŒí ìŽëŠê³Œ ì í ìëª
ì ê°ë ë©ìëê° ìíŒíŽëì€ì ì¡Žì¬íŽìŒ íš"ì ì늬ë @override
jsdoc 죌ìì ìŽëì ììµëê¹? ?
ë 구첎ì ìŒë¡ ë§íë©Ž, @RyanCavanaughì https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -224776519 (2016ë 6ì 8ìŒ)ì 죌ìì ë€ì ëšê³ê° (컀뮀ëí°) PRìì ìì¬í©ëê¹?
class Bar extends Foo {
/**
* <strong i="12">@override</strong>
*/
public toString(): string {
// ...
}
override public toString(): string {
// ...
}
}
ë³Žë€ êµ¬ì²Žì ìŒë¡, @RyanCavanaugh ì #2000(comment)(2016ë 6ì 8ìŒ)ì ëêžì ë€ì ëšê³ê° (컀뮀ëí°) PRìì ìì¬í©ëê¹?
@pcj ë§ì
#13217ìì ìŽì ëí í볎륌 ììíìµëë€. ìŽ êž°ë¥ì êŽì¬ìŽ ìë ì¬ëì ë구ë ì°žì¬ ë°/ëë ì ìì ì ê³µí ì ììµëë€. ê°ì¬ íŽì!
ë°ìœë ìŽí°ê° ìë Javaì ëìŒí ê²ì ì íží©ëë€.
<strong i="6">@Override</strong>
public toString(): string {
// ...
}
@Chris2011 ìŽê²ì ì¹ìíŽ ë³ŽìŽì§ë§ ìŽë ë°ìœë ìŽí°ë¡ì @Override
ê° ì»ŽíìŒ ìê°ìŽ ìëëŒ ë°íìì íê°ëë€ë ê²ì ì믞í©ëë€. #13217 ì¬ì ì í€ìë( public override toString()
)ê° ê²í ìì ì§íëë©Ž javadoc /** <strong i="7">@override</strong> */
륌 ë³ëì PRë¡ ê³ííê³ ììµëë€.
ìŽ ì€ë ëì ëí륌 ë°ë¥Žë €ê³ í©ëë€. ì¬êž°ì ì ì íšìê° í¬íšë©ëê¹? ëë ì°ëŠ¬ê° ìì í ë€ë¥ž ìëª
ì ê°ì§ íì íŽëì€ìì ì ì íšì륌 ì¬ì ìíë ê²ì íì©í ì ìë ìŽì 륌 ì°Ÿì§ ëª»íìµëë€. ìŽê²ì ES6ìì ì§ìë©ëë€. class A { } ; A.create = function (){}
then class B extends A { } ; B.create = function (x,y) { }
ê° ììë€ë©Ž A.create()
륌 ížì¶íŽë B.create()
ê° ížì¶ëì§ ìê³ ë¬žì ê° ë°ìí©ëë€. ìŽë¬í ìŽì ë¡(ê·žëŠ¬ê³ í©í 늬 íšìì ëìŒí ì íì íšì ìŽëŠì ì¬ì©íë êž°ë¥ì ìì±íë €ë©Ž) Ʞ볞 ì ì íšìì ìëª
ì ì¬ì ìíëë¡ íì©íŽìŒ í©ëë€. ì묎 ê²ë ìììí€ì§ ìê³ ëª ê°ì§ ê¹ëí ìì
ì ìíí ì ìë êž°ë¥ì ì¶ê°í©ëë€(í¹í ê²ì ìì§ íë ììí¬ì ê²œì° GC ì ì§ë¥Œ ì€ìŽêž° ìíŽ ê°ì²Ž ìºììì ê°ì žì€ì§ ìê³ íì ì¬ì©íë ê²œì° 'ì' íëª©ìŽ ì€ì ë¡ ì
ìž ê²œì°). ížì¶ ê°ë¥í ìì±ìë ES6ìì ì§ìëì§ ììŒë¯ë¡ ì íì ëí ë©ìëì ëí ê³µíµ ëª
ëª
ê·ì¹ì ë§ëë ê²ìŽ ì ìŒí ë€ë¥ž ìµì
ì
ëë€. ê·žë¬ë ê·žë ê² íë €ë©Ž íì¬ íìë ì ì íšìê° ì첎ì íšê» Ʞ볞 ì ì íšì ìëª
ì ì€ë²ë¡ë륌 íìíŽìŒ íë©°, ìŽë íŽë¹ ì íë§ ì²ëŠ¬íë ì íì í©í 늬 íšììë ì ì©íì§ ììµëë€. :/ ê·žëì ëŽê° ê°ì§ ì ìŒí ìµì
ì ëŽ íë ììí¬ì ì¬ì©ìê° íì ì íì ëí 몚ë Ʞ볞 ê³ìžµ ì ì íšì ìëª
(ì: SomeType.create()
)ì ë³µì íëë¡ íë ê²ì
ëë€. .
ë€ìì ëŽê° ë§íë "ìŽëŠ¬ìì"ì ëí ìì ëë€(ìŽë ìëíì§ë§ íì¥ ê°ë¥í íë ììí¬ìì ìëì€ë¬ìí ë§í ê²ì ìëëë€).
class A {
static create(s: string) {
var inst: A;
/* new or from cache */
inst.init(s);
}
protected init(s: string) { }
}
class B extends A {
static create(s: string);
static create(n: number);
static create(n:any) {
var inst: B;
/* new or from cache */
inst.init(n);
}
protected init(s: string);
protected init(n: number);
protected init(n: any) {
super.init(n.toString());
}
}
class C extends B {
static create(s: string)
static create(n: number)
static create(b: boolean)
static create(b: any) {
var inst: C;
/* new or from cache */
inst.init(b);
}
protected init(s: string);
protected init(n: number);
protected init(b: boolean);
protected init(b: any) {
super.init(b ? 0 : 1);
}
}
(https://goo.gl/G01Aku)
ìŽê²ì íšì¬ ë ì¢ìì ê²ì ëë€:
class A {
static create(s: string) {
var inst: A;
/* new or from cache */
inst.init(s);
}
protected init(s: string) { }
}
class B extends A {
new static create(n:number) {
var inst: B;
/* new or from cache */
inst.init(n);
}
new protected init(n: number) {
super.init(n.toString());
}
}
class C extends B {
new static create(b: boolean) {
var inst: C;
/* new or from cache */
inst.init(b);
}
new protected init(b: boolean) {
super.init(b ? 0 : 1);
}
}
@rjamesnw í©í 늬 êž°ë¥ì ëí ê³ìœìŽ ìë ì ì ë©€ë²ì ëí ë€íì± "this"ì êŽì¬ìŽ ìì ì ììµëë€. 죌ì ì 첎ìì 죌ì ì¬ì© ì¬ë¡ë¡ ë Œìë©ëë€.
ë°ëŒì @pcj ê° 1ë ì ì ííí( comment ) ëëì ë€ì ìžêžíë©Ž ââìŽ êž°ë¥ ìì²ìŽ ìë ìì¹ë¥Œ ê²°ì íêž° ìíŽ ì¬êž°ì êž°ì ë묎 ë§ì PR곌 ì견ì ìœìŽìŒ íë ê²ìŽ íŒëì€ëœìµëë€.
#13217ìŽ ë묎 ê°ê¹ì ê³ @DanielRosenwasser ì íì¬ê° ìžìŽì ë§ì§ ìì ì ìë êž°ë¥ìŒë¡ ë€ì 격ì¶ìíš ê² ê°ìµëë€. ìŽ ë¬žì ì ëíŽ ìííŽìŒ íëì§ ì¬ë¶ì ëí ìí ëíì ë€ì ë€ìŽê°ë ê² ê°ìµëë€. ìë§ë ìŽ 'ëììž íì' ë°ìœë ìŽí°(#2900)ë¡ íŽê²°ë ê²ì ëë€. ê·žë ì§ ìì ìë ììµëë€. ììëë©Ž ì¢ì ê² ê°ìì.
ë€ìì ëŽê° ìžêžíì§ ìì ëª ë ì ì ê²ìë ë°íì ë°ìœë ìŽí° ì ê·Œ ë°©ìì ëª ê°ì§ ëšì ì ëë€.
ì ìŒí 죌ì ì¬íìŽ íŽëì€ ìŽêž°í ì íìžìŽ ë°ìíë€ë ê²ìŽëŒë©Ž ìì ì¡°ì¹ë¡ ë°ìë€ìŒ ì ìì§ë§ ë묎 ë§ì ì íìŽ ìë ê² ê°ìµëë€.
ìì§í ëë ìŽ êž°ë¥ìŽ ëŽê° ì²ì 묞ì 륌 êž°ë¡í ì§ 3ë ìŽ ëëë¡ ì¬ì í ë Œìì ì¬ì§ê° ìë€ë ê²ì 믿ì ì ììµëë€. 몚ë "ì¬ê°í" ê°ì²Ž ì§í¥ ìžìŽë C#, F#, C++...ëŒë í€ìë륌 ì§ìí©ëë€.
ìë°ì€í¬ëŠœížê° ë€ë¥Žê³ ë€ë¥ž ì ê·Œ ë°©ììŽ íìí ìŽì ì ëíŽ í룚 ì¢ ìŒ ê°ì€ì 죌ì¥í ì ììµëë€. ê·žë¬ë ë§€ì° í° Typescript ìœë êž°ë°ìì ë§€ìŒ ìì íë ì€ì©ì ìž êŽì ìì ì¬ì ìë ìœë ê°ë ì±ê³Œ ì ì§ êŽëŠ¬ì í° ì°šìŽë¥Œ ë§ë€ ê²ìŽëŒê³ ë§í ì ììµëë€. ëí íì íŽëì€ê° íží ê°ë¥íì§ë§ 믞ë¬íê² ë€ë¥ž ìëª ì ì¬ì©íì¬ êž°ë³ž íŽëì€ ë©ìë륌 ì€ìë¡ ì¬ì ìíšìŒë¡ìš ì 첎 ë²ê·ž íŽëì€ë¥Œ ì ê±°í©ëë€.
virtual/override/finalì ì ì í 구íì ë³Žê³ ì¶ìµëë€. ëë íì ê·žê²ì ì¬ì©íê³ ìœë륌 íšì¬ ë ìœêž° ìœê³ ì€ë¥ê° ë ë°ìíê² ë§ë€ ê²ì ëë€. ìŽê²ì ì€ìí êž°ë¥ìŽëŒê³ ìê°í©ëë€.
ëì. ìëì ìŒë¡ 몚íží/ìµìíì êž°ë¥ìŽ ì¶ê°ëë ë°ë©Ž... 귌볞ì ìž ê²ì ê±°ë¶ëë ê²ì 볎ë ê²ì ì€ë§ì€ëœìµëë€. ìŽë¥Œ ìíŽ ì°ëŠ¬ê° í ì ìë ìŒìŽ ììµëê¹?
ìŽìì€ìžì ì¬ë¬ë¶! ìŽë ê² ëêžìŽ ë§ê³ 3ë ìŽ ëìë€ë©Ž ì ë²ìš 구ííì§ ìììê¹!
ìŽì :joy_cat:
걎ì€ì ìŽê³ 구첎ì ìŒë¡ ë§ìíŽ ì£Œììì€. ìì ê°ì ëêžìŽ íìíì§ ììµëë€. PLEASE DO IT ALREADY comment
íì§ë§ ì¬ë¬ë¶, ì¬ë¬ë¶ë 구첎ì ìŒë¡ ë§ìíŽ ì£Œììì€.
ë¶ëª í 컀뮀ëí°ë íŽë¹ êž°ë¥ì ë§€ì° êŽì¬ìŽ ììŒë©° TS íì ìŽ êž°ë¥ì 믞ëì ëí 구첎ì ìž ì 볎륌 ì ê³µíì§ ììµëë€.
ëë ê°ìžì ìŒë¡ @armandn ì ì ì ìŒë¡ ëìí©ëë€. TSì ìµê·Œ 늎늬ì€ë ìŽì ê°ì ê²ìŽ ê°ìµëë ëì ë¹êµì ëë¬Œê² ì¬ì©ëë êž°ë¥ì ì ê³µí©ëë€.
ê³íìŽ ììŒìë€ë©Ž ì í¬ìê² ë§ìíŽ ì£Œììì€. ê·žë ì§ ììŒë©Ž 컀뮀ëí°ê° ìŽë»ê² ëìì ì€ ì ìëì§ ìë €ì£Œììì€.
https://github.com/Microsoft/TypeScript/pull/24626 ë ììµëë€.
GitHubê° ë¡ëí ë íìí ì ìë ê²ë³Žë€ ë ë§ì 죌ììŽ ììŒë¯ë¡ ì¬êž°ì íìëŒìžë§ ììµëë€.
ì¬êž°ìì ê³ ë €íì§ ìë ê²ì ìëëë€. ìŽê²ì êž°ë¥ìŽ ë€ìŽê° ëì ë¹ì·íë©° ì ì¬í ê·Œê±°ë¡ ì첎 êž°ë¥ ììŽëìŽ ë¥Œ ê±°ë¶íìµëë€. ìµê·Œ ìë #24423ì ì°žì¡°íììì€.
ì°ëŠ¬ë ìëì ìŒë¡ ìžìŽë¥Œ ì±ì¥ìí€ê³ ì¶ìµëë€. ìŽê²ì ìê°ìŽ 걞늬며 ìžëŽì¬ì ê°ì žìŒ í©ëë€. ê·žì ë¹íŽ C++ë ìŽ ì€ë ëì ìë ë§ì ì¬ëë€ë³Žë€ ì€ëëììµëë€. TypeScriptë ìì§ ìŽë¥žì ê°ë
ììŽ ì§ì ìì ì ìì ë§íŒ ì€ëëì§ ìììµëë€. ìžìŽì 묎ìžê°ë¥Œ ì¶ê°íë©Ž ë€ì ì ê±°í ì ììŒë¯ë¡ ì¶ê°í ëë§ë€ ì¥ëšì ì ì ì€íê² ë¹êµíŽìŒ í©ëë€. ëë ì¬ëë€ìŽ ë¹ëª
ì ì§ë¥Žë êž°ë¥(íì¥ ë°©ë², ë¹ì ì ë³Žê³ ììµëë€)ìŽ ìžìŽë¥Œ ê³ì ë°ì ìí€ë ì°ëŠ¬ì ë¥ë ¥(êµì°š ì í, íµí© ì í, 조걎 ì í ìì)ì ì°ëŠ¬ê° 구ííë€ë©Ž íꎎíì ê²ìŽëŒë 겜íìì ë§í©ëë€. ë§ì GitHub ëêžìŽ ìììµëë€. override
륌 ì¶ê°íë ê²ìŽ ìíí ê²ìŽ ìëëŒ íì ìµëíì 죌ì륌 êž°ìžì¬ ì ê·Œíê³ ìë€ë ê²ì
ëë€.
ì§êž ë¹ì¥ override
ì íµì¬ 묞ì 륌 ììœíŽìŒ íë€ë©Ž:
override
ì ì íí ìŒì¹íì§ ììµëë€(ìžì§ ë¶í ìŠê°).strict
ìëì ìê³ ì¶ì§ë§ ë묎 컀ì íì€ì ìŒë¡ ë¶ê°ë¥í íëê·žê° ë ê²ì
ëë€. 죌ì ë³ê²œ(ì ë¬ë ê°ì¹ ê°ì). ê·žëŠ¬ê³ ìë¡ìŽ ëª
ë ¹ì€ íë귞륌 ììíë 몚ë ê²ì ì°ëŠ¬ê° ì¬ê°íê² ê³ ë €íŽìŒ íë êµ¬ì± ê³µê°ì ë ë€ë¥ž ë ë°°ì
ëë€. 믞ë ê²°ì ì ëŽëŠŽ ë ì 첎 ì ì ì ìì°ì ìë¹íêž° ì ì ëª ë°°ë§ ë ë°°ë¡ ë늎 ì ìêž° ë묞ì
ëë€.override
ê° ìží°íìŽì€ ë©€ë² êµ¬íì ì ì©ë ì ìëì§ ì¬ë¶ì ëí ìë¹í ê°í ëŽë¶ ë¶ìŒì¹(ìŒë¶ ì¬ëë€ì êž°ëê° íì€ê³Œ ìŒì¹íì§ ìêž° ë묞ì ìžì§ ê°ì¹ ê°ì)ì¬êž°ìì ìŽì²Žì ìž ì¥ì ì a) 묎ììžê°ë¥Œ ì¬ì ìíê³ ììì ëíëŽê³ (ì€ë 죌ììŒë¡ í ì ìì), b) ìë ìì±ìŽ ëììŽ ëìì ì² ì ì€ë¥ë¥Œ ì¡ìëŽê³ , c) ì íëê·žë¡, í€ìë륌 ë£ë ê²ì "ììŽë²ë žê³ " ìŽì íìí ê³³(ì€ì ë²ê·žë¥Œ ì°Ÿì ê² ê°ì§ ìì íë²í êž°ê³ ìì )ì ì¡ìŒììì€. ëë b)ê° ê·¹ëë¡ ì€ë§ì€ëœë€ë ê²ì ìŽíŽíì§ë§ ë€ì ì¬êž°ìì ë³µì¡ì± ë§ë륌 충족íŽìŒ í©ëë€.
íë£šê° ëëë©Ž JS íŽëì€ê° override
í€ìëë¡ í¬ê² ëììŽ ë ê²ìŽëŒê³ ìê°íë€ë©Ž TC39 ì ìì ì§ì§íì¬ ìŽë¥Œ íµì¬ ë°íìì ì¶ê°íë ê²ìŽ ì¢ì ì¶ë°ì ìŽ ë ê²ì
ëë€.
ê·žê²ì ë¹ì ìŽ ì€ëë ë°ìœë ìŽí°ë¡ í ì ìë ìŒì íê² íì§ ììµëë€(ë°ëŒì "ë¹ì ìŽ ì±ì·ší ì ìë ìŒ"ìŽëŒë êŽì ìì "ìë¡ì§ ììµëë€")
ì ê° ìŽê²ì ì€íŽíê³ ìë ê²ìŒ ìë ìì§ë§, í€ìëê° í ì ìë ë°ìœë ìŽí°ê° í ì ìë ꜀ ì€ìí ìŒìŽ ììµëë€. https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -389393397ìì ìŒë¶ ìžêžíìµëë€. ëŽê° ë°ìœë ìŽí° ì ê·Œ ë°©ìì ì¬ì©íê³ ì¶ì§ë§ ì¶ììŽ ìë ë°©ë²ì ìŽ êž°ë¥ì ëí ëŽ ì¬ì© ì¬ë¡ì ìì ë¶ë¶ìŒ ë¿ìŽêž° ë묞ì ìŽë¬í ìŒìŽ ê°ë¥íë€ë©Ž ì 륌 íì€í ìì íììì€.
ìžêžëì§ ìì ë ë€ë¥ž ì¥ì ì override í€ìëê° êž°ë³ž íŽëì€ì ë³ê²œì íšì¬ ë ì€í ê°ë¥íê² ë§ë ë€ë ê²ì ëë€. ìŽëŠì ë³ê²œíê±°ë 묎ìžê°ë¥Œ ë ë¶ë¶ìŒë¡ ëëë ë±ì ìì ì íì íŽëì€ê° ìŒì¹íëë¡ ì ë°ìŽížëì§ ìê³ ì 컎íìŒëì§ë§ ë°íìì ì€íší ì ìë€ë ê²ì ìêž° ìŽë µìµëë€. ëí ì¬ì©í ì ìë final/sealed/internal í€ìëê° ìë€ë ì ì ê³ ë €íë©Ž ëŽë³Žëž ê±°ì 몚ë íŽëì€ê° ìŽëê°ìì íìëìŽ ë¹ê³µê°ê° ìë 몚ë í목ì ë³ê²œíë ê²ìŽ ì¬ì ì륌 ì¬ì©í ì ìë ê²ë³Žë€ íšì¬ ë ìíí ì ììµëë€.
ëŽ ìžìì TSLint ê·ì¹ìŽ ì¬êž°ìì ê°ì¥ ë¶ëë¬ìŽ 겜ë¡ìŒ ê²ìŽëŒë ê²ì ëë€. @kungfusheep ì https://github.com/Microsoft/TypeScript/issues/2000#issuecomment -192502734 ìì ììŽëìŽë¥Œ ê°ëµíê² ìžêžíì§ë§ íì ì¡°ì¹ë 볎ìŽì§ ììµëë€. ë€ë¥ž ì¬ëìŽ ìŽ êž°ë¥ì TSLint 구íì ìê³ ììµëê¹? ê·žë ì§ ìì ê²œì° êž°íê° ìì ë íŽí¹ì ììí ê²ì ëë€. ð
ëŽ íì¬ ìê°ì // @ts-ignore
// @override
죌ììŒ ê²ì
ëë€. ì ë ê°ìžì ìŒë¡ ë°ìœë ìŽí°ë¥Œ íŒíë ê²ì ì íží©ëë€. (íì¬ íììì) ë°íì ì맚í±ìŽ ìê³ ì¬ì í 2ëšê³ìŽê³ Ʞ볞ì ìŒë¡ ë¹íì±íëìŽ ìêž° ë묞ì
ëë€.
ìŽìŽ ì¢ë€ë©Ž ì¬ì©ì ì ì TSLint ê·ì¹ì 90% ì룚ì
ìŽ ë ê²ìŽë©° 믞íìŽ ë¶ì¡±í ë¿ìŽë©° ë¬Œë¡ ìžìŽì ìžë¶ ì¬íì ì ë
íì§ ìê³ ë ììŒë¡ ëìê° ì ììµëë€. ì í ìžì ê·ì¹, tslint-language-service ë° ìë ìì ì ì¬ì©íë©Ž ê°ë°ì êŽì ìì TSLint ì€ë¥ì ëŽì¥ TS ì€ë¥ ì¬ìŽì ì€ì ë¡ í° ì°šìŽê° ììµëë€. ëŽ í¬ë§ì TSLint íë¬ê·žìž(ëë ì¬ë¬ 겜ì íë¬ê·žìž)ìŽ ì»€ë®€ëí°ì ìœê°ì 겜í곌 ìµê³ ì ì믞 첎ê³ì ëí ë ë§ì í©ìì ëë¬í ì ìë êž°í륌 ì ê³µíë ê²ì
ëë€. ê·žë¬ë©Ž íµì¬ TSLint ê·ì¹ìŒë¡ ì¶ê°ë ì ììŒë©° íµì¬ ìžìŽìì override
í€ìëì 믞ì ìŽì ì ì ë¹ííêž°ì 충ë¶í ëª
íì±ê³Œ ëꞰ륌 ì ê³µí ì ììµëë€.
ì¬êž°ìì ìì ë°ìì ìê°íììì€. ì¬êž°ì ë ê°ì§ ë€ë¥ž ìë늬ì€ê° ììµëë€. C#ì Ʞ볞ì ìŒë¡ ë©ìëê° ê°ììŽ ìëêž° ë묞ì virtual
ë° override
륌 ì¬ì©í©ëë€. JavaScriptìì íŽëì€ì 몚ë íšìë Ʞ볞ì ìŒë¡ virtual
ì
ëë€. ê·žë¬ë©Ž íë¡ìžì€ë¥Œ ë°ì íê³ ëì nooverride
ì í ìì ì륌 ì¬ì©íë ê²ìŽ ë í©ëŠ¬ì ìŽì§ ììµëê¹? ë¬Œë¡ ì¬ëë€ì ì¬ì í ââê·žê²ì ê°ì í ì ìì§ë§, ìµìí Ʞ볞 íŽëì€ì ìŒë¶ êž°ë¥ì 걎ëëŠ¬ì§ ë§ììŒ íë€ë êŽë¡ë¥Œ ë°ìŽë¶ìŽë ë° ëììŽ ë©ëë€. ë€ì ë§íì§ë§, ì¬êž°ììë íì€ì ë²ìŽë ìê°í©ëë€. ;) ê·žê²ì ëí ëžë ìŽí¹ 첎ìžì§ê° ëí ìë ììµëë€.
ê·žë¬ë©Ž íë¡ìžì€ë¥Œ ë°ì íê³ ëì
nooverride
ì í ìì ì륌 ì¬ì©íë ê²ìŽ ë í©ëŠ¬ì ìŽì§ ììµëê¹?
ëë ë¹ì ì ì¬ê³ ë°©ìì ì¢ìíê³ ë¹ì ìŽ ì°Ÿê³ ìë ê²ìŽ ìµì¢ ì ìŽëŒê³ ìê°í©ëë€.
readonly
ë ìŽë»ìµëê¹? JSìì ë©ìë륌 ì¬ì ìíë€ë ê²ì ì€ì ë¡ ìžì€íŽì€ííë ëì(íë¡í íì
첎ìžìŽ ì ì©ë ë) ë¶ëªšì ë©ìë륌 ììì ë©ìëë¡ ë°êŸžë ê²ì ì믞íë€ê³ ìê°í©ëë€. ìŽ ê²œì° readonly
ë©ìë륌 ì¬ì©íë©Ž "몚ë ì¬ëìŽ ë³Œ ì ìì§ë§ ììì íµíŽë ìžì€íŽì€í í ëì ìŒë¡ë ë구ë ìŽë¥Œ ë³ê²œíì§ ìꞰ륌 ë°ëëë€."ëŒë ìë¯žê° ë©ëë€. ìŽë¯ž ë©€ë²ë¥Œ ìíŽ êµ¬íëìŽ ìëë°, ë©ìëììë 구ííì§ ìë ìŽì ë 묎ìì
ëê¹?
ìŽë¯ž ì ììŽ ììµëê¹? ê·žë ì§ ìì ê²œì° ì¬ì ìì ëììŒë¡ ì¡°ì¬í ê°ì¹ê° ììµëë€...
_edit:_ë ìœêž° ì ì© ë©€ë²ë¥Œ ì¬ì ìí ì ìë ê²ìŒë¡ ë°íì ž ìŽ ì 첎 ìžìê° ì¶ìë©ëë€.
ìë§ë private
íŽëì€ íšì륌 íì©íë ê²ìŽ ë ë€ë¥ž ìµì
ì
ëê¹?
ížì§: "ìµì¢ ìŒë¡ íìíë ëì "ìŽëŒê³ ìê°íì§ë§ ë°ì¯€ ì ìŽ ë€ìì ê²ì ëë€(ë¶ëª í "ìµì¢ "ì ê³µê°ë¥Œ ì믞íì§ë§ ì¬ì ìí ì ìì), LOL; ì 겜 ì°ì§ ë§ì.
@rjamesnw ìŽë¯ž íŽëì€ íšì륌 ê³µê°, 볎íž, ë¹ê³µê°ë¡ ì ìí ì ììµëë€.
ëë "ìµì¢ "ë§ ê°ë ê²ìŽ íŽê²°ì± ìŽ ë ê²ìŽëŒê³ ìê°íì§ ììµëë€. 묞ì ë ì¬ëë€ìŽ ìŽë¯ž ì¬ì© ì€ìž ìŽëŠì ê°ì§ Ʞ볞 íŽëì€ìì ììë íŽëì€ìì ì€ìë¡ ì íšì륌 ë§ë€ ì ìë€ë ê²ì ëë€. ì¢ ì¢ ì€ë¥ê° ë°ìíì§ ìê³ ìŽìí ìŒìŽ ë°ìíê±°ë ë°ìíì§ ìêž° ë묞ì ë§€ì° ì€ë§ì€ë¬ìŽ ìŒìŽ ëª ë² ë°ìíìµëë€...
ê·žëì ì ìê°ìë ê°ììŒë¡ íìëì§ ìê³ ì¬ì ìë ë 컎íìŒë¬ìì ì€ë¥ë¥Œ ë°ììí€ëë¡ ê°ì íë ìë¡ìŽ tsconfig.json í목ì ë³Žê³ ìë€ê³ ìê°í©ëë€(ê·žëŠ¬ê³ ì¬ì ìíë íëª©ìŽ ì¬ì ì ëë ìµì¢ ìŒë¡ íìëš).
override
ê° ììŒë©Ž TypeScriptê° ì»ŽíìŒ ìê° ìì ì±ê³Œ íì ìì ì±ì ëí [ìžì§ë] ìœìì ëíŽ ì¬ì©ì륌 ì€ë§ìí€ê³ ìë€ê³ ìê°í©ëë€.
"IDE ëª
ë ¹ì ì¬ì©íì¬ ë©ìë ì¬ì ì" ìžìë ìœëê° ë°ì íšì ë°ëŒ ë¶íŽë©ëë€(ë€ë¥ž ì¬ëë€ìŽ ì§ì í ëë¡).
ëí 몚ë 죌ì ë¹êµ ìžìŽê° ìŽë€ ííë¡ë override
륌 ì¶ê°í ê² ê°ìµëë€.
죌ì ë³ê²œ ì¬íì ë§ë€ì§ ììŒë €ë©Ž tslint ê·ì¹(ìë°ììì ì ì¬)ìŽ ë ì ììµëë€.
Btw, 죌ì ë²ì ìžìŽ(ì: 2.x -> 3.x) ê°ì 죌ì ë³ê²œ ì¬íì íì©íì§ ìë ìŽì ë 묎ìì
ëê¹? ì°ëŠ¬ë ê°íê³ ì¶ì§ ìì£ ?
override
ì í¹ì ìžë¶ ì¬íì 묞ì ê° ìë ê²ìŒë¡ íëª
ëë©Ž 3.xìì ìŒë¶ ë³ê²œì ìì íŽìŒ í©ëë€. ê·žë ê² íììì€. ëë ëë¶ë¶ì ì¬ëë€ìŽ ì§í ìëì ížíì±ì ì 충ì ì ìŽíŽíê³ ëìŽ íê°í ê²ìŽëŒê³ ìê°í©ëë€. ì ë§ override
ììŽë TS륌 Java ëë C#ë³Žë€ ë ì€ì©ì ìž ê²ìŒë¡ ì¶ì²í ì ììµëë€...
ì¬ëë€ìŽ ì격íꞰ륌 ìíë€ë©Ž íì override
ë°©ë²ìŽ ììŽìŒ í©ëë€(ì íì tslint ê·ì¹ìŒ ì ìì). íì override
ì ê°ì íšì¬ ë®ìµëë€. ìíŒíŽëì€ì ë©ìë륌 ì€ìë¡ ì¬ì ìí ê°ë¥ì±ìŽ ì°ë°ì ìŒë¡ ì¬ì ìíì§ ìë ê²ë³Žë€ íšì¬ ë®êž° ë묞ì
ëë€.
ì¬ì€ 2015ë ë¶í° ê³µê°ë ìŽ ížë ëŽ TypeScriptì ìŽì 곌 ì ëì ëí ëì ìëìŽì ëë€...
ìŽê²ì grand*-parentsì ì¬ì ì ë©ìë륌 ì²ëŠ¬íì§ ììµëë€.
/* Put this in a helper library somewhere */
function override(container, key, other1) {
var baseType = Object.getPrototypeOf(container);
if(typeof baseType[key] !== 'function') {
throw new Error('Method ' + key + ' of ' + container.constructor.name + ' does not override any base class method');
}
}
ëí ìŽ ë¬žì ì ëíŽ GHì No one assigned
ìŽ(ê°) ì¬íê³ ì€ë§ì€ëœìµëë€. TypeScript í¬í¬ë¥Œ ìí ìê°ì
ëê¹? ;) 컎íìŒíììžìŽíì€í¬ëŠœíž...
ìŽ ì 첎 ì€ë ëë "ë¶ìì ìí ë§ë¹" ë°©ì§ íšíŽì²ëŒ 볎ì ëë€. "20%ì ìì ìŒë¡ 80%ì ê²œì° ê°"ì ìííê³ ì€ì ë¡ ìëíê³ íìí ê²œì° 3.xìì ì¡°ì íì§ ìë ìŽì ë 묎ìì ëê¹?
ëšìíê³ ë¹ë²íë©° ë§€ì° ê°ì¹ ìë ì¬ì© ì¬ë¡ë ëë¶ë¶ì ì¬ëë€ìŽ ì€ì ë¡ ê±±ì í íìê° ìë ìŒë¶ ìœë ì¬ë¡ì ìíŽ "ìžì§"ë¡ ì¡í ììµëë€.
ë°ëŒì ìœê°ì ëì ììŽë ìëì§ë§ ë°ìœë ìŽí°ë¥Œ íµíŽ 컎íìŒ íìì ì í ê²ì¬ê° ê°ë¥í©ëë€.
export const override = <P extends Function>() => <K extends keyof P["prototype"]>(
target: Object,
methodName: K,
descriptor: TypedPropertyDescriptor<P["prototype"][K]>
) => {
// this is a no-op. The checking is all performed at compile-time, so runtime checks are not needed.
}
class Bar {
biz (): boolean {
return true;
}
qux (): string {
return "hi";
}
}
class Foo extends Bar {
// this is fine
@override<typeof Bar>()
biz (): boolean {
return false;
}
// error: type '() => number' is not assignable to type '() => boolean'
@override<typeof Bar>()
biz (): number {
return 5;
}
// error: argument of type '"baz"' is not assignable to parameter of type '"biz" | "qux"'
@override<typeof Bar>()
baz (): boolean {
return false;
}
}
ëª ìì ìŒë¡ ì ë¬íì§ ìê³ ìíŒ ì íì ëí 찞조륌 ì»ì ì ìëì§ íì€íì§ ììµëë€. ìŽê²ì ìœê°ì ë°íì ë¹ì©ìŽ ë°ìíì§ë§ ê²ì¬ë 몚ë 컎íìŒ ìê°ì ëë€.
@alangpierce
ëŽ ìžìì TSLint ê·ì¹ìŽ ì¬êž°ìì ê°ì¥ ë¶ëë¬ìŽ 겜ë¡ìŒ ê²ìŽëŒë ê²ì ëë€.
[...]
ê·žë° ë€ì íµì¬ TSLint ê·ì¹ìŒë¡ ì¶ê°ë ì ììŒë©° íµì¬ ìžìŽìì ì¬ì ì í€ìëì 믞ì ìŽì ì ì ë¹ííêž°ì 충ë¶í ëª íì±ê³Œ ëꞰ륌 ì ê³µí ì ììµëë€.
100% ëìí©ëë€. ìŽë¯ž ììí©ìë€!
ìë íìžì - ìì ë³Žë€ ì¡°êž ëŠìì§ë§ ë°ìœë ìŽí°ë¥Œ ì¬ì©íì¬ êµ¬íí tslint ê·ì¹ìŽ ììµëë€.
https://github.com/bet365/override-linting-rule
ì°ëŠ¬ë ëª ë ëì ~1mloc TypeScript ìœëë² ìŽì€ìì ìŽê²ì ì¬ì©íŽ ììŒë©° ìµê·Œì ìžìŽ ìë¹ì€ë¥Œ ì¬ì©íëë¡ ì ë°ìŽížíì¬ íšì¬ ë ë¹ ë¥Žê² ì€ííê³ ì€í ìì€ì ë ì í©íê² ë§ë€ììµëë€(ìŽì ë°ë³µììë íë¡ì ížì ì 첎 íšì€ê° íìíìµëë€. ì ì° ì 볎륌 ìì§íêž° ìíŽ).
ì°ëŠ¬ì ì ì€ ìŒìŽì€ì ê²œì° ë§€ì° ì€ìíìµëë€. ì± ìì ê¶ê·¹ì ìŒë¡ 컎íìŒë¬ì ììŽìŒ íê³ ëŠ°íž ê·ì¹ì ììë°©ížìŒë¡ ì¬ê²šì žìŒ íë€ê³ ì¬ì í ìê°íê³ ììµëë€.
ê°ì¬ íŽì
ëìíë€. ëë ëí TS 컎íìŒë¬ì êŽë šë ì룚ì ìŽ ë°ìœë ìŽí°ì ëŠ°íž ê·ì¹ë³Žë€ íšì¬ ë«ë€ê³ 믿ìµëë€.
ìŽ êž°ë¥ì ìíë 묎ìì ëê¹? ìì§ ì»ŽíìŒë¬ êž°ë¥ìŒë¡ ì¬ê²í ëììµëê¹?
ë°ëŒì ìœê°ì ëì ììŽë ìëì§ë§ ë°ìœë ìŽí°ë¥Œ íµíŽ 컎íìŒ íìì ì í ê²ì¬ê° ê°ë¥í©ëë€.
ìŒë¶ ê°ì ì¬í:
function override< Sup >( sup : { prototype : Sup } ) {
return <
Field extends keyof Sup ,
Proto extends { [ key in Field ] : Sup[ Field ] } ,
>(
proto : Proto ,
field : Field ,
descr : TypedPropertyDescriptor< Sup[ Field ] > ,
)=> {}
}
class Foo {
bar( a : number ) {
return a
}
bar2( a : number , b : number ) {
return a
}
}
class Foo2 {
@override( Foo )
bar( a : number ) {
return 1
}
@override( Foo )
bar2( a : number , b : number ) {
return 1
}
xxx() { return '777' }
}
class Foo3 extends Foo2 {
@override( Foo ) // OK
bar( a : number ) { return 5 }
@override( Foo ) // Error: less args than should
bar2( a : number ) { return 5 }
@override( Foo ) // Error: accidental override Foo2
xxx() { return '666' }
@override( Foo ) // Error: override of absent method
yyy() { return 0 }
}
ì¢ì, 컎íìŒ ì€ë¥ë¥Œ ë°©ì§íë ì¬ì ì ì룚ì
ì ì°Ÿììµëë€.
ë
žë ìœêž° ê°ë¥ ì€ížëŠŒì ì:
// Interface so you will keep typings for all Readable methods/properties that are not overriden:
// Fileds that are `Omit`-ed should be overriden (with any signature you want, it do not have to be compatible with parent class)
interface ReadableObjStream<T> extends Omit<stream.Readable, 'push' | 'read'> {}
// Use extends (TYPE as any) to avoid compilation errors and override `Omit`-ted methods
class ReadableObjStream<T> extends (stream.Readable as any) {
constructor() {
super({objectMode: true}); // force object mode. You can merge it with original options
}
// Override `Omit`-ed methods with YOUR CUSTOM SIGNATURE (can be non-comatible with parent):
push(myOwnNonCompatibleSignature: T): string { /* implementation*/ };
read(options_nonCompatibleSignature: {opts: keyof T} ): string { /* implementation*/ }
}
let typedReadable = new ReadableObjMode<{myData: string}>();
typedReadable.push({something: 'else'}); // will throw compilation error as expected
typedReadable.pipe(...) // non overloaded methods typings supported as expected
ìŽ ì룚ì
ì ì ìŒí ëšì ì super.parentMethod
륌 ížì¶í ë íìŽíìŽ ë¶ì¡±íë€ë ê²ì
ëë€(ê·žë¬ë interface
ReadableObjStream ëë¶ì ReadableObjStreamì ìžì€íŽì€ë¥Œ ì¬ì©í ë 몚ë íìŽíìŽ ê°ë¥í©ëë€.
@nin-jin @bioball ë°ìœë ìŽí° 컎íìŒ ìê° ê²ì¬ì ëí êž°ì¬ì ê°ì¬ë늜ëë€.
ë¶ííë protected
íììê²ë ìëíì§ ìë ê² ê°ìµëë€. public
ììë§ ìëí©ëë€.
( ëì§ì ëìŽí° ëŽ í¬í¬ ì ì€ë¥ ì
ì¬ì ì ì§ì ìë C++ 11ì í¬ë¬ êž°ë¥ìŽììµëë€.
늬í©í ë§ ìœëì ë§ì ëììŽ ëê³ ë³Žíží©ëë€.
ë íì€í ì¥ì 묌 ììŽ TS êž°ë° ì§ììì ìŽê²ì ê°ê³ ì¶ìµëë€(VOTE!)
ì°ëŠ¬ë ìŽ êž°ë¥ì ëí ìŽë ¬í ì§ìì ë¶ëª í ë³Žì¬ ì£Œìì§ë§ 곧 ìŽ êž°ë¥ì ì¶ê°í ê³íì ìë ê² ê°ìµëë€.
ë ë€ë¥ž ììŽëìŽ:
class Obj {
static override<
This extends typeof Obj,
Over extends keyof InstanceType<This> = never,
>(this: This, ...overs: Over[]) {
return this as This & (
new(...a:any[])=> InstanceType<This> & Protect< Omit<InstanceType<This> , Over > >
)
}
}
class Foo extends Obj {
bar(a: number) {
return 0
}
bar2(a: number) {
return 0
}
foo = 1
}
class Foo2 extends Foo.override('bar') {
foo = 2
bar( a : number ) {
return 1
}
// Error: Class 'Foo & Protect<Pick<Foo, "bar2" | "foo">>'
// defines instance member property 'bar2',
// but extended class 'Foo2' defines it as instance member function.
bar2( a : number ) {
return 1
}
bar3( a : number ) {
return 1
}
}
declare const Protected: unique symbol
type Protect<Obj> = {
[Field in keyof Obj]:
Object extends () => any
? Obj[Field] & { [Protected]: true }
: Obj[Field]
}
ì¬êž°ì ëŽ 2ìŒížë¥Œ ëí©ëë€.
ììì ì²ëŠ¬íê³ valueChanges ë±ì 구ë
ì·šìíŽìŒ íë ìŒë°ì ìž ê°ë êµ¬ì± ììê° ììµëë€. ì°ëŠ¬ë ìœë륌 몚ë ê³³ìì ë°ë³µíê³ ì¶ì§ ììêž° ë묞ì(ìŒì¢
ì íì¬ ìí) ê°ë OnInit ë° OnDestroy ë©ìë륌 구ííë "TypicalFormBaseComponent"륌 ë§ë€ììµëë€. 묞ì ë ìŽì ì€ì ë¡ ê·žê²ì ì¬ì©íê³ ìì ë§ì OnDestroy ë©ìë륌 ì¶ê°íë©Ž(ìŽë ꜀ íì€ì ìž ë°©ë²ì) ìë ë©ìë륌 ìšêž°ê³ ìì€í
ì ì€ëšìíšë€ë ê²ì
ëë€. super.OnInit륌 ížì¶íë©Ž 묞ì ê° íŽê²°ëì§ë§, íì¬ë¡ìë ììŽë€ìŽ ê·žë ê² íëë¡ ê°ì í ì ìë ë©ì»€ëìŠìŽ ììµëë€.
ìì±ì륌 ì¬ì©íì¬ ìííë©Ž super()륌 ížì¶íŽìŒ í©ëë€... ë¹ì·í ê²ì ì°Ÿê³ ììëë° ìŽ ì€ë ë륌 ì°Ÿììµëë€. ìì§í ë§íŽì ì¢ ë¹í©ì€ëœìµëë€.
tsìì "new" ë° "override"륌 구ííë ê²ì íêž°ì ìž ë³ê²œìŒ ì ìì§ë§ Ʞ볞ì ìŒë¡ 몚ë ìœëë² ìŽì€ìì ìŽë¥Œ ìì íë ê²ì ë§€ì° ê°ëší©ëë€(ë¹ëª
ì ì§ë¥Žë 몚ë ê³³ì 'override'륌 ì¶ê°íêž°ë§ íë©Ž ëš). ëšì§ ê²œê³ ìŒ ìë ììµëë€ .
ìŽìšë , ììŽë€ìê² ìíŒ ìœì ê°ì í ì ìë ë€ë¥ž ë°©ë²ìŽ ììµëê¹? ìšê¹ì ë°©ì§íë TSLint ê·ì¹ ëë ìŽì ì ì¬í ê²?
ì¶ì : "ë žìœë©íž" ì ì± ì ëìíì§ ììµëë€. ì¬ëë€ìŽ ì¬êž°ì ìì 륌 ëì§ë ê²ì ë°©ì§í©ëë€. ìë§ë 'ì¬ì ì'륌 구ííì§ ìì ê²ìŽì§ë§ 묞ì 륌 ì²ëŠ¬íë ë€ë¥ž ê²ì 구íí ê²ì ëë€. ìŠ, ì€ì ë¡ ìœì ì ìë€ë©Ž ë§ì ëë€.
@GonziHere C# ëë Javaì ê°ì ë€ë¥ž ìžìŽìì ì¬ì ìë ìíŒ ë©ìë륌 ížì¶íŽìŒ íë€ë ì구 ì¬íì ì믞íì§ ììµëë€. ì€ì ë¡ë ê·žë ì§ ìì 겜ì°ê° ë§ìµëë€. ìì±ìë í¹ë³íë©° ìŒë°ì ìž "ê°ì ë©ìë"ê° ìëëë€.
override í€ìëë ë©ìëê° êž°ë³ž íŽëì€ìì íží ê°ë¥í ìëª ìŒë¡ ìŽë¯ž ì ìëìŽ ììŽìŒ íê³ ì»ŽíìŒë¬ê° ìŽë¥Œ ìŽì€ì í ì ììì ì§ì íë ë° ì¬ì©ë©ëë€.
ì, íì§ë§ ì¬ì ìê° íìíêž° ë묞ì ë©ìëê° ì¡Žì¬íë€ë ê²ì ì ì ììµëë€.
@GonziHere ì€ì ë¡ íìí ê²ì ì¶ì êž°ë¥ì ì¬ì©íì¬ ì¶ì Ʞ볞 íŽëì€ë¥Œ ë§ëë ê² ê°ìµëë€. ìë§ë ë ìì¡Ží ì ìë ë¹ê³µê° _onInit
ë° _onDestroy
ë©ìë륌 ë§ë ë€ì 볎ížë onInit
ë° onDestroy
ì¶ì íšì(ëë ë€ì곌 ê°ì ê²œì° ìŒë° íšì)륌 ë§ë€ ì ììµëë€. íìíì§ ìì). private íšìë ë€ë¥ž íšì륌 ížì¶í ë€ì ì ìì ìŒë¡ ìë£ë©ëë€.
@GonziHere @rjamesnw ìì í ë°©ë²ì ì€ì ë¡ onInit
ë° onDestroy
ê° _final_ìì ê°ì íê³ ìµì¢
ë©ìëê° ížì¶íë ë¹ìŽ ìë 볎ížë ì¶ì í
í늿 ë©ìë륌 ì ìíë ê²ì
ëë€. ìŽê²ì ì묎ë ì€ìë¡ ë©ìë륌 ì¬ì ìí ì ìëë¡ íê³ ê·žë ê² íë €ê³ íë©Ž(ìµì¢
ë©ìë륌 ì ì©íë ë°©ë²ìŽ ìë€ê³ ê°ì ) ì¬ì©ìê° ìíë ê²ì 구ííë ì¬ë°ë¥ž ë°©ë²ì ìŠì ìë €ì€ëë€.
@shicks , @rjamesnw , @GonziHereì ê°ì ìí©ì
ëë€. ê° ìëª
죌Ʞ íí¬ì ëíŽ ì€ííë €ë êž°ë¥ìŽ ìêž° ë묞ì Ʞ볞 íŽëì€ì ì¶ì ë©ìëê° ìë ê²ì ìíì§ ììµëë€. 묞ì ë ëêµ°ê° super()
륌 ížì¶íì§ ìê³ ìì íŽëì€ì ngOnInit ëë ngOnDestroy륌 ì¶ê°í ë Ʞ볞 êž°ë¥ìŽ ì€ì ë¡ ë첎 ëë ê²ì ìíì§ ìëë€ë ê²ì
ëë€. override
륌 ì구íë©Ž ê°ë°ìë ìŽë¬í ë©ìëê° êž°ë³ž íŽëì€ì ì¡Žì¬íê³ super()
륌 ížì¶íŽìŒ íëì§ ì¬ë¶ë¥Œ ì ííŽìŒ íë€ë 죌ì륌 êž°ìžì¬ìŒ í©ëë€.
Java ìì± ê²œíì ë°ë¥Žë©Ž @Override
ë ë묎 ìŒë°ì ìŽìŽì ìììŽ ë©ëë€. ëë¶ë¶ì ê²œì° ì¬ì ìë ë©ìëë ì¶ìì ìŽê±°ë ë¹ìŽ ììŒë¯ë¡( super()
ê° ížì¶ëì§ _ìì_) override
super()
ê° íìíë€ë ëª
íí ì ížê° ìëëë€.
Java ìì± ê²œíì ë°ë¥Žë©Ž
@Override
ë ë묎 ìŒë°ì ìŽìŽì ìììŽ ë©ëë€. ëë¶ë¶ì ê²œì° ì¬ì ìë ë©ìëë ì¶ìì ìŽê±°ë ë¹ìŽ ììŒë¯ë¡(super()
ê° ížì¶ëì§ _ìì_)override
super()
ê° íìíë€ë ëª íí ì ížê° ìëëë€.
ê·žê²ì ë¹ë©Ží 죌ì ì êŽë šìŽ ììµëë€. 묞ì 륌 íŒíêž° ìíŽ ììë³Žë€ í©ì±ì ì¬ì©íë€ê³ ë§í ìë ììµëë€.
ì ìê² override
ì ê°ì¥ ì ì©í ë¶ë¶ì 늬í©í ë§ íë ëì ì€ë¥ê° ë°ìíë ê²ì
ëë€.
ì§êžì Ʞ볞 íŽëì€ìì ìŒë¶ ë©ìëì ìŽëŠì ë°êŸžë ê²ìŽ ë묎 ìœê³ ìŽë¥Œ ì¬ì ìíë ë©ìëì ìŽëŠì ë°êŸžë ê²ì ììµëë€.
super
륌 ížì¶íë ê²ì êž°ìµíë ê²ì ê·žë€ì§ ì€ìíì§ ììµëë€. ìŽë€ 겜ì°ìë ížì¶ íì§ ìë ê²ë ë§ìµëë€.
_override_ê° ì€ìí ìŽì ì ëíŽ ì€íŽê° ìë ê² ê°ìì. ëêµ°ê°ìê² _super()_ ë©ìë륌 ížì¶íëë¡ ê°ìíë ê²ìŽ ìëëŒ íëê° ì¡Žì¬íë€ë ê²ì ìëŠ¬ê³ íŽë¹ ëìì ìµì í ì§ íì¥í ì§ ì¬ë¶ë¥Œ ìì¬ì ìŒë¡ ê²°ì í ì ìëë¡ í©ëë€.
ì íì±ì 볎ì¥íêž° ìíŽ ì¬ì©íë íšíŽì Parameters
ë° ReturnType
륌 ì¬ì©íë©Žì Ʞ볞 íŽëì€ë¥Œ ë€ì곌 ê°ìŽ ë§€ì° ëª
ìì ìŒë¡ ì°žì¡°íë ê²ì
ëë€.
class Base {
public methodName(arg1: string, arg2: number): boolean {
return false; // base behaviour, may be stub.
}
}
class Derived extends Base {
public methodName(...args: Parameters<Base["methodName"]>): ReturnType<Base["methodName"]> {
const [meaningful, variableNames] = args;
return true; // implemented behaviour here.
}
}
ìŽë¬í ì¢
ë¥ì íšíŽì inherit
í€ìë륌 ì¶ê°íë ê²ìŽ ì¢ìµëë€. . ìŽë ê² íë©Ž Ʞ볞 íŽëì€ì ëí 몚ë ì
ë°ìŽížê° ìëìŒë¡ ì íëê³ íì íŽëì€ìì ì íšíì§ ìì ê²œì° ì€ë¥ê° ë°ìíê±°ë Ʞ볞 íŽëì€ì ìŽëŠìŽ ë³ê²œëë©Ž inherit
ììŽëìŽì íšê» ì€ë¥ë ì ê³µë©ëë€. Ʞ볞 íŽëì€ì ëìŒí ìëª
ë§ ì ê³µíëë¡ ì íëì§ ìê³ ì§êŽì ìŒë¡ íì¥í ì ììµëë€.
ëë ëí override
ê° ì ì€ìíì§ì ëí ì€íŽê° ìë€ê³ ìê°íì§ë§ " super()
ìŽ íìíì§ ì¬ë¶"ì ëí ìŽë¬í 몚ë 묞ì 륌 ì€ì ë¡ ìŽíŽíì§ ëª»í©ëë€.
@lorenzodallavecchia ì ìŽ ë¬žì ì ìë ìì±ìê° ë§í ê²ì ë°ìíêž° ìíŽ íšì륌 override
ë¡ íìíë ê²ì ìíŒíŽëì€ê° 늬í©í ë§ë ë, í¹í ìŽëŠ ë°/ëë ìëª
ìŽ ì¬ì ìë êž°ë¥ìŽ ë³ê²œëê±°ë êž°ë¥ìŽ ì ê±°ë©ëë€.
ì¬ì ìë íšìì ìëª ì ë³ê²œíë ì¬ëì ì¬ì ìê° ìë€ë ì¬ì€ì ìžìíì§ ëª»í ì ììµëë€. (ì륌 ë€ìŽ C++ìì) ì¬ì ìê° ëª ìì ìŒë¡ ì¬ì ìë¡ íìëì§ ìì ê²œì° ì¬ì ìë íšìì ìŽëŠ/ìëª ì ë³ê²œíŽë 컎íìŒ ì€ë¥ê° ë°ìíì§ ììŒë©° ëšìí íŽë¹ ì¬ì ìê° ë ìŽì ì¬ì ìëì§ ìëë¡ í©ëë€. (ê·žëŠ¬ê³ .. ìë§ë ë ìŽì ì ì©íì§ ìì ê²ìŽê³ , ë ìŽì ížì¶íë ë° ì¬ì©ë ìœëì ìíŽ ížì¶ëì§ ììŒë©°, ì¬ì ì륌 ížì¶íŽìŒ íë ê²ìŽ ìŽì Ʞ볞 구íì ížì¶íêž° ë묞ì ë§ì ìë¡ìŽ ë²ê·žë¥Œ ëì í©ëë€)
C++ìì 구íë override í€ìëë ìŽë¬í 묞ì ìì Ʞ볞 구íì ë³ê²œíë ì¬ëì 구íŽì€ëë€. 늬í©í ë§ ì§í 컎íìŒ ì€ë¥ê° ë§ì ì¬ì ìê° ì¡Žì¬íš(ì§êžì ì¡Žì¬íì§ ìë Ʞ볞 구íì ì¬ì ìíš)곌 ëšì륌 íìíêž° ë묞ì ëë€. ì¬ì ìë 늬í©í ë§íŽìŒ í íìê° ìë€ë ì¬ì€ì ëìí©ëë€.
override
ìììŽë¥Œ ê°ë ê²ìë 2ì°š IDE ì ì©ì± ìŽì ìŽ ììµëë€(ìì ìë ìžêž) override
ì¬ì ìí ì ììµëë€.
override
í€ìëì íšê» ì¬ì©íë©Ž ë€ë¥ž ë©ìë륌 ì¬ì ìíë 몚ë ë©ìëê° override
í€ìë륌 ì¬ì©íëë¡ ì구 íë íë귞륌 ëì
íë ê²ìŽ ì¢ìµëë€. íì íŽëì€ì ë©ìëì 믞ëì Ʞ볞 íŽëì€(íì¬ ëŒìŽëžë¬ëŠ¬ì ìì ì ìì)ë íì íŽëì€ìì ë§ë ë©ìëì ëìŒí ìŽëŠì ë©ìë륌 ë§ëëë€(íì íŽëì€ê° íŽë¹ ë©ìë륌 ì¬ì ìíêž° ë묞ì ì§êžì ë²ê·žê° ë°ìí ì ììµëë€. ).
ìŽ ê²œì° ì»ŽíìŒ ì€ë¥ê° ë°ìíì¬ ìŽ ë©ìëì override
í€ìë륌 ì¶ê°íŽìŒ í©ëë€ . Ʞ볞 íŽëì€)ê° íšì¬ ë ì¢ê³ ê°ë¥í ë°íì ë²ê·žë¥Œ íŒí ì ììµëë€.
Java륌 ìì±í ëŽ ê²œíì ë°ë¥Žë©Ž @Override ë ë묎 ìŒë°ì ìŽìŽì ë žìŽìŠê° ë©ëë€.
ë§ì Java ë íì ëë ìì ì§ì ì ê°ë ¥íê² ëìíì§ ììµëë€. ì¬ì ìë íìžë ììžì ê°ì íµì ë°©ë²ì ëë€. ì¢ê³ ì«ììŽ ìëëŒ íì§ê³Œ êž°ëì¹ì êŽí ê²ì ëë€.
ë°ëŒì @lucasbasquerotto ì í° +1ìŽì§ë§ ë€ë¥ž êŽì ìì: íì íŽëì€ì ë©ìë륌 ëì íë©Ž ì¬ì ìíê±°ë ì¬ì ìíì§ ìë ëª íí ì믞륌 ê°ê³ ì¶ìµëë€. ì륌 ë€ìŽ ë©ìë륌 ì¬ì ìíë €ë ê²œì° ëª ìì ìŒë¡ ìë €ì£Œë ë°©ë²ìŽ íìí©ëë€. ëŽ êµ¬íì 묞ì ê° ìë 겜ì°(ì: ì€í ëë ì못ë ë³µì¬ ë° ë¶ì¬ë£êž°) ìŽì ëí íŒëë°±ì ë°ê³ ì¶ìµëë€. ëë ë€ë¥ž ë°©ë²: ì¬ì ìí ê²ìŒë¡ ììëì§ ììŒë©Ž ì¬ì ìê° ê°ë ë°ìíë 겜ì°ìë íŒëë°±ì ìí©ëë€.
ë€ë¥ž Java ê°ë°ìì íŒëë°±... @override ë Typescriptìì ì ë§ ëëœë ì ìŒí êž°ë¥ì ëë€.
ì ë ~15ë ì Java 겜í곌 1-2ë ëë Typescriptê° ììŽ ë ë€ ë§€ì° ížìí©ëë€.
@override ì íµì¬ì ìží°íìŽì€ìì ë©ìë륌 ì ê±°í ì ìê³ ì»ŽíìŒìŽ ì€ëšëë€ë ê²ì ëë€.
ê·žê²ì ìë¡ìŽ ë°©ë²ì ëí ꞎë°í ë°ìžë©ì ë°ëì ê°ìµëë€. ê·žê²ì ë¹ì ìŽ ì€ëë ê²ì ì ê±° í ì ììµëë€.
ìží°íìŽì€ë¥Œ 구ííê³ ë©ìë륌 ì¶ê°íë©Ž 컎íìŒìŽ ì€íšíì§ë§ ìŽì ëí ë°ëë ììµëë€.
ë©ìë륌 ì ê±°íë©Ž 죜ì ìœëë§ ëšê² ë©ëë€.
(늰í°ë¡ ê³ ì¹ ì ìì§ë§)
ë¶ëª
í ë§ì @Override
super
륌 ížì¶íŽìŒ íë€ë ì ížëŒë 죌ìì ìžêží ê²ì
ëë€. ê·žê²ìŽ ì ê³µíë ê²ì¬ë ê°ì¹ê° ìì§ë§ 죌ìŽì§ ì¬ì ìë ë©ìëì ëíŽ super
륌 ížì¶íë ê²ìŽ íìíê±°ë 묎ì믞í ì¬ë¶ì êŽê³ììŽ ìì í ëì§êž°ì
ëë€. ì¬ì ìë ë©ìëì ë§ì ë¶ë¶ìŽ _íŽìë ì ëêž° ë묞ì_ ê·ž 목ì ìë ë¹íšìšì ì
ëë€.
ì ìì ì ìëžíŽëì€ê° ì¬ì ì ê°ë¥í ë©ìëë¡ ë€ì ížì¶ëëë¡ íë €ë©Ž ë©ìë륌 final
ë¡ ë§ë€ê³ (í¹í #33446 ì°žì¡°) ë©ìë륌 ížì¶íëë¡ íë ê²ì
ëë€. super
ížì¶ ììŽ _ì¬ì§ì í ì ìë _ë€ë¥ž ìŽëŠì_ ë¹ í
í늿 ë©ìë. ê·ž ë¶ë³ëì ì»ë ë€ë¥ž í©ëŠ¬ì ìž ë°©ë²ì ììµëë€. ì ë override
ì ì ì ìŒë¡ ì°¬ì±í©ëë€. íì§ë§ ì¬ì©ìê° ëŽ API륌 ì못 ìëžíŽëì±íì¬ íìì ì
ì ì¬ëìŒë¡ì(ê·žëŠ¬ê³ ì ë API륌 ì€ëšíì§ ììŒë €ê³ íê³ ììµëë€) final
ìŒë¡ êŽì¬ì ì íí ê°ì¹ê° ìë€ê³ ìê°í©ëë€ upthreadìì ì ìí override
ê° ìëëŒ ìŽ ë¬žì ì ëí ì¬ë°ë¥ž íŽê²°ì±
ìŒë¡ final
#$륌 ì¬ì©íììì€.
ì¬ëë€ìŽ ê³ì final
ëë override
ì€ íë륌 ì ìíë ìŽì ì ëíŽ ìœê° íŒëì€ëœìµëë€. íì€í ì°ëŠ¬ë ìë¡ ë€ë¥ž 묞ì 륌 íŽê²°íêž° ë묞ì ë ë€ ìí©ëë€.
ì°ìžíë€
íŽëì€ë¥Œ íì¥íë ì¬ëë€ìŽ ì€ìë¡ ìì ì íšìë¡ íšì륌 ë®ìŽì°ë©Žì ìì ë ëªšë¥Žê² íë¡ìžì€ìì 묞ì ê° ë°ìíë ê²ì ë°©ì§í©ëë€. override í€ìë륌 ì¬ì©íë©Ž ê°ë°ìê° ì€ì ë¡ êž°ì¡Ž íšì륌 ì¬ì ìíê³ ììì ì ì ììŒë©° íšì ìŽëŠì ë°êŸžê±°ë ì¬ì ì륌 ì¬ì©íëë¡ ì íí ì ììµëë€(ê·žë° ë€ì super륌 ížì¶íŽìŒ íëì§ íìží ì ìì).
ê²°ì ì ìž
íŽëì€ë¥Œ íì¥íë ì¬ëë€ìŽ íšì륌 ìì í ë®ìŽì°ë ê²ì ë°©ì§íì¬ íŽëì€ì ìë ìì±ìê° ìì í ì ìŽë¥Œ 볎ì¥í ì ìëë¡ í©ëë€.
@sam-s4s ì°ëŠ¬ë ì ì 륌 ìí©ëë€ :-)
묞ì ìì..
class Base {}
class Entity extends Base {
id() {
return 'BUG-123' // busisess entity id
}
}
class Base {
id() {
return '84256635572' // storage object id
}
}
class Entity extends Base {
id() {
return '12' // busisess entity id
}
}
ì¬êž°ì ì°ë°ì ìž ê³Œë¶íê° ë°ìíìµëë€.
define
í€ìëê° ìë ì¬ë¡class Base {
define id() {
return '84256635572' // storage object id
}
}
class Entity extends Base {
define id() {
return '12' // busisess entity id
}
}
ë³Žë¥ ì€ë¥: ì°ì°í ì¬ì ì.
@nin-jin ì override
륌 ì¬ì©íë _not_ 곌 define
ê° ê°ì§ ììµëê¹?
@sam-s4s ì°ëŠ¬ë ì ì 륌 ìí©ëë€ :-)
ì€, ì¬êž°ìì define
ëŒë í€ìë륌 ìžêžíë ì¬ëì 볞 ì ìŽ ììµëë€. íì§ë§ ì€ëª
íì ëŽì©ì 볎멎 C#ìì virtual
ëŒë ëšìŽë¥Œ ì믞íë ê² ê°ìµëê¹?
(ëí Base
ë° Entity
íŽëì€ê° êŽë šìŽ ìêž° ë묞ì ìœê° íŒëì€ë¬ìŽ ì륌 ì°Ÿììµëë€. Entity
ê° Base
$륌 íì¥íë€ë ì믞ììµëê¹?)
2ê°ì§ ìë늬ì€ê° ìë ê² ê°ìë°...
a) final
ê° ìë 몚ë ê²ì ì¬ì ìí ì ìë€ê³ ê°ì íê³ êž°ë³ž íŽëì€ë¥Œ ìì±í©ëë€.
b) virtual
ê° ìë 몚ë ê²ì ì¬ì ìí ì ìë€ê³ ê°ì íì¬ êž°ë³ž íŽëì€ë¥Œ ìì±í©ëë€.
@sam-s4s ìí°í°ë ë¬Œë¡ Base륌 íì¥í©ëë€. :-) ëŽ ë©ìì§ë¥Œ ìì íìµëë€. virtual
ë ë€ë¥ž ê²ì êŽí ê²ì
ëë€.
override
륌 ì¬ì©íì§ ìë @lorenzodallavecchia ë 컎íìŒë¬ì ëíŽ define | override
ì
ëë€. define
륌 ì¬ì©íë ê²ì define
ë¿ìŽê³ 컎íìŒë¬ë ìŽë¥Œ ì격íê² íìží ì ììµëë€.
@nin-jin 몚ëžìì override
í€ìë륌 ì¬ì©íì§ ìë ê²ìŽ ì¬ì í í©ë²ì ìŽëŒë ì믞ì
ëê¹? ì륌 ë€ìŽ:
class Base {
myMethod () { ... }
}
class Overridden extends Base {
// this would not fail because this is interpreted as define | override.
myMethod () { ... }
}
ìŽìì ìŒë¡ë override
í€ìë륌 ì¬ì©íì§ ìë í ìì ììì ì€ë¥ê° ë°ìí©ëë€. íì§ë§ 묎ì ê²ì¬ë¥Œ ìµížììíë 컎íìŒë¬ íëê·žê° ìì ê²ìŽëŒê³ ìê°í©ëë€. ì¬êž°ì ìµížììì 몚ë ë©ìëì ëíŽ override | define
ì ëìŒí©ëë€.
@bioball ë€, ì¡Žì¬íë ë§ì ìœëìì ížíì±ì ìíŽ íìí©ëë€.
@sam-s4s ìí°í°ë ë¬Œë¡ Base륌 íì¥í©ëë€. :-) ëŽ ë©ìì§ë¥Œ ìì íìµëë€.
virtual
ë ë€ë¥ž ê²ì êŽí ê²ì ëë€.
ëë ì¬ì í ì ìê° ë¬Žìì ì믞íëì§ ì ëªšë¥Žê² ìµëë€ ... ìŽê²ì C#ìì virtual
ì ì ìì
ëë€.
The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class.
ì¬ì ìíêž° ìíŽ íšì륌 virtual
ë¡ íìíë ëì define
ë¡ íìíì¬ override
륌 ì¬ì©íŽìŒ íšì ì믞í ì ììµëë€. ì¬ì ìí
(ì define
ì
ëê¹? ë€ë¥ž ìžìŽë¡ íŽë¹ í€ìë륌 볞 ì ìŽ ììµëë€)
ëë ëª ë¶ ìì ìŽ êŽê³ 륌 íìŽë³Žìì§ë§ 맀ê°ë³ìì ë°í ê°ì ì€ë³µ ì§ì ì íŒíêž° ìíŽ ì¬ì ì륌 ì¬ì©íë ê²ì ì ìí ì¬ëì 볞 ì ìŽ ììµëë€. ì륌 ë€ìŽ:
class Animal {
move(meters:number):void {
}
}
class Snake extends Animal {
override move(meters) {
}
}
ìì ììì move
ë ëìŒí íì ë°í ì í( void
)ì ê°ì§ë©° meters
ë ëìŒí ì íì ê°ì§ë§ ì§ì í íìë ììµëë€. ëŽê° ìŒíë ëêž°ì
ì íŽë¡ì 컎íìŒë¬ íìŽíìì ë²ìŽë 몚ë ìë°ì€í¬ëŠœížë¥Œ íìŽíì€í¬ëŠœížë¡ ë§ìŽê·žë ìŽì
íë €ê³ í©ëë€. ê·žë¬ë Closureììë @override
ë§ ì¬ì©í ì ììŒë©° 몚ë ì íì ìíŒíŽëì€ìì ì ì¶ë©ëë€. ìŽê²ì ë¶ìŒì¹ ê°ë¥ì±ì ì€ìŽê³ ì€ë³µì ì€ìŽë ë° ë§€ì° ì ì©í©ëë€. ìíŒíŽëì€ì ì§ì ë 맀ê°ë³ìì ì íì ì§ì íì§ ìë 겜ì°ìë ì¶ê° 맀ê°ë³ì륌 ì¬ì©íì¬ ë©ìë륌 íì¥í ì ìëë¡ êµ¬ííë ê²ì ììí ìë ììµëë€. ì륌 ë€ìŽ:
class Animal {
move(meters:number):number {
}
}
class Snake extends Animal {
override move(meters, time:number) {
}
}
ëŽê° ì¬êž° ìì ëêžì ì°ë ëêž°ë ì°ëŠ¬ íì¬ê° ì¬ì ìë ë©ìëì ëíŽìë 몚ë ì íì ì§ì íëë¡ ì구íêž° ë묞ì ëë€. ìëíë©Ž typescriptìë ìŽ êž°ë¥ìŽ ìêž° ë묞ì ëë€(ê·žëŠ¬ê³ ì°ëŠ¬ë ꞎ ë§ìŽê·žë ìŽì ì€ì ììµëë€). ꜀ ì§ìŠëë€.
FWIWë ìì±íêž°ê° ë ìœì§ë§ 맀ê°ë³ì ì í(ë° íìŒ ê° ì í ì¶ë¡ ì ë€ë¥ž ìžì€íŽì€)ì ìëµíë©Ž ê°ë
ì±ì ì íŽí©ëë€. ìœëì ìµìíì§ ìì ì¬ëìŽ ìŽë€ ì íìŽ ìëì§ ìêž° meters
ìíŒíŽëì€ê° ì ìë ìì¹ë¥Œ ì°Ÿêž° ìíŽ ì£Œë³ì íí€ì³ìŒ íêž° ë묞ì
ëë€.
@shicks ë§ ê·žëë¡ ê°ì žìš ë³ìë íŽëì€ì ëíŽ ë§í ì ììµëë€. íìí 몚ë ì 볎륌 ëšìŒ íìŒì ë³µì íë©Ž ì¶ìí ë° ëªšëíì 목ì ìŽ ë¬Žíšíë©ëë€. ì íì ê°ì ë¡ ë³µì íë ê²ì DRY ìì¹ì ìë°°ë©ëë€.
ê°ì¥ ì ì©í ëêž
ì§ì§ê±°ëŠ¬ë ì ì ì©ìíŽ ì£Œìžì. íì§ë§ ìì§í ë§íŽì, ê·íì 죌ì¥ì Ʞ볞ì ìŒë¡ 몚ë ê²ìŽ ê³µê°ëë ìžìŽì
public
í€ìëì ì ì©ëì§ë§abstract
ë° ì íì override
í€ìëë ê°ë°ìê° ë ìì íë€ê³ ëëŒê³ ì€ì륌 ì€ìŽê³ ìê°ì ë ëë¹íë ë° ëììŽ ë©ëë€.ì¬ì ìë ì못 ì ë ¥ë ì¬ì ì ë©ìë ìŽëŠìŽ ëª ë°±í 컎íìŒ ìê° ë¬žì ê° ìëêž° ë묞ì ìžìŽìì ì€íì 믌ê°í ëª ì ëë ëšì ìë ìž¡ë©Ž ì€ íëì ëë€.
override
ì ìŽì ì ëª ë°±í©ëë€. Ʞ볞 ë©ìëê° ì¡Žì¬íì§ ììŒë©Ž 컎íìŒ ìê° ì€ë¥ê° ë°ìíì¬ ì¬ì ìí ìë륌 ëª ìí ì ìêž° ë묞ì ëë€. 몚ëê° ì í ìì€í ì íìí©ëë€. ì ì묎ë ìŽê²ì ìíì§ ìê² ìµëê¹?