ã¯ã©ã¹ããµãã¯ã©ã¹åããªãããã«æå®ããæ¹æ³ããããšäŸ¿å©ã ãšæã£ãŠããŸãããããããã°ãã³ã³ãã€ã©ãŒã¯ãå ã®ã¯ã©ã¹ãæ¡åŒµããå¥ã®ã¯ã©ã¹ãèŠã€ããå Žåã«ãã³ã³ãã€ã«æã«ãŠãŒã¶ãŒã«èŠåããŸãã
Javaã§ã¯ãfinalã§ããŒã¯ãããã¯ã©ã¹ãæ¡åŒµã§ããªããããTypeScriptã§åãããŒã¯ãŒãã䜿çšãããšã次ã®ããã«ãªããŸãã
final class foo {
constructor() {
}
}
class bar extends foo { // Error: foo is final and cannot be extended
constructor() {
super();
}
}
ãã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãæã€ã¯ã©ã¹ã¯æ¡åŒµã§ããŸããã 代ããã«ããã䜿çšããããšãæ€èšããŠãã ããã
ç§ãæãåºããããšãããã³ã³ãã€ã©ãŒã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã®privateããŒã¯ãŒããæ°ã«å ¥ããªãã£ããšç¢ºä¿¡ããŠããŸããã ãã¶ãç§ã¯è²Œãä»ãããŒãžã§ã³ã䜿çšããŠããŸãã
ããã¯æ°æ©èœã§ãããTS 2.0ã§ãªãªãŒã¹ãããŸããã typescript@next
ã䜿çšããŠè©Šãããšãã§ããŸãã 詳现ã«ã€ããŠã¯ã httpsïŒ//github.com/Microsoft/TypeScript/pull/6885ãåç
§ããŠãã ããã
ãããããé¡ãããŸã
ãã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã¯ã©ã¹ãã¯ã©ã¹ããã€ã³ã¹ã¿ã³ã¹åã§ããªãããã«ããŸãããïŒ ããã¯æçµã¯ã©ã¹ãžã®æ£ããçãã§ã¯ãããŸããã
JavaãCïŒã¯ã final
ã¯ã©ã¹ã䜿çšããŠãå®è¡æã«ã¯ã©ã¹ãæé©åããŸããããã¯ãã¯ã©ã¹ãç¹æ®åãããªãããšãèªèããŠããŸãã ãããæçµçãªãµããŒãã®äž»ãªäŸ¡å€ã§ãããšç§ã¯äž»åŒµããŸãã TypeScriptã§ã¯ãfinalã䜿çšããªãå Žåãããã³ãŒããå®è¡ããããããããã«æäŸã§ãããã®ã¯ãããŸããã
ã³ã¡ã³ãã䜿çšããŠãã¯ã©ã¹ã®æ£ãã䜿çšæ³ããŠãŒã¶ãŒã«éç¥ããããæçµçãªã¯ã©ã¹ãå
¬éããã代ããã«ã€ã³ã¿ãŒãã§ãŒã¹ãå
¬éããããšãæ€èšããŠãã ããã
ç§ã¯ããã«åæããŸããã代ããã«ç§ã¯duanyaoã«åæããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠæçµçãªã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åã§ããããã«ãããã®ã§ãPrivateã¯ãã®åé¡ã解決ããŸããã ãŸãããããããŠãŒã¶ãŒã«å
¬éããªããšãè¿œå ã®ãã¡ã¯ããªãäœæããå¿
èŠããããŸãã ç§ã«ãšã£ãŠãæçµãµããŒãã®äž»ãªäŸ¡å€ã¯ããŠãŒã¶ãŒããã¹ãç¯ããªãããã«ããããšã§ãã
ãã®ããã«äž»åŒµããïŒé¢æ°ã·ã°ããã£ã§åã䜿çšããå ŽåãTypeScriptã¯ã³ãŒãã®å®è¡ãé«éåããããã«äœãæäŸããŸããïŒ ãŠãŒã¶ãŒã®ãã¹ãé²ãããã ãã§ã¯ãããŸãããïŒ ãŠãŒã¶ãŒããã©ã¡ãŒã¿ãŒãšããŠæž¡ãå¿
èŠã®ããå€ã®ã¿ã€ãã説æããã³ã¡ã³ããæžãããšãã§ããŸãã ç§ã®æèŠã§ã¯ãtypescriptã®æ¬æ¥ã®æå³ãšè¡çªãããããfinalããŒã¯ãŒãã®ãããªæ¡åŒµæ©èœãæŒãã®ããããã®ã¯æ®å¿µã§ããã³ã³ãã€ã«ã¬ãã«ãè¿œå ããŠJavaScriptãããå®å
šã«ããã§ããã ãå€ãã®ãã§ãã¯ãå®è¡ããŠãå€ãã®ééããåé¿ããŸããå¯èœãªéãåãã£ãŠã ãããšããTypeScriptã®æå³ã誀解ããŸãããïŒ
ã¡ãœããã«ã¯final
修食åãå¿
èŠã§ãã
class Foo {
final fooIt():void{
}
}
class Bar {
fooIt():void {
}
}
// => Method fooIt of Bar cannot override fooIt of Foo, because it is final.
ããšãã°ãfooItããªãŒããŒã©ã€ããããã®ãç·æ¥ã«åé¿ãããå Žåã¯ã次ã®ãã¿ãŒã³ããã䜿çšããŸãã
import Whatever ...
abstract class Foo {
private ImportantVariable:boolean;
protected abstract fooIt_inner:Whatever();
public final fooIt():Whatever() {
//do somestate change to aprivate member here, which is very crucial for the functionality of every Foo:
ImportantVariable = true;
//call the abstract inner functionality:
return this.fooIt_inner();
}
}
ã³ã¹ã察å¹çšã«ã€ããŠã®è°è«ã¯ããªã䞻芳çãªãã®ã§ãã äž»ãªæžå¿µäºé ã¯ããã¹ãŠã®æ°æ©èœãæ§æããŸãã¯ããŒã¯ãŒããèšèªãšã³ã³ãã€ã©/ããŒã«ã®å®è£ ãè€éã«ããããšã§ãã èšèªèšèšäŒè°ã§ç§ãã¡ãããããšããŠããããšã¯ããã¬ãŒããªããç解ããä»å 䟡å€ãå°å ¥ãããè€éããéèŠããå Žåã«ã®ã¿ãæ°ããæ©èœãè¿œå ããããšã§ãã
ã³ãã¥ããã£ã®ã¡ã³ããŒããã£ãŒãããã¯ãè¿œå ãç¶ããããšãã§ããããã«ãåé¡ã¯ããã¯ãããŠããŸããã ååãªãã£ãŒãããã¯ãšèª¬åŸåã®ãããŠãŒã¹ã±ãŒã¹ãããã°ãåé¡ãåéã§ããŸãã
å®éãfinalã¯éåžžã«åçŽãªæŠå¿µã§ãããèšèªã«è€éããå ããããšã¯ãªããããè¿œå ããå¿ èŠããããŸãã å°ãªããšãã¡ãœããã«ã€ããŠã¯ã å€ãã®äººã倧ããªãããžã§ã¯ãã«åãçµãã§ãããšãã誰ããã¡ãœããããªãŒããŒã©ã€ãã§ããªãããã«ããããšã¯äŸ¡å€ããããŸããããã¯ãªãŒããŒã©ã€ããããã¹ãã§ã¯ãããŸããã
TypeScriptã§ã¯ãfinalã䜿çšããªãå Žåãããã³ãŒããå®è¡ããããããããã«æäŸã§ãããã®ã¯ãããŸããã
ãããŒãã¯ãªã³ãžïŒ éçåãã³ãŒãã®å®è¡ãæ¹åãããã®ã§ã¯ãããŸããããå®å šæ§ã¯è¯ãããšã§ãã
ã¯ã©ã¹ã®ã«ã¹ã¿ãã€ãºãå°ãå®å šã«ããããã«ç§ãèŠããæ©èœãšããŠãFinalïŒsealedïŒããªãŒããŒã©ã€ããããŠããŸãã ããã©ãŒãã³ã¹ã¯æ°ã«ããŸããã
éçåãã³ãŒãã®å®è¡ãæ¹åãããã®ã§ã¯ãããŸããããå®å šæ§ã¯è¯ãããšã§ãã
äžåºŠã private
ãä»ã®äººãã¡ãœãããåŒã³åºããªãããã«ããã®ãšåãããã«ã final
ã¯ä»ã®äººãã¡ãœããããªãŒããŒã©ã€ãããã®ãå¶éããŸãã
ã©ã¡ãããã¯ã©ã¹ã®å€çãšã®OOã€ã³ã¿ãŒãã§ãŒã¹ã®äžéšã§ãã
@pauldraperãš@mindarelusã«å®å šã«åæããŸãã ãããå®è£ ããŠãã ãããããã¯ç§ãçŸåšæ¬åœã«ãããéããŠããããšã¯éåžžã«çã«ããªã£ãŠããŸãã
finalã¯ããã©ãŒãã³ã¹ã ãã«åœ¹ç«ã€ãšã¯æããŸããããã¶ã€ã³ã«ã圹ç«ã€ãšæããŸãããTypeScriptã§ã¯ãŸã£ããæå³ããªããšæããŸãã ããã¯ã Object.freeze
ãšObject.seal
ã®å¯å€æ§ã®åœ±é¿ã远跡ããããšã§ãããã解決ããããšæããŸãã
@aluanhaddadããããã£ãšè©³ãã説æã§ããŸããïŒ ãªããTypeScriptã§ã¯ãŸã£ããæå³ããªãããšæããŸããïŒ
ãªããžã§ã¯ãã®ããªãŒãºãŸãã¯ã·ãŒã«ãšã¯ããªããžã§ã¯ããžã®æ°ããããããã£ã®è¿œå ãçŠæ¢ããããšãæå³ããŸããã掟çãªããžã§ã¯ããžã®ããããã£ã®è¿œå ã劚ããããšã¯ãããŸããããããã£ãŠãåºæ¬ã¯ã©ã¹ãã·ãŒã«ããå Žåã§ãããã®åºæ¬ã¯ã©ã¹ãæ¡åŒµããåã¯ã©ã¹ã®ã¡ãœããããªãŒããŒã©ã€ãã§ããŸãã ã ããã«ãå®è¡æã«åºæ¬ã¯ã©ã¹ã«ããããã£ãè¿œå ã§ããŸããã§ããã
Javaã®ã¯ã©ã¹ãŸãã¯ã¯ã©ã¹ã¡ãœããã§final
ã䜿çšãããšããèãã¯ãç§ã®æèŠã§ã¯ãã¹ã¬ããã»ãŒãã®ããã«ãªããžã§ã¯ãã®å¯å€æ§ãæå°éã«æããããšãšé¢ä¿ããããŸãã ïŒã¢ã€ãã 15. Joshua Blochãå¹æçãªJavaïŒ
JSã®ãã¹ãŠãå€æŽå¯èœã§ããããããããã®ããªã³ã·ãã«ãjavascriptã«åŒãç¶ããããã©ããã¯ããããŸããïŒééã£ãŠããå Žåã¯ä¿®æ£ããŠãã ããïŒã ããããTypescriptã¯Javascriptã§ã¯ãããŸãããã
ç§ã¯ãããå®è£ ãããããšãæ¬åœã«æãã§ããŸãã ããå ç¢ãªã³ãŒããäœæããã®ã«åœ¹ç«ã€ãšæããŸãã ããŠ...ãããJSã«ã©ã®ããã«å€æãããããæ£çŽãªãšãããããããããããå¿ èŠã¯ãããŸããã ã³ã³ãã€ã«æã®æ®ãã®ãã§ãã¯ãè¡ããããã§ã³ã¹ã®ã¿ã€ãã¹ã¯ãªããåŽã«ãšã©ãŸãããšãã§ããŸãã
確ãã«ç§ã¯ãããªãã§çããããšãã§ããŸãããããããã¯ã¿ã€ãã¹ã¯ãªãããäœã§ãããã®äžéšã§ãããïŒ èŠèœãšããééããå確èªããŸããïŒ
ç§ã«ãšã£ãŠã final
ã¯ãã¿ã€ãã¹ã¯ãªããã§private
ãŸãã¯ã¿ã€ãã³ã°ãšåã圹å²ãæãããŸããã€ãŸããã³ãŒãã³ã³ãã©ã¯ãã§ãã ãããã¯ãã³ãŒãã³ã³ãã©ã¯ããå£ããªãããã«ããããã«äœ¿çšã§ããŸãã ãšãŠã欲ããã§ãã
@ hk0iã¯ãããã«ãšã³ãŒãããŠããã®ãšåæ§ã®æ¹æ³ã§ãã¢ã€ãã 17ïŒç¬¬2çïŒã«ãèšèŒãããŠããŸãã
ããããéåžžã®å ·è±¡ã¯ã©ã¹ã¯ã©ãã§ããïŒ äŒçµ±çã«ããããã¯æçµçãªãã®ã§ãããµãã¯ã©ã¹åã®ããã«èšèšããã³ææžåããããã®ã§ããããŸãããããã®ç¶æ³ã¯å±éºã§ãã ãã®ãããªã¯ã©ã¹ã«å€æŽãå ãããããã³ã«ãã¯ã©ã¹ãæ¡åŒµããã¯ã©ã€ã¢ã³ãã¯ã©ã¹ãç Žæããå¯èœæ§ããããŸãã ããã¯åãªãçè«äžã®åé¡ã§ã¯ãããŸããã ç¶æ¿çšã«èšèšããã³ææžåãããŠããªãéæçµçãªå ·è±¡ã¯ã©ã¹ã®å éšãå€æŽããåŸããµãã¯ã©ã¹åé¢é£ã®ãã°ã¬ããŒããåãåãããšã¯çãããããŸããã
ãã®åé¡ã®æåã®è§£æ±ºçã¯ãå®å šã«ãµãã¯ã©ã¹åãããããã«èšèšããã³ææžåãããŠããªãã¯ã©ã¹ã§ã®ãµãã¯ã©ã¹åãçŠæ¢ããããšã§ãã ãµãã¯ã©ã¹åãçŠæ¢ããæ¹æ³ã¯2ã€ãããŸãã 2ã€ã®ãã¡ç°¡åãªã®ã¯ãã¯ã©ã¹ãfinalãšå®£èšããããšã§ãã å¥ã®æ¹æ³ã¯ããã¹ãŠã®ã³ã³ã¹ãã©ã¯ã¿ãŒããã©ã€ããŒããŸãã¯ããã±ãŒãžãã©ã€ããŒãã«ããã³ã³ã¹ãã©ã¯ã¿ãŒã®ä»£ããã«ãããªãã¯éçãã¡ã¯ããªãè¿œå ããããšã§ãã
æœè±¡ããŒã¯ãŒãããã§ã«ååšããããšãèãããšãèšèªã®èªç¥ã®è€éããå¢ãããšã¯ãªããšç§ã¯äž»åŒµããŸãã ããããç§ã¯ããã®å®è£ /ããã©ãŒãã³ã¹ãžã®åœ±é¿ã«ã€ããŠè©±ãããšã¯ã§ããããã®è§åºŠããèšèªãä¿è·ããããšã絶察ã«å°éããŸãã ãããã®æžå¿µãåé¢ããããšã¯ããã®æ©èœãå®è£ ãããã©ããã決å®ããäžã§æçã ãšæããŸãã
final
ã¯ãã¯ã©ã¹ãå°å°ããããã®åªããè¿œå ã«ãªããšæããŸãã ãŠãŒã¹ã±ãŒã¹ã®1ã€ã¯ãã¯ã©ã¹ã«å€æ°ã®ãããªãã¯ã¡ãœãããããããã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãããã®ãµãã»ããã®ã¿ãå
¬éããå Žåã§ãã å®éã®ã³ã³ã·ã¥ãŒããŒãã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠããããžã®ã¢ã¯ã»ã¹ãå¶éããŠããéãå®è£
ã«ã¯ããããã¹ãŠã®ãããªãã¯ã¡ãœããããããããå®è£
ããã°ããåäœãã¹ãã§ããŸãã å®è£
ãå°å°ã§ããããšã§ã誰ãå®è£
ãæ¡åŒµãããããããªãã¯ã¡ãœãããå€æŽãããããããšããªããªããŸãã
ãŸãã誰ãããªãã®ã¯ã©ã¹ãç¶æ¿ããŠããªãããšã確èªããããšãã§ããŸãã TypeScriptã¯ãããã®ã«ãŒã«ãé©çšããããã«ååšããå¿ èŠããããã³ã¡ã³ãã«é¢ããææ¡ã¯ããã®ãŠãŒã¹ã±ãŒã¹ã解決ããããã®æ æ°ãªã¢ãããŒãã®ããã§ãã ç§ãèªãã ãã1ã€ã®çãã¯ãç¹å®ã®ç¶æ³ã«ã®ã¿é©ããŠããããäžèšã§èª¬æãããã®ã«ã¯é©ããŠããªããã©ã€ããŒãã®äœ¿çšã«é¢ãããã®ã§ãã
ãã®ã¹ã¬ããã®å€ãã®äººã ã®ããã«ãç§ã¯ã¯ã©ã¹ãå°å°ã§ããããã«æ祚ããŸãã
@mhegazyãã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒãšsealed / finalã¯ã©ã¹ã¯ãã»ãã³ãã£ã¯ã¹ã倧ããç°ãªããŸãã ãã¡ããããã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒãå®çŸ©ããããšã§æ¡åŒµãé²ãããšã¯ã§ããŸãããã¯ã©ã¹ã®å€éšããã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãããšãã§ããŸãããã€ãŸããã€ã³ã¹ã¿ã³ã¹ãäœæã§ããããã«éçé¢æ°ãå®çŸ©ããå¿ èŠããããŸãã
å人çã«ã¯ãsealed / finalãšããŒã¯ãããã¯ã©ã¹ãšã¡ãœãããæ¡åŒµãŸãã¯ãªãŒããŒã©ã€ãã§ããªãããšã確èªããããã«ãsealed / finalã³ã³ãã€ã©ãã§ãã¯ãè¡ãããšããå§ãããŸãã
ç§ã®åé¡ã®ã³ã³ããã¹ãã§ã¯ããªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åã§ããããã«ãããªãã¯ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšã§ããããã«ãããã®ã§ãããã¯ã©ã¹ã®æ¡åŒµãé²ããsealed / finalã®è¿œå ã®ã¿ããããèš±å¯ããŸãã
ã¿ã¹ã¯ããããŸã-次ã®ãããªã³ãŒããèšè¿°ããŸã
ãããŠãããã§ã¯final
ããŒã¯ãŒããå¿
èŠã§ããç§èŠã
final
ã¯ãèªåèªèº«ãšãŠãŒã¶ãŒã«ããªãŒããŒã©ã€ãããå¿
èŠã®ããä¿è·ãããã¡ãœãããšããªãŒããŒã©ã€ãããŠã¯ãªããªãä¿è·ãããã¡ãœãããæãåºãããããã®åªããæ¹æ³ã ãšæããŸãã è£è¶³ãšããŠãç§ã¯ãŸããéšåçã«ã¯èªè
ãç¥ã£ãŠããããã«ããŸãã¡ãœããã®ååãã¿ã€ããã¹ãããšãã©ã³ã¹ãã€ã©ãŒãæå¥ãèšãããã«ãããªãããªãŒããŒã©ã€ãããŠããããšãæ瀺çã«è¿°ã¹ãããšãæ¯æããŠããŸãã
@zigszigsdkã¡ãœããããªãŒããŒã©ã€ããããããšã¯ãªãã®ã§ãããã¯ã©ã®ããã«æ©èœããŸããïŒ
final
ïŒ
this
ã³ã³ããã¹ãããã¹ãŒããŒã®ã¡ãœããïŒfinalãšå®£èšãããŠããïŒãé衚瀺ã«ãããšããã©ã³ã¹ãã€ã©ãŒãæå¥ãèšãããšãé€ããŠãçŸåšãšåãããã«æ©èœããŸãã
override
ïŒ
çŸåšãšåãããã«æ©èœããŸããããã©ã³ã¹ãã€ã©ãŒãã¡ãœããoverride
宣èšãããã®ã¹ãŒããŒã«ãã®ååã®ã¡ãœããããªãããã¡ãœããã¯ãããfinal
ãšå®£èšãããŠããå Žåã«æå¥ãèšãç¹ãç°ãªããŸãã
ã¹ãŒããŒã®ã¡ãœãããthis
ã³ã³ããã¹ãããé衚瀺ã«ããç¶æ
ã®ãªãŒããŒã©ã€ããè¡ããªãå Žåã¯ãèŠåã衚瀺ãããå¯èœæ§ããããŸãã
JavaãCïŒã¯ãæçµã¯ã©ã¹ã䜿çšããŠå®è¡æã«ã¯ã©ã¹ãæé©åããŸããããã¯ãã¯ã©ã¹ãç¹æ®åãããªãããšãèªèããŠããŸãã ãããæçµçãªãµããŒãã®äž»ãªäŸ¡å€ã§ãããšç§ã¯äž»åŒµããŸãã
@mhegazyããã§ã¯ãããŸããïŒ ãã1ã€ã®éèŠãªæ©èœã¯ãã¯ã©ã¹ã®ã©ã®éšåããªãŒããŒã©ã€ãããããšäºæ³ãããããæ瀺ããããšã§ãã
ããšãã°ããæå¹ãªJavaãã®é ç®17ãåç §ããŠãã ããïŒãç¶æ¿ã®ããã«èšèšããã³ææžåããããç¶æ¿ãçŠæ¢ãããïŒ
ç¶æ¿çšã«èšèšããã³ææžåãããŠããªãéæçµçãªå ·è±¡ã¯ã©ã¹ã®å éšãå€æŽããåŸããµãã¯ã©ã¹åé¢é£ã®ãã°ã¬ããŒããåãåãããšã¯çãããããŸããã ãã®åé¡ã®æåã®è§£æ±ºçã¯ãå®å šã«ãµãã¯ã©ã¹åãããããã«èšèšããã³ææžåãããŠããªãã¯ã©ã¹ã§ã®ãµãã¯ã©ã¹åãçŠæ¢ããããšã§ãã ãµãã¯ã©ã¹åãçŠæ¢ããæ¹æ³ã¯2ã€ãããŸãã 2ã€ã®ãã¡ç°¡åãªã®ã¯ãã¯ã©ã¹ãfinalãš
ç§ã®æèŠã§ã¯ãæçµçãªæ¹æ³ã«ã€ããŠãåãããšãèšããŸãã ããã¯ãã¯ã©ã¹ããã®ãããªãã¯ã¡ãœããã®ããããããªãŒããŒã©ã€ããµããŒãããããã«èšèšãããŠããããšã¯éåžžã«ãŸãã§ãã ããã«ã¯ãéåžžã«è€éãªèšèšãšèšå€§ãªéã®ãã¹ããå¿ èŠã«ãªããŸããããã¯ããªãŒããŒã©ã€ããããªãåäœãšãªãŒããŒã©ã€ããããåäœã®çµã¿åããããçããå¯èœæ§ã®ããç¶æ ã®ãã¹ãŠã®å¯èœãªçµã¿åãããèããå¿ èŠãããããã§ãã ãããã£ãŠã代ããã«ãããã°ã©ããŒã¯1ã€ãŸãã¯2ã€ãé€ããã¹ãŠã®ãããªãã¯ã¡ãœãããfinalãšå®£èšããå¯èœæ§ããããŸããããã«ããããã®ãããªçµã¿åããã®æ°ãå€§å¹ ã«æžå°ããŸãã ãããŠãå€ãã®å Žåã1ã€ãŸãã¯2ã€ã®ãªãŒããŒã©ã€ãå¯èœãªã¡ãœããããŸãã«å¿ èŠãªãã®ã§ãã
final
ã¯ã©ã¹ãšã¡ãœããã¯éåžžã«éèŠã ãšæããŸãã å®è£
ããŠããã ããã°å¹žãã§ãã
ãã1ã€ã®èª¬åŸåã®ãããŠãŒã¶ãŒã±ãŒã¹@mhegazy ã ä»æ¥ãç§ã¯ãã³ãã¬ãŒãã¡ãœãããã¿ãŒã³ãåŠã³ããŠã£ãããã£ã¢ã®ãã³ãã¬ãŒãã¡ãœãããã¿ãŒã³ãèšãããã«ããµãã¯ã©ã¹ããã³ãã¬ãŒãã¡ãœãããå€æŽããããšãçŠæ¢ããããã«final
ãå¿
èŠã§ããããšãããããŸããã ããããç§ã®çŽ æµãªTypeScriptã§ã¯ãããè¡ãããšã¯ã§ããŸããã ãæ°ã®æ¯ã«ïŒ
ãã³ãã¬ãŒããã¿ãŒã³ã䜿çšãããšããµãã¯ã©ã¹ã¯ãã¢ã«ãŽãªãºã ã®æ§é ãå€æŽããã«ãã¢ã«ãŽãªãºã ã®ç¹å®ã®ã¹ããããåå®çŸ©ã§ããŸãã
ç§ã«ãšã£ãŠã¯ãç¶æ¿ãããã±ãŒã¹ã§æ§æã匷å¶ããããšããã®ãšåããããç°¡åã§ãã ãã¡ã€ãã«ãªãã§ã¯ãããè¡ãããšã¯ã§ããŸããã
final
ãtypescriptã«æ¥ãããšãæãã§ããŸãããMicrosoftãéãããšããŠããæ ¹æ¬çãªã¡ãã»ãŒãžã¯ã final
ãå¿
èŠãªå Žåã¯ã次ã®ãããªèšèªã䜿çšããå¿
èŠããããšããããšã ãšæããŸããããããµããŒãããŸãã
ãã®åé¡ãåéãããå®è£ ãããããšãæãã§ããŸãã
å éšã§äœ¿çšããããïŒnpmãªã©ã§ïŒå ¬éã§å ±æãããããã©ã€ãã©ãªãæ§ç¯ããå Žåããã®ã©ã€ãã©ãªã䜿çšãããŠãŒã¶ãŒãã³ãŒããåç §ããã³ã¡ã³ããããã¥ã¡ã³ããæ€çŽ¢ããŠãã¯ã©ã¹ãã§ãããã©ããã確èªããå¿ èŠã¯ãããŸãããäžæžããããŸããã ããããäžæžããããšããšã©ãŒãã¹ããŒãããŸãã
ç§ã®ã³ãŒãã«ã¯ãæ¡åŒµãããã¯ã©ã¹ããããããçš®ã®ã€ãã³ããçºçãããšãã¡ãœãããããªã¬ãŒãããŸãã ãµãã¯ã©ã¹ãã¡ãœãããå®çŸ©ããŠããå Žåã¯ãã®ã¡ãœããã«ãªããããã§ãªãå Žåã¯ããã©ã«ãã®ã¡ãœããã«ãã©ãŒã«ããã¯ããŸãã ãã ããã¯ã©ã¹ã«ã¯ããã©ãŒã«ããã¯ãã¡ãœããã§ã¯ãªãä»ã®ã¡ãœããããããŸãããããã¯ãDOMã«ã¢ã€ãã ãè¿œå ãããªã©ã®ãã«ããŒã¡ãœããã§ããããã®å Žåããããã®ã¡ãœãããäžæžããããªãããã«ããŸãã
ãã®ãããã¯ã«é¢ããç§ã®5ã»ã³ãã¯ããããå床éããŠå®è£ ããå¿ èŠããããšããããšã§ãã
ç§ã¯ããã䜿çšããŠãã©ã€ãã©ãªã®ã¯ã©ã€ã¢ã³ãã«ç¬èªã®å ·è±¡ã¯ã©ã¹ãäœæãããæ¢åã®ä»ã®ã¯ã©ã¹ããæ¡åŒµããªãããã«ããŸãã @lucasyvasãèšã£ãããã«ãäœæ²ãæ¯æããŸãã ãŸãã¯ãæ°ããå ·è±¡ã¯ã©ã¹ã®å®è£ ã匷å¶ããŠãããšãã°è§åºŠã§äŸåæ§æ³šå ¥ãæäŸããŸãã
ã¯ã©ã¹ãšã¡ãœããã®äž¡æ¹ããµããŒãããŠãåéããããšã«ãæ祚ããŸã
typescriptã®ã³ã³ããã¹ãã§finalããŒã¯ãŒãã®ãã¿ãŒã³ãã©ã®ããã«æ©èœãããããããªãã ãã§ã¯ãããªããšèšã£ãŠããã®ã§ã¯ãããŸãããïŒ
æåŸã®ããŒã¯ãŒãã¯ããŠãŒã¶ãŒ/ããã°ã©ããŒãäžèšã®ã¯ã©ã¹/ã¡ãœããããªãŒããŒã©ã€ã/ç¶æ¿ããã®ãæ¢ããŸãããïŒ
Finalã䜿çšããç§ã®æ¹æ³ã¯ãããŒã¿ããããªãŒãºãããããšã§ããã€ãŸããããŒã¿ãå€æŽããããšã¯ã§ããªããªããŸãã ã€ãŸããããã䜿çšãããšäŸ¿å©ãªå ŽåããããŸãããåäœãããã°ãä¿®æ£ãŸãã¯å€æŽããã人ã«ãšã£ãŠã¯æ¬åœã«é¢åãªå ŽåããããŸãã
@niokasgami Freezeã¯[ããŒã¿]ã«é¢é£ããŠããŸãïŒhttps://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/freezeïŒ
ES6ã®äžéšãšããŠãã§ã«å©çšå¯èœã§ãã Finalã¯ã¯ã©ã¹ãšã¡ãœããã«é©çšãããŸãïŒå€æ°ã¯èªã¿åãå°çšã§ããå¯èœæ§ããããããã¹ãŒããŒå€æ°ããªãŒããŒã©ã€ãã§ããªãããããfinalããšããŠæ©èœããŸãïŒã
ãFinalãããŒã¯ãŒãã¯ã SealedãCïŒã§ããJAVAã§äœ¿çšãããŸãã
ã¿ã€ãã¹ã¯ãªããã¯CïŒã«åŒ·ã圱é¿ãåããŠããããããå°å°ãããããã®ãéžæãããå¯èœæ§ãé«ããªããŸãã ããŠãåºæ¬çã«å®è¡æã«ãªããžã§ã¯ããã·ãŒã«ããES6ã·ãŒã«ãšæ··åããå¯èœæ§ããããŸããïŒ
@XampleJavaã®ããŒã«ã«å€æ°ã§finalã䜿çšããããšãã§ãããšæããŸãã ç§ã¯Androidã¢ããªãæžããŠãããšãã«ãããããªããã°ãªããªãã£ãããšãèŠããŠããŸãã ã€ãã³ãã§ããå¿ èŠããã£ããšæããŸããã100ïŒ ç¢ºå®ã§ã¯ãããŸããã
function(){
let final myVariable = 'Awesome!'
document.addEventListener('scroll', e => {
console.log(myVariable)
myVariable = 'Not Awesome' // Throws an error
})
}
@TheColorRedãããšãJavaã®æåŸã®ããŒã«ã«å€æ°ã¯å®æ°ãæå³ããŸããã
@EternalPhaneããã ãšæããŸãããç§ã¯åžžã«const
ãã°ããŒãã«ã®ãããªã¹ã³ãŒãã§äœ¿çšããŠããŸãã...é¢æ°ãã¡ãœããå
ã§äœ¿çšããããšãèããããšã¯ãããŸãã...åã®ã³ã¡ã³ãã¯ç¡å¹ã ãšæããŸã...
@XampleãããCïŒããã®å°å°ã®ãã€ã³ãã¯åãããã«ã¯æ©èœããŠããŸããæ£çŽãªãšãããããŒã¯ãŒãå°å°ãšãã¡ã€ãã«ã®äž¡æ¹ãæ··ä¹±ããå¯èœæ§ãããããïŒå°å°ãªã©ã®ããã«å°å°ãããŠããïŒããã¡ã€ãã«ã¯å®éã«ã¯ã«ããŽãªã«å ¥ãããšãã§ããŸããã§ããã Javaã§ã¯å®æ°ãšããŠäœ¿çšããããããé©çšæ¹æ³ïŒ/
Javaã§ã¯ãä»»æã®å€æ°ãã¡ãœããããŸãã¯ã¯ã©ã¹ãfinal
ã§ããŸãã å€æ°ã®å Žåãåç
§ãåå²ãåœãŠã§ããªãããšãæå³ããŸãïŒéåç
§ã¿ã€ãã®å Žåãããã¯å€ãå€æŽã§ããªãããšãæå³ããŸãïŒã ã¯ã©ã¹ã®å Žåãæ¡åŒµæ©èœããªãããšãæå³ããŸãïŒ extends
...ããŒã¯ãŒãïŒã ã¡ãœããã®å Žåããµãã¯ã©ã¹ã§ãªãŒããŒã©ã€ãããªãããšãæå³ããŸãã
Javaã§final
ã䜿çšããäž»ãªçç±ïŒ
public static final String KEY = "someStringKeyPathHere"
ããã«ã©ãã«ã§ã衚瀺ãããåå©çšå¯èœãªå€ã¯ãééããæžããã®ã«åœ¹ç«ã¡ãŸãããåãå€ã«å¯ŸããŠè€æ°ã®æååãªããžã§ã¯ããåäœæããªããšããã³ã³ãã€ã«æã®å©ç¹ããããŸããç§ã¯ããã€ãã®ãŠãŒã¹ã±ãŒã¹ãçç¥ãããããããŸããããç§ã¯ãããéåžžã«äžè¬çã«ä¿ã¡ãããã€ãã®äŸãæããããšããŠããŸããã
@TheColorRed Androidã¯ãã³ãŒã«ããã¯ïŒå¿åã¯ã©ã¹ïŒã®å€éšã§å€æ°ã宣èšããå éšã§ãããåç §ãããšãã«ãããå¿ èŠãšããŸãã ããã¯ã¹ã¬ããã»ãŒãã®åé¡ãšãäžèŽãããšæããŸãã 圌ãã¯ããªããå¥ã®ã¹ã¬ããããå€æ°ãåå²ãåœãŠããã®ãé»æ¢ããããšããŠãããšæããŸãã
ãã®æçšæ§ã«ãããããããç§ã¯ãã®æ©èœãããã«æ¥ããšã¯æããªãã ä»ã®è§£æ±ºçãæ€èšããããç§ã®å Žåã®ããã«ãtypescriptããŸãšããŠåé€ããJSã®äžåã«å¯ŸåŠããã®ã«è¯ãææãããããŸããã Javascriptã«ã¯ããã®ã¿ã€ãã®ãã³ããªã©ããªãããšã§å€ãã®ãå©ç¹ãããããæçµçã«ã¯ã³ãŒããJSã«å€æãããŸãã ãã©ãŠã¶ã®äºææ§ãå¿ èŠãªå Žåã¯ãES6ãäœæããBabelã䜿çšããŠå€æã§ããŸãã
ãããã®å©ç¹ã®ããã€ããæéŠã«å©ãããšãã§ãããšããŠããjsã«å€æããããšãJava颚ã®final
ã®æ¬åœã®å©ç¹ã¯åŸãããªããšçŸå®çã«æããŸãã
@ hk0iç§ã¯ããªãã®æèŠãç解ã§ãããšæããŸãããå šäœçã«ç§ã¯ããªãã®æèŠã«ã€ããŠåæã«è³æããã¡ãã£ãšå察ããŸãã
ã¿ã€ãã¹ã¯ãªããã®ã³ãŒãã®ã»ãšãã©ã¯ãããã°ã©ããŒããã¯ãªãŒã³ããªã³ãŒããå®è¡ã§ããããã«ããããã®ãããã°/远跡ã®ç®çã§ãããšèšããŸãïŒããã«ã¿ã€ãã¹ã¯ãªããã®ã¹ãã²ããã£ã³ãŒããããããšãç¥ã£ãŠããã®ã§ãåŒçšããªãã§ãã ããïŒ
ã»ãšãã©ã®typescriptæ©èœã¯ãJSã«ååšããªããããJSã«å€æããŠãã»ãšãã©ã®å Žåãã©ã³ã¹ãã€ã«ãããŸããã
ã©ã³ã¿ã€ã /ã³ãŒããæžããšãã¯ãã³ãŒãã®ãšã©ãŒã確èªããJSãããç°¡åã«è¿œè·¡ããã®ã«åœ¹ç«ã¡ãŸãïŒãããŠHECK JSã¯ãã°ã远跡ããã®ãé£ããå ŽåããããŸãç¬ïŒ
ãããã£ãŠãfinalããŒã¯ãŒãã®äœ¿çšã¯ãAPIãŠãŒã¶ãŒãç¥ãããã®ãããã«ãŒãšããŠæ©èœããŠããå¯èœæ§ããããšæããŸããæ¡åŒµæ©èœã¯å¥åŠãªåäœãªã©ãåŒãèµ·ããå¯èœæ§ãããããããã®ã¯ã©ã¹ãæ¡åŒµããªãã§ãã ãã...
è¯ãèšèªãšããŠã®Typescriptã¯ã人ã ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããªãããã«ããããããã§ãã¢ã¯ã»ã¹ã§ãããçã®ãéçã¯ã©ã¹ããŒã¯ãŒããªã©ã®éèŠãªæ©èœãæ¬ ããŠããããšã«æ°ä»ãã®ã¯æ²ããããšã§ãã
@ hk0iã©ã¡ãã«ãåæããŸãã
ã©ã³ã¿ã€ã å¯å€æ§ãã§ãã¯ãè¿œå ããçŸåšã®ES6ãœãªã¥ãŒã·ã§ã³ã«äŸåãããšïŒObject.sealãŸãã¯Object.freezeã䜿çšãããªã©ïŒãã³ãŒããå ¥åãããšãã«çŽæ¥ãšã©ãŒãçºçãããšããå©ç¹ã倱ãããŸãïŒãã®ãã³ã¬ãŒã¿ã䜿çšãããšç°¡åã«å®è¡ã§ããŸããïŒã
@TheColorRedã¯ãâŠãããŠtypescriptã§ã¯ãããŒã«ã«å€æ°ãšã¯ã©ã¹å€æ°ãåºå¥ããŠããŸãã
readonly
const
ïŒãã®ä»ã®å€æ°ã®å Žåãããã®ã©ããã¡ãœãããŸãã¯ã¯ã©ã¹ã«å¯ŸããŠæ£ç¢ºã§ã¯ãããŸããã ã¡ãœããããªãŒããŒã©ã€ãããããšã¯ããããåå®çŸ©ããããšãæå³ããŸããïŒC ++ã®ä»®æ³ã¡ãœãããèããŠãã ããïŒãã¹ãŒããŒã¡ãœããïŒ super
ã䜿çšããŠåŒã³åºãããšãã§ããŸãïŒã®åã«ã¡ãœããããã©ã€ããªã§åŒã³åºãããããšãå®çŸ©ããã ãã§ãã
@niokasgamiããããã
TL; DRïŒ
seal
ã¯CïŒã§åºã䜿çšãããŠãããçããäºæ³ãããåäœã¯åãã§ããã¡ãªã¿ã«Object.preventExtensions()
ããããšèšãã®ãå¿ããŸãã
éãã¯ããã§ãŸã
èªã
æŽæ°ãšåé€
this.aMethod = ()=>{}
ãè¡ãããšã劚ãããã®ã¯äœããããŸããã ãã®ãããªãããã³ã°ãé²ãããã«ãã¡ãœãããreadonly
ã«ããå¿
èŠããããŸããïŒ delete this.aMethod
ã«ã€ããŠãåãäœæ
class
ã¯ã©ã¹ããªããžã§ã¯ãã®ã¡ã³ããŒãå®çŸ©ããŠãããããtypescriptã¯æé»çã«æ°ããããããã£ããã®å Žã§äœæããããšããã§ã«çŠæ¢ããŠããŸã...ããšãã°this.unKnownProperty = "something"
tsäºæ³ã©ãããã³ã³ãã€ã«æãšã©ãŒTS2339ãçºçããŸãã延é·
final
ãŸãã¯seal
ãé¢é£ããå Žæã§ãã åé¡ã¯ãES6ã®ããªãŒãºãã·ãŒã«ãããã³preventExtensions
ã§äžè²«æ§ãä¿ã€æ¹æ³ã§ãã ïŒå¿
èŠãªå ŽåïŒãfinal
ã¯ã©ã¹ã¯æŽæ°å¯èœã§ããïŒ æŽæ°å¯èœãªã¯ã©ã¹ãšã¯äœã§ããïŒ ç§ã®æšæž¬ã¯ã€ãšã¹ã§ãâŠããããæŽæ°ã¯ãã®ã¯ã©ã¹ãå®è£
ããããšã§ãïŒã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ãç解ããŸãïŒïŒ å¥ã®ã¯ã©ã¹ã®å®è£
ã¯åžžã«å¯èœã§ããã¯ãã§ãâŠããããããã¯æåã®ã¯ã©ã¹ã®æŽæ°ãšã¯é¢ä¿ãããŸããã ãããšâŠãã¶ã圌ãã¯cïŒãæžããŠããã®ãšåã質åã«æ¥ãŠã seal
ãè¯ãããŒã¯ãŒãã§ãããšæ±ºããŸããããªãŒããŒã©ã€ã
preventOverrides
ïŒ ãŸãã¯ãCïŒã§äœ¿çšãããŠããseal
ããŒãã¹ïŒã¡ãœããã®å°å°ã¯éåžžãå¿ é ã®ã¹ãŒããŒã³ãŒããäžæžãããããšãé²ãããã®ãã®ã§ãããããã¹ãŒããŒã¡ãœããïŒã³ã³ã¹ãã©ã¯ã¿ãŒãšåãåäœã§ãããã©ã®ã¡ãœããã§ãïŒåŒ·å¶ããããšãææ¡ããŸããã圹ã«ç«ã€ãšæããŸãã
誀解ããªãã§ãã ãããç§ã¯ããã«å察ããŠããŸããã ãšãŠãæ°ã«å ¥ã£ãŠããŸãã ç§ã¯ããªããããæ©èœã§ãã£ãŠã¯ãªããªãã®ããšãããã€ã¯ããœããã®é説çãªèãæ¹ãèŠãããšããŠããã ãã§ããã€ãŸããJavaScriptæ©èœã§ã¯ãªããããTypeScriptæ©èœã«ã¯ã§ããªããšããããšã§ãã
...ç§ãæ£ããç解ããŠããå Žåã
@ hk0iãžã§ããªãã¯ã¹ãèªã¿åãå°çšãããã³ãã®ä»ã®å€ãã®æ©èœã¯JavaScriptæ©èœã§ã¯ãããŸããããTypeScriptã«è¿œå ãããŠããããããããçç±ã§ã¯ãªããšæããŸã...
TypeScriptã¯ãåçŽã§ã¯ãªãæ¹æ³ã§ã³ãŒããçæããå¿ èŠãããæ©èœãé¿ããŸãã ãžã§ããªãã¯ã¹ãèªã¿åãå°çšãªã©ã¯çŽç²ã«ã³ã³ãã€ã«æã®æŠå¿µã§ãããåçŽã«æ¶å»ããŠçæãããåºåãçæã§ãããããå ¬æ£ãªã²ãŒã ã§ãã
final
ã¯ã³ã³ãã€ã«æã«ããæ¶å»ãã§ããã®ã«ããªãããããå
¬æ£ãªã²ãŒã ãã«ãªããªãã®ã§ããããã
ð€·ââïž
@TheColorRedããã¯å€ããå°ãªãããçµ±åããä»ã®åªå
é äœããããšæããŸãã
ãŸãã¯ããã®æ°ããããŒã¯ãŒããã³ã³ãã€ã«/ã³ãŒãã£ã³ã°æéã§ã©ã®çšåºŠäºæž¬å¯èœã§ããããããããŸããã ããªããããã«ã€ããŠèãããªãã°ãæçµçãªããŒã¯ãŒãã®ãã¶ã€ã³ã¯éåžžã«ææ§ã«ãªãå¯èœæ§ããããŸãã ãã¡ã€ãã«ã¯å€ãã®ç®çã«äœ¿çšã§ããŸãã Jsdocã®ããã¥ã¡ã³ããããããããã«ãã¿ã°ã@finalãã䜿çšããŠããã®å€æ°ãããªãŒãºãããŠããããèªã¿åãå°çšã§ããããšãjsdocã€ã³ã¿ãŒããªã¿ãŒã«éç¥ã§ããŸãã
ããã§ãã¶ã€ã³ã®è¡çªã å€æ°ããããªãŒãºãããŠèªã¿åãå°çšã«ããfinalã«ãããšãå€æ°ãšgetterã«èªã¿åãå°çšãé©çšã§ãããããèªã¿åãå°çšã«ããªããŸãã
ããã¯ãå€æ°ã«finalãŸãã¯readonlyã®ã©ã¡ãã®ã¿ã°ãä»ããå¿ èŠãããã®ãââããããªãããã°ã©ããŒã«æ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããŸãã
ãã®ããŒã¯ãŒããã¯ã©ã¹å®£èšãšã¡ãœãã宣èšå°çšã«äºçŽããªãéããåäœãŸãã¯finalã¯èªã¿åãå°çšãšè¡çªãããšæããŸãã
å°å°ïŒobject.sealãšè¡çªããå¯èœæ§ãããïŒãŸãã¯finalïŒãã®ç®çã®èšèšã¯èªã¿åãå°çšããŒã¯ãŒããšè¡çªããïŒã®ä»£ããã«ããããçŽæ¥çãªãæ¹æ³ã§ååãä»ããŠèšèšããããšãã§ãããšæããŸãã
ããã¯ãCïŒã®åäœãšäŒŒãŠããããåæã«ç°ãªãåäœã®ãã¢ã€ãã¢ãã«ãããªãããšã«æ³šæããŠãã ããã ç§ã¯CïŒãéåžžã©ã®ããã«ãªãŒããŒã©ã€ãäžå¯èœã§ãããããããã€ãã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåŸãŸããããããŠããªãã¯ãã®æ¹æ³ãä»®æ³ã§ãããšèšããªããã°ãªããŸããã
`åå空éã®äŸ{
export class myClass {
constructor(){}
// Make the func non ovveridable by inheritance.
public unoveridable myMethod(){
}
public myMethodB(){
}
}
export class MyClassB extends myClass {
// Nope not working will throw an error of an nonOverridable error
myMethod(){
super.myMethod();
}
// Nope will not work since unoverridable.
myMethod(){
}
// Design could be implemented differently since this could complicate ž
// the pattern of typescript
public forceoverride myMethod(){
// destroy previous pattern and ignore the parent method thus a true ovveride
}
// Yup will work since it's still "virtual".
myMethodB(){
super.myMethodB();
}
}
// Can extend an existing Parent class
// Declaring an unextendable class make all is component / func nonOverridable by
// inheritance. (A class component can still be overwritten by prototype usage.)
export unextendable class MyFinalClass extends Parent {
constructor()
// nonoverridable by default.
public MyMethod(){
}
}
// nope throw error that MyFinalClass is locked and cannot be extended
export class MyChildClass extends MyFinalClass{}
} `
ç·šéïŒèªã¿åãå°çšããã§ã«ååšãããããå€æ°ãå«ããã«ååŸããŸããã
@mhegazyãã®åé¡ãåéããããšãæ€èšããŠãã ããã ã³ãã¥ããã£ã®åå¿ã¯ãJavaïŒ final
ïŒãCïŒïŒ sealed
ã readonly
ïŒãPHPã®ãããªfinal
ããŒã¯ãŒããè¿œå ããåŽã§å§åçã«å€ãããã§ãã ïŒ final
ïŒãScalaïŒ final
ã sealed
ïŒãããã³C ++ïŒ final
ã virtual
ïŒããããŸãã ãã®æ©èœãæããªãéçã«åä»ããããOOPèšèªãèããããšã¯ã§ããŸããããŸããTSããããå¿
èŠãšããªãçç±ã«ã€ããŠèª¬åŸåã®ããè°è«ãèããããšããããŸããã
@ bcherny @ mhegazyç§ã¯äžèšã«å®å
šã«åæããŸãã TypeScriptã§èŠãããã»ãšãã©ã®ã·ã³ã¿ãã¯ã¹ã·ã¥ã¬ãŒã®ããã«ã final
ãåãªãã³ã³ãã€ã«æã®å¶çŽã«ãªãåŸãªããšããããè°è«ãããŠããçç±ã¯ããããŸãã-ããã«çŽé¢ããŸããããéçåä»ãããžã§ããªãã¯ã¹ãã¢ã¯ã»ã¹ä¿®é£Ÿåãåãšã€ãªã¢ã¹ãã€ã³ã¿ãŒãã§ã€ã¹... ALL SUGARïŒ TypeScriptããŒã ã¯ããããä»ã®æ¹åã«èšèªãåãå
¥ããããšã«éäžããããšæãã§ãããããçå£ã«ãããã¯OOP 101ã§ã...ããã¯TypeScriptããŸã éåžžã«è¥ãé ã ã£ãã¯ãã§ãïŒ
@mhegazyãã®åé¡ã«ã€ããŠããªããè¡ã£ãåæã®ã³ã¡ã³ãã
ãã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãæã€ã¯ã©ã¹ã¯æ¡åŒµã§ããŸããã 代ããã«ããã䜿çšããããšãæ€èšããŠãã ããã
ãããæžããŠããæç¹ã§ããã®ã³ã¡ã³ãã¯21åå察祚ãæããããŠããŸãã
æããã«ãããã¯ã³ãã¥ããã£ã解決çãšããŠæãã§ããããšã§ã¯ãã
ãããŒãããã«ã€ããŠããããã®ãã£ãŒãããã¯ãåŸãŸããã ãªãå®è£ ããããšã«èå³ããªãã®ãç解ã§ããŸãã
ããã§èµ·ãã£ãŠããæ¬åœã«éçç£çãªäžæºããããããããŸãã ãã 声ã®æ¬²æ±äžæºã«çŸããªãã§ãã ãã-ç§ãã¡ã¯ããã§æ±ºå®ãäžãããšãã§ããã³ãã¥ããã£ã¯åœŒãã®ãã£ãŒãããã¯ãäžããããšãã§ããŸããããã æ æ°ãªæ¯ãããã¯èª°ã®å¿ãå€ããããšã¯ãããŸããã å ·äœçãã€å®çšçã§ããããã«ããŠãã ããã æã ã¯ä»ããã®æ©èœãDOãšèšã£ãŠçŸããŠäººã ã«çŽåŸãããã€ããã¯ãããŸããã
ãã®åé¡ã¯æçµ/å°å°ãããã¯ã©ã¹ã«é¢ãããã®ã§ããããšã«æ³šæããŠãã ããã ãŸã£ããç°ãªãæŠå¿µã§ããæçµ/å°å°ãããæ¹æ³ã«ã€ããŠã®ãããã¯å€ã®è°è«ããããŸããã
ååã¬ãã¥ãŒããéã«ããã€ãã®ç¹ãèæ ®ãããŸãã
final
ãªããšã¯ã©ã¹ããŸã£ãã圹ã«ç«ããªããšæ¬åœã«æããå Žåãããã¯TC39å§å¡äŒã§åãäžãããães-discussã«æã¡èŸŒããã®ã§ãã final
ãå¿
é ã®æ©èœã§ããããšãTC39ã«çŽåŸãããããšããªãããŸãã¯çŽåŸãããããšãã§ããªãå Žåã¯ãTypeScriptã«è¿œå ããããšãæ€èšã§ããŸããnew
ãåŒã³åºãããšãåæ³ã§ããå Žåãããã¯ããããç¶æ¿ããããšãš1察1ã®ã©ã³ã¿ã€ã 察å¿ãæã£ãŠããŸãã new
'dã§ãããã super
' dã§ã¯ãªããã®ã®æŠå¿µã¯JavaScriptã«ã¯ååšããŸããããããã¹ãŠã«ç°è°ãå±ããããšã¯èªç±ã§ããã final
ã®æ¬ åŠãJavaScriptã¯ã©ã¹ãå¹æçã«äœ¿çšããèœåã«ã©ã®ããã«æªåœ±é¿ãåãŒããŠãããã«ã€ããŠãå®çšçã§å
·äœçãªãã£ãŒãããã¯ãæäŸããŠãã ããã
TSããããå¿ èŠãšããªãçç±ã«ã€ããŠã®èª¬åŸåã®ããè°è«ãèããããšããããŸãã
ããã¯ãããã©ã®ããã«æ©èœãããã§ã¯ãªãããšãæãåºããŠãã ããã ãã¹ãŠã®æ©èœã¯-100ããå§ãŸããŸãã ãã®æçš¿ãã
ãããã®è³ªåã®ããã€ãã§ã¯ã質åã¯ããªãç¹å®ã®æ©èœããåé€ããŸãã¯ãé€å€ãããã®ããå°ããŸãã ãã®èšãåãã¯ãæ¢åã®èšèªïŒããã§ã¯ãC ++ãšJavaãäžè¬çãªéžæè¢ã§ãïŒããå§ããŠã奜ããªãšãããŸã§æ©èœãåé€ãå§ããããšãæå³ããŸãã ãããŠãä¿¡ãããã人ããããããããŸããããããã¯èšèªãèšèšãããæ¹æ³ã§ã¯ãããŸããã
è€éãã®äºç®ã«ã¯éãããããŸãã ç§ãã¡ãè¡ããã¹ãŠã®ããšã¯ãç§ãã¡ãè¡ã次ã®ãã¹ãŠã®ããšã0.1ïŒ é ãããŸãã æ©èœããªã¯ãšã¹ããããšãä»ã®ãã¹ãŠã®æ©èœãå°ãé£ãããªããå°ãé ããªããå¯èœæ§ãå°ãäœããªãããã«èŠæ±ããŸãã Javaããããæã£ãŠããããCïŒããããæã£ãŠãããããããã»ãã®æ°è¡ã®ã³ãŒãã§ããããã³ãã³ãã©ã€ã³ã¹ã€ãããè¿œå ã§ãããããããã§ã¯äœãå ¥ããŸããã æ©èœã¯ãããèªäœãšå°æ¥ã®è² æ å šäœã«å¯ŸããŠæ¯æãå¿ èŠããããŸãã
@RyanCavanaugh決å®ã«åæãããã©ããã¯ããã ãããããšãããããŸãã èšèªãã¹ãªã ã«ä¿ã¡ãããšæããŸããä»ã®äººæ°ã®ããèšèªãæã£ãŠããæ©èœãæ¬åœã«äŸ¡å€ãããã®ãââããããšãåã«äžè¬çãªã®ããèããã®ã¯è¯ãããšã§ãã
@RyanCavanaugh
ããã§ã®ãã€ã³ãã¯ããã®ãã©ãŒã©ã ã§ã¯ãJavaScriptã¯ã©ã¹ãå¹æçã«äœ¿çšããããšããããšã§ã¯ãªããšæããŸãã
ç³ãèš³ãããŸããããç§ã¯æµæã§ããããããã§èµ·ãã£ãŠããéçç£çãªäžæºãã«è¿œå ããã ãã§ããæåŸã®ããŒã¯ãŒãã¯ã説æããããã¹ãŠã®çç±ã詳现ãããã³ä»ã®äººã®è°è«ã«åœ¹ç«ã¡ãŸãã
TypeScriptãOOPããŒã¯ãŒãã¹ãŒãã«ãªããªãããã«æåãå°œãããŠããŸãã JavaScriptã®ç¶æ¿ãããåªããæ§æã¡ã«ããºã ããããããããŸã...
final
ã䜿çšããŠãç¶æ¿ãããåæã匷å¶ããå Žåã®ããã«ïŒããã«typescriptèšèªåã§ã¯ãªãæ¿å
¥ããŠãã ããïŒð
ïŒç³ãèš³ãããŸããããæµæã§ããŸããã§ããïŒ
ãããããã£ãšéèŠãªããšã¯ãTSã¯ãããã€ãã®è¿œå ã®åãã§ãã¯ãè¿œå ããããšãé€ããŠããä»æ¥ã®JavaScriptnowããŸãã¯ãã®å¹æã®ããã®äœãïŒla BabelïŒãå°å ¥ããããã®äºææ§ã¬ã€ã€ãŒã«ãªãããšãäž»ã«æå³ããŠããããã§ãã
ãããå®è£ ããããã®åè«ã®èŠç¹ã¯ãå¥ã®èšèªã®æ©èœãå¿ èŠãªå Žåã¯ã代ããã«ä»ã®èšèªã䜿çšããããšã ãšæããŸãã JavaScriptãå¿ èŠãªå Žåã¯ãJavaScriptã䜿çšããŠãã ããã TypeScriptãå¿ èŠãªå Žåã¯ãããã䜿çšããŠãã ããã
Kotlinã¯JSã«ã³ã³ãã€ã«ã§ããããã®äººã ã楜ããããšæãæ©èœãããããããã®ã§ã調ã¹ãã®ã«åœ¹ç«ã€ãããããŸããã ç§ã¯ãããäŸåé¢ä¿ãšããŠããã€ãã®JSã©ã€ãã©ãªãè¿œå ãããšæããŸãïŒç§ã¯ãããèªåã§è©ŠããŠããŸããïŒã
äž»ãªãã€ã³ãã¯ãTypeScriptã«æºè¶³ã§ããªãå Žåã¯ã䜿çšããªãããšã§ãã
@RyanCavanaugh
ããªããäžã§æèµ·ããç¹ã«ã€ããŠ...
ã¯ã©ã¹ã¯JAVASCRIPTæ©èœã§ãããTYPESCRIPTæ©èœã§ã¯ãããŸããã
final
ãªããšã¯ã©ã¹ããŸã£ãã圹ã«ç«ããªããšæ¬åœã«æããå Žåãããã¯TC39å§å¡äŒã§åãäžãããães-discussã«æã¡èŸŒããã®ã§ããfinal
ãå¿ é ã®æ©èœã§ããããšãTC39ã«çŽåŸãããããšããªãããŸãã¯çŽåŸãããããšãã§ããªãå Žåã¯ãTypeScriptã«è¿œå ããããšãæ€èšã§ããŸãã
ç§ã¯0.7ããTypeScriptããã©ããŒããŠããŠãåœæã¯IIRCãES3-ES5ãã¿ãŒã²ããã«ããŠããŸããã åœæãã¯ã©ã¹ã¯ééããªãTypeScriptã®æ©èœã§ããã åãè°è«ããã³ã¬ãŒã¿ã«ãåœãŠã¯ãŸããŸã-ãããã¯ESã®ã«ãŒãã«ãããŸãããå®éšçãªæ©èœãšããŠãã§ã«TypeScriptã«ãããŸãã
ã³ãã¥ããã£ãšããŠãTypeScriptã³ã³ãã€ã©ãfinal
ã®JavaScriptã¯ã©ã¹ãäœããã®åœ¢ã§çºè¡ããå¿
èŠããããšäž»åŒµããŠããããã§ã¯ãããŸããã ã¢ã¯ã»ã¹ä¿®é£Ÿåã®ã³ã³ãã€ã«æãã§ãã¯ã§ååã§ããã®ãšåãããã«ãã³ã³ãã€ã«æãã§ãã¯ã§ååã§ãã çµå±ã®ãšãããããããJavaScriptã®æ©èœã§ã¯ãããŸããããTypeScriptã¯ããã§ãå¯èœã«ããŸãã
final
ãESæ©èœã«ãªã£ãå ŽåãããããES *ãã¿ãŒã²ããã«ãããšãã«ãšããã¿ãŒã®ãã®ãããããªãã¡ã¯ã¿ãªã³ã°ããŠã final
é©åã«åºåããããšãã§ããŸãïŒã¯ã©ã¹ãå°å
¥ããããšããšåãããã«ïŒ ES6ã§ïŒïŒ
äœãã«å¯ŸããŠ
new
ãåŒã³åºãããšãåæ³ã§ããå Žåãããã¯ããããç¶æ¿ããããšãš1察1ã®ã©ã³ã¿ã€ã 察å¿ãæã£ãŠããŸããnew
'dã§ããããsuper
' dã§ã¯ãªããã®ã®æŠå¿µã¯JavaScriptã«ã¯ååšããŸãã
ç¹°ãè¿ãã«ãªããŸãããã³ãã¥ããã£ã¯ãå®è¡æã«final
ã匷å¶ããããã«ãããã§äœããéæ³ã®ããã«ããããšãæåŸ
ããŠãããšã¯æããŸããã ããªããæ£ç¢ºã«è¿°ã¹ãããã«ãããã¯ãJavaScriptã«ã¯ååšããŸãããããåè¿°ã®ããã«ãã³ã³ãã€ã«æã®å¶çŽã§ååã§ãã
TypeScriptãOOPããŒã¯ãŒãã¹ãŒãã«ãªããªãããã«æåãå°œãããŠããŸãã JavaScriptã®ç¶æ¿ãããåªããæ§æã¡ã«ããºã ãå€æ°ãããCïŒãšJavaãæã€ãã¹ãŠã®ããŒã¯ãŒããçšæããå¿ èŠã¯
ããã¯ããœãããŠã§ã¢éçºã³ãã¥ããã£å
šäœã§ããªãããç¥ãããŠãããã¬ãŒãºã§ãããç¶æ¿ãããæ§æãåªå
ãããã§ããããåªå
ãã¯ãç¶æ¿ãå
æ¬çãªã¹ããŒãã¡ã³ããšããŠã¯ãããŸããã 確ãã«ãCïŒãšJavaãæã€ãã¹ãŠã®ããŒã¯ãŒããå¿
èŠãšããããã§ã¯ãããŸãããã abstract
ã¯ã©ã¹ïŒã¡ãªã¿ã«ãJavaScriptã«ã¯ååšããªããïŒãèš±å¯ããçç±ããã£ãã«éããããŸããã final
ã¯ã©ã¹ïŒ
ã©ã³ã¿ã€ã ãã§ãã¯ãç°¡åã«èšè¿°ããŠããæçµçãªãã¯ã©ã¹ããã®ç¶æ¿ãæ€åºã§ããŸããããã¯ããã¹ãŠã®ã³ã³ã·ã¥ãŒããŒãTypeScriptã䜿çšããŠãããšã¯éããªãããã誰ãã誀ã£ãŠã¯ã©ã¹ããç¶æ¿ããããšããå¿é ãããŠããå Žåã¯ããšã«ããå®è¡ããå¿ èŠããããŸãã ã
CïŒãšJavaã«ã€ããŠãåãããšãèšããŸãããã³ã³ãã€ã©ã¬ãã«ã§å®è¡ããããã®sealed
ãšfinal
ããããããã©ã³ã¿ã€ã ãã§ãã¯ã¯å¿
èŠãããŸããã
ãã¹ãŠã®ã³ã³ã·ã¥ãŒããŒãTypeScriptã䜿çšããŠããããã§ã¯ãªãå Žåã final
ã¯ã©ã¹ããç¶æ¿ããã ãã§ãªãããã£ãšå¿é
ããå¿
èŠããããŸãã ããšãã°ã private
ãŸãã¯protected
ã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ãéçåãã§ãã¯ãªãããŸãã¯abstract
ã¯ã©ã¹ãæ§ç¯ããæ©èœãªã©ã§ãã
TypeScript以å€ã®ã³ã³ã·ã¥ãŒããŒãå¯èœãªéãå®å šã§ããããšã確èªããããã«ãã³ãŒãã«ããããã¹ãŠã®ã©ã³ã¿ã€ã ãã§ãã¯ãå®éã«æ£ãããå¿ èŠããããŸããïŒè¿œå ããããšããã§ããªããã®ããããŸãïŒã
lintã«ãŒã«ãèšè¿°ããŠãç¹å®ã®ã¯ã©ã¹ãç¶æ¿ãããªãã¹ã¿ã€ã«ã®èŠåãé©çšã§ããŸãã
ããã¯ãã³ãŒããæ¶è²»ããŠãã人ããªã³ã¿ãŒãå®è¡ããŠããããšãæå³ãããããããã§ãå®éã«ã¯é©åãªè§£æ±ºçã§ã¯ãããŸããã ããã¯åé¿çã§ãã
誰ããããªãã®å°å°ãããã¹ãã¯ã©ã¹ãããå¶ç¶ã«ãç¶æ¿ãããšããã·ããªãªã¯ãäžçš®ã®å¥åŠãªãã®ã§ãã ãŸããç¹å®ã®ã¯ã©ã¹ããç¶æ¿ããããšããå¯èœãã§ãããã©ããã«ã€ããŠã®èª°ãã®åå¥ã®è©äŸ¡ã¯ãããããããªãçããããšæããŸãã
åªãã/åªããéçºè ã¯ãã¯ã©ã¹ã®æ¡åŒµãªã©ãäœããè¡ãçç±ã«ã€ããŠèããŸãã ãããããå°ãªããšãçç±ãæ¬åœã«ç解ããã«ãããããããã¯æ©èœããããšãã粟ç¥ã«ãªã£ãŠããŸããŸãã
canã§å§ãŸã質åãããshouldã§å§ãŸã質åãããæ確ãªçããåŸãåŸåããããŸãã
ã¯ã©ã¹ãå°å°ããçç±ã¯åºæ¬çã«3ã€ãããŸããã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãæå³ã§ãã ãããã®ãã¡ã®2ã€ã¯ãTypeScriptã§ã¯æå³ããªããããä»ã®ã©ã³ã¿ã€ã ã§å®è¡ãããžã§ãã®3åã®1ããå®è¡ããªããã®ã®è€éããšã²ã€ã³ãèæ ®ããå¿ èŠããããŸãã
TypeScriptã¯ãã»ãã¥ãªãã£ãšã€ã³ãã³ãã®2ã€ã®çç±ãå®éã«æºãããšæããŸããããããçŽç²ã«ã³ã³ãã€ã«æã®ãã§ãã¯ãšããŠå®è£ ãããå Žåãæ£ããææãããŠããããã«ãã³ã³ãã€ã©ã¬ãã«ã§ããå®è¡ã§ã
final
ããªãããšããJavaScriptã¯ã©ã¹ãå¹æçã«äœ¿çšããèœåãæãªãããšã¯ãªããšæããŸãããŸããJavaScriptã¯ã©ã¹ããªããšäœ¿çšã§ããªããªãããšããããŸããã final
ã¯ããå¿
èŠãªãæ©èœãšããããããæã£ãŠãããšäŸ¿å©ããªæ©èœã®æ¹ãå€ããšæããŸãããTypeScriptã®å€ãã®æ©èœã«ã€ããŠãåãããšãèšããŸãã
ããã§ã®äž»ãªäžæºã¯ãTypeScriptã§ã¯abstract
ã¯ã©ã¹ãš_open_ã¯ã©ã¹ãäœæã§ããããšã§ãããç¶æ¿ãšããªã¢ãŒãã£ãºã ã®èŠ³ç¹ããã¯ããšã¬ã¬ã³ãã§è¡šçŸåè±ããªæ¹æ³ã§å
šäœåãæãããšã¯ã§ããŸããã
ã³ã³ã¹ãã©ã¯ã¿ãŒãé衚瀺ã«ããããšã¯ãã³ãã¥ããã£ãæãã§ããããšã§ã¯ãããŸãããããã¯ãã¯ã©ã¹ã®å®è£ ããã»ãã³ãã£ãã¯ã§è¡šçŸåã®ããå€ã奪ãããã§ãããŸããã¢ã¯ã»ã¹ä¿®é£Ÿåã¯ãå¿ èŠãªãã®ãã§ãããããå®è¡æã«åŒ·å¶ããããšãã§ããŸããã åºæ¬çã«ãJavaScriptã«ã¯ååšããªããç¶æ³ã§ãã
éçºè ãšããŠãç§ã«ã¯å€ãã®åžœåããããŸãã çŸåšãCïŒããããKotlinããããTypeScriptãããããããŸãã
final
ã«ã€ããŠå¿é
ããå¿
èŠã¯ãããŸãããsealed
ãç§ã¯ããããç§ããã¹ãå°ãããããå°ããããã«ç§ã®æ¶è²»è
ãããããšãã§ããŸã匷å¶çã«ãç¿æ
£ã®åé¡ãšããŠã å€ãã®å ŽåãCïŒã¯ã©ã¹ã¯å®éã«ã¯sealed
ã§ããå¿
èŠããããèŠéããããã¡ã§ããèå³æ·±ãããšã«ãTypeScriptããŒã ãããŒãã«ã®åšãã«åº§ã£ãŠabstract
ã¯ã©ã¹ã«ã€ããŠè©±ãåã£ããšãã誰ããæãæããŠãã§ãfinal
ã©ãã§ããïŒããšèšããŸãããïŒ
@RyanCavanaughããŒãç§ã¯ããªãã®ãã€ã³ããç解ããŠããŸã
ã»ãšãã©ã®å Žåãããã¯èª€è§£ã ã£ããšæããŸãïŒç§ãã¡ã説æããæ¹æ³ããæšæž¬ããŸãïŒ
@ series0neã®èŠçŽã¯ãJSã§æçµã¯ã©ã¹ãäœæããããã«èŠæ±ããããšã§ãã¿ã€ãã¹ã¯ãªããã®åºåãããã»ã©è€éã«ããããšã§ã¯ãªãïŒããã¯ãããããããã®åè»ã®å€§ç Žã«ãªãã§ãããïŒã人ã ã«äŒããããã®è¿œå ã®ã«ãŒã«ãäœæããããšã§ããã tãããããŸãã ãããŠãAPIã®ãŠãŒã¶ãŒã«ãåºåã§ã¯ãªããtypescriptãã¡ã€ã«/ã³ã³ãã€ã©ãŒã®ãã¹ãŠã§ãããã®ã¯ã©ã¹ãïŒå®å®æ§ãã»ãã¥ãªãã£äžã®çç±ãªã©ã§ïŒæ··ä¹±ãããŠã¯ãªããªãããšãäŒããŸãã
ãã®æ©èœããããšãããšæããŸããïŒã¯ããããã€ãã®ãã¯ããã¯ãå®è¡ããããã®ããé«éãªæ¹æ³ããããšããã§ãã
ããã¯æ¬åœã«å¿ èŠã§ããïŒ å®éã«ã¯ãããã¯æãããã®ãããã€ããŒãªãã®ã§ããå¯èœæ§ããããTypescriptããŒã ããã®è¿œå ãå®è£ ããäœè£ãããå Žåã¯ãåªå ãã¹ãã§ã¯ãããŸããã
æçµ/å°å°ãããããŒã¯ãŒãã¯ãç¹ã«ãã°ä¿®æ£ãããããåäœã®å€æŽãªã©ãå€ãã®åŽé¢ãè€éã«ããå¯èœæ§ãããããšã¯ããããŸãã
ããã説æãããšããã¹ãŠã®ã¯ã©ã¹ãæ¡åŒµãããªãããã«ããã¯ããããšã§ãfinalã®ä¹±çšãå®å šã«èŠãããŸãã 察åŠãã¹ãa **ã®å€§ããªèŠçãIMOã«åŒãèµ·ãããŸãã ãã»ãã¥ãªãã£ãã®ããã«åå·çã ã£ããããç¶æ¿ã«ãã£ãŠãŠãŒã¶ãŒã¯ã©ã¹ã«å€æŽãå ããããã«ããã¯ãããŠããAPIã䜿çšããããããŸããã
ããã¯ãèªåã®ããŒãºã«åãããŠãã®ã¯ã©ã¹ã®åäœãå€æŽã§ããããã«ããããã«ããããã¿ã€ãã䜿çšããŠããããã®ã¯ã©ã¹ããšã€ãªã¢ã¹ãŸãã¯ãªãŒããŒã©ã€ãããå¿
èŠãããããšãæå³ããŸãã
ããã¯ãç¹ã«ãåè¿°ã®ã¯ã©ã¹ã«æ©èœãè¿œå ãããã ãã§ãç Žå£çãªã¯ãŒã¯ãããŒãå®è¡ããããªãå Žåã¯é¢åã§ãã
ãã®åŸãç§ã¯ä»ã®ç¶æ³ã誀解ããŠãããããããŸããããç§ã«ãããèªç±ã«èª¬æããŠãã ãã:)
ãããç§ãES4ã«ã€ããŠããããèªãã§ããããšãæãåºããšïŒãã©ãããå¶äœäžã ã£ããšããç§ã¯ãŸã åäŸã ã£ããšã¯æããŸãããïŒãé©ãã¹ãããšã«ãTypescriptã«éåžžã«ãã䌌ãŠããŸãã
ãããŠããã¯ããã®ãã©ããä»æ§ã§èšãïŒ
https://www.ecma-international.org/activities/Languages/Language%20overview.pdf
A class that does not explicitly extend any other class is said to extend the class Object. As a
consequence, all the classes that exist form an inheritance hierarchy that is a tree, the root of which is
Object.
A class designated as final cannot be extended, and final methods cannot be overridden:
class C {
final function f(n) { return n*2 }
}
final class D extends C {
function g() { return 37 }
}
ãã®ãããæè¡çã«ã¯ãæçµçãªããŒã¯ãŒããEcmascript第4çã§èšç»ãããŸããã JSã®å°æ¥ã®çµ±åã§ããã衚瀺ããããã©ããã¯çåã§ãããå®éã«ã¯ã©ã¹ãçµ±åãããŠãããããããã¯å¯èœãããããŸãããã誰ãç¥ã£ãŠããŸããïŒ
ç§ã¯ããã®åé¡ãèŠã€ããããã«ç§ãé§ãç«ãŠããã»ãšãã©ééããªãã£ã1ã€ã®ãŠãŒã¹ã±ãŒã¹ããããŸãã ããã¯ããªã¿ãŒã³ã¿ã€ããšããŠã®this
ã®äœ¿çšãäžå¿ã«å±éããŸãã
abstract class TileEntity {
//constructor, other methods...
abstract cloneAt(x: number, y: number): this;
}
ãããæžããç§ã®æå³ã¯ãTileEntitiesãäžå€ã§ããïŒãããã£ãŠãå®å
šã«æž¡ãããšãã§ããïŒããšãä¿èšŒããããšã§ããããç¹å®ã®TileEntityã¯ãããã€ãã®å€æŽãããããããã£ïŒãã®å Žåã¯x
ãšy
ïŒã§è€è£œã§ããŸãã ïŒãµãã¯ã©ã¹ã®åœ¢ç¶ã«ã€ããŠäœãç¥ãå¿
èŠã¯ãããŸããã ãããç§ãæžãããããšã§ãããå®è£
ãïŒæ£ããïŒæžã蟌ãããšãããšããããå£ããŸãã
class TurretTileEntity extends TileEntity {
//constructor, other methods...
cloneAt(x: number, y: number): this {
return new TurretTileEntity(x, y, /* ... other properties */);
}
}
åé¡ã¯ãTurretTileEntityã®ãµãã¯ã©ã¹ãååšããªãããšã宣èšã§ããªããã°ã this
æ»ãåãTurretTileEntityåã ãã«çµã蟌ãããšãã§ããªãããšã§ãã
æ»ãå€ã<any>
ãã£ã¹ãã§ããããšãèãããšãTypescriptã®ãã®æ¬ ç¹ã®åœ±é¿ã¯æå°éã§ãã ããã¯ã客芳çã«ã¯ã¢ã³ããã¿ãŒã³ã§ãããåã·ã¹ãã ãããè¡šçŸåè±ãã§ããå¯èœæ§ãããããšã瀺ãæçšãªææšã§ãã æçµ/å°å°ãããã¯ã©ã¹ããµããŒãããå¿
èŠããããŸãã
èå³æ·±ãããšã«ãTypeScriptããŒã ãããŒãã«ã®åšãã«åº§ã£ãŠæœè±¡ã¯ã©ã¹ã«ã€ããŠè©±ãåã£ããšãã誰ããæãæããŠãããããfinalã¯ã©ãã§ããããšèšããŸãããïŒ
ã¯ãã ããŒã¯ãŒããè¿œå ãããã³ã«ãããããããã®ä»ã®ããŒã¯ãŒããè¿œå ããå¿
èŠããããŸãïŒã èšèªãã§ããã ã泚ææ·±ãæé·ããããã®ã§ããããè¿œå ããããšã«å¯Ÿããé·æã§ãã ã¯ã©ã¹å®£èšã®final
ããã®ãã£ã³ãã«ãããŸã- final
ã¯ã©ã¹ãããå Žåã¯ã final
ã¡ãœãããŸãã¯ããããã£ããå¿
èŠãã«ãªããŸãã ã¹ã³ãŒãã¯ãªãŒãã®ããã«èŠãããã®ã¯ãã¹ãŠãéåžžã«çããããšèŠãªãããŸãã
æçµçãªã¯ã©ã¹ãšã¡ãœããã¯éåžžã«éèŠã ãšæããŸãã å®è£ ããŠããã ããã°å¹žãã§ãã
ãã®åé¡ã¯æçµ/å°å°ãããã¯ã©ã¹ã«é¢ãããã®ã§ããããšã«æ³šæããŠãã ããã ãŸã£ããç°ãªãæŠå¿µã§ããæçµ/å°å°ãããæ¹æ³ã«ã€ããŠã®ãããã¯å€ã®è°è«ããããŸããã
mhegazyã¯ããã®åé¡ãæ¯æããŠhttps://github.com/Microsoft/TypeScript/issues/9264ãéããŸããã æçµ/å°å°ãããæ¹æ³ã远跡ããããã®éè€ãšããŠã¯ããŒãºãããŠããªãå¥ã®åé¡ã¯ãããŸããïŒ
@crclaäžèšã®@RyanCavanaughã®ã³ã¡ã³ãã®ããã€ããèªãã ããšãããä»ã®åé¡ãéããçç±ã¯ãfinal / sealedã¯ã©ã¹ã®ãµããŒãã«ã¯final / sealedã¡ãœããã®ãµããŒããå«ãŸããããã ãšæããŸãã ãã®2ã€ã¯ãéåžžã«å¯æ¥ã«é¢é£ãããããã¯ã§ãã
ç§ã¯ã®ããã®ææ¡ãä¿¡ããããšãã§ããªãfinal
ãšããŠã©ãã«ä»ããããWon't fix
ã
ã©ãã«ãIn Discussion
æ»ããå®è£
ããŠãã ããã
ç§ã®å Žåããã©ã°ã€ã³ã®æœè±¡åºæ¬ã¯ã©ã¹ãäœæãããã©ã°ã€ã³ã¯ã©ã¹ã誀ã£ãŠåºæ¬ã¯ã©ã¹ã®ã¡ãœãããäžæžãã§ããªãããã«ãããã§ãã private constructor
ã Object.seal
ã©ãããã®ä»äºãããããšãã§ããŸããã
ãããéèŠãªã©ã€ããªã¢ãã€æ©èœãšèŠãªããŠãã人ã«ãšã£ãŠã¯ãå®éã«ã¯ããã§ã¯ãããŸããã APIããã³ã³ã·ã¥ãŒããŒã«ãã£ãŠæ¡åŒµãããå¿ èŠãããã¯ã©ã¹å®è£ ãå ¬éããããšã§æ§æãããŠããå Žåããããè¡ãããã®ããè¯ãæ¹æ³ããããŸãã Reactã®æªãäŸã«åŸããªãã§ãã ããã é¢æ°ãšåçŽãªãªããžã§ã¯ãã䜿çšãããã®OOããããå±ããå Žæã«ãã³ã»ã³ã¹ã®ãŸãŸã«ããŸãïŒéå»ã
ä»ããå察祚ãæã£ãŠããŠãã ããð
ãã®è°è«ãæçµã¯ã©ã¹ãšæçµã¡ãœãããã©ã®ããã«åºå¥ããªããã誰ããç§ã«èª¬æã§ããŸããïŒ ãã¡ãããäžéšã®ã¡ãœããããªãŒããŒã©ã€ããããªãããã«ããããšã¯ãéåžžã«å€§ããªäŸ¡å€ããããããŸãã ãã©ã°ã€ã³éçºè ããã¬ãŒã ã¯ãŒã¯ã¯ã©ã¹ã®äžéšããµãã¯ã©ã¹åããæœè±¡é¢æ°ãå®è£ ããããšã§æ©èœãè¿œå ã§ããããã«ãããã®ã§ãããåæã«ããããã®æœè±¡é¢æ°ãåŒã³åºãã¡ãœãããïŒãããŠãªãïŒïŒãªãŒããŒã©ã€ãããªãããã«ããŠãã ããããšã©ãŒåŠç/ãã°ã€ã³/ãã§ãã¯ãè¡ãããŠããããšã確èªããŠãã ããã
@pelotom OOPæ§é ãšãã¿ãŒã³ã䜿çšããããªãå Žåã¯ã䜿çšããªãã§ãã ãããä»ã®æ¹æ³ã䜿çšããããã«æ瀺ãããããšã¯ãããŸããããå察æ¹åã«ãåãããšãåœãŠã¯ãŸããŸãã誰ããOOPæ§é ã䜿çšãããå Žåã¯ããã®ãŸãŸã«ããŸãã
ä»ã®äººã«ç¹å®ã®ïŒéOOPïŒãã¿ãŒã³ãæ¡çšããããã«åŒ·å¶ããããšã§ãOOPãéé£ããã®ãšåãåäœãæ¡çšããããšã«ãªããŸãã å°ãªããšãäžè²«æ§ããã:)
TypeScriptã«final
ããŒã¯ãŒããè¿œå ããããšã¯ãé倧ãªå€æŽã§ã¯ãªããæ¢åã®ãããžã§ã¯ãã«åœ±é¿ãäžããããšã¯ãããŸãããã @ thorek ãç§ãããã³ä»ã®å€ãã®äººã
ã«ãšã£ãŠéèŠãªæ©èœã«ãªããŸãã
誰ããOOPæ§é ã䜿çšãããå Žåã¯ããã®ãŸãŸã«ããŠãã ããã
ç§ãã¡ã¯äººã ãOOPæ§é ã䜿ãã¹ããã©ãããè°è«ããŠããã®ã§ã¯ãªããçŸåšååšããªãOOPæ§é ãèšèªã«è¿œå ãã¹ããã©ãããè°è«ããŠããŸãã ãããè¡ããšãä»ã®æ©èœã«è²»ããããå¯èœæ§ã®ããéçºè ã®æéãããããèšèªãããè€éã«ãªããå°æ¥ã®æ©èœã®é床ãé ããªããŸãïŒæ°ããæ©èœããšã«ãå€ãæ©èœãšã®çžäºäœçšãèæ ®ããå¿ èŠãããããïŒã TypeScriptã®éçºãšè€éãã®äºç®ããã£ãšäŸ¿å©ãªãã®ã«è²»ããããã®ã§ãããã¯ç¢ºãã«ç§ã«åœ±é¿ãäžããŸãïŒ
fwiwãããããã客æ§ïŒgoogleïŒã«ã³ã¡ã³ãã§@finalã䜿çšããããã«å§ããŠãã¯ããŒãžã£ãŒã³ã³ãã€ã©ãŒã«äŒæããããã«ããŸãïŒ\
ã¯ã©ã¹ãšã¡ãœããã«_final_ãè¿œå ãããšãRïŒDããŒã ãä»ã®ããŒã ã䜿çšã§ããTSã©ã€ãã©ãªãæ§ç¯ãããšãã«åœ¹ç«ã¡ãŸãã ãããã®ããŒã¯ãŒãã¯ããã®ãããªããŒã«ã®ãµãŒãã¹é²åºã®å®å®æ§ã®ïŒéèŠãªïŒéšåã§ãã
ããŒã¯ãŒãã¯ã倧èŠæš¡ãªããŒã ã«ãšã£ãŠã¯ããéèŠã§ãããå°èŠæš¡ãªãããžã§ã¯ãã«ãšã£ãŠã¯ããã»ã©éèŠã§ã¯ãããŸããã
@dimiVergosããã¯ãŸãã«ç§ã®å Žåã§ãããä»ã®å€ãã®äººã«ãåãã ãšæããŸãã ç§ã¯èªåã®ç«å Žã®ããã«åèŠãããããã«èŠãããããããŸããããç§ã®çµéšã«ããã°ããã®ããŒã¯ãŒãã®å¯äžã®ïŒéåžžã«ã§ã¯ãããŸããïŒæ£åœãªäœ¿çšæ³ã®ããã§ãã
ç§ã¯ããã«ã€ããŠã®èšæ£ãåãå ¥ããŠããŸãïŒ
ç§ã¯æçµã¯ã©ã¹ãããïŒãµãã¯ã©ã¹ã誀ã£ãŠãããããªãŒããŒã©ã€ãããã®ãé¿ããããã«ïŒæçµã¡ãœããããµããŒãããããšã«é¢å¿ããããŸãã ããã«æ祚ããã®ã«é©åãªãã±ããã¯ãããŸããïŒ ãã±ããhttps://github.com/Microsoft/TypeScript/issues/9264ã¯ãã瀺åããŠããããã§ãã
ã§ã¯ãã©ãããã°ãæçµçãªæ¹æ³ãã«æ祚ã§ããŸããïŒ ãããšãããã®ã³ã¡ã³ãã§æ祚ããã ãã§ããïŒ ãŸããã¿ã€ãã«ã«ãã¡ãœããããè¿œå ããã«ã¯ã©ãããã°ããã§ããïŒ ç·šéã§ããŸããïŒ çŸåšã®ã¿ã€ãã«ã¯èª€è§£ãæãããã«ã¯ã©ã¹ã®ã¿ã«éå®ãããŠããŸããããã£ã¹ã«ãã·ã§ã³ã«ã¯ã¡ãœãããå«ãŸããŠããŸãã
ä»ã®å€ãã®äººãšåãããã«ãTypeScriptã®æçµçãªã¡ãœãããèŠãããšæããŸãã ç§ã¯ã倱æã®åœ±é¿ãåããªãéšåçãªåé¿çãšããŠæ¬¡ã®ã¢ãããŒãã䜿çšããŸããããå°ãªããšãå°ãã¯åœ¹ç«ã¡ãŸãã
class parent {
public get finalMethod(): () => void {
return () => {
// final logic
};
}
}
class child extends parent {
// ERROR "Class 'parent' defines instance member accessor 'finalMethod', but extended class 'child' defines it as instance member function"
public finalMethod(): void { }
}
final
ã¡ãœããã®ãã1ã€ã®å®éã®ãŠãŒã¹ã±ãŒã¹ã次ã«ç€ºããŸãã åçŽãªã³ã³ããã¹ãã®å®è£
ã容æã«ããããã«ã次ã®React.Component
æ¡åŒµãæ€èšããŠãã ããã
interface FooStore{
foo: string;
}
const {Provider, Consumer} = React.createContext<FooStore>({
foo: 'bar';
});
abstract class FooConsumerComponent<P, S> extends React.Component<P, S> {
// implement this instead of render
public abstract renderWithStore(store: FooStore): JSX.Element;
public final render() {
return (
<Consumer>
{
(store) => {
return this.renderWithStore(store);
}
}
</Consumer>
);
}
}
render()
ã¡ãœããã«final
ããªããšãã¡ãœããã誀ã£ãŠãªãŒããŒã©ã€ãããŠãã¹ãŠãå£ããŠããŸãã®ãé²ãããšã¯ã§ããŸããã
ããã«ã¡ã¯ãä»ã®å€ãã®äººãšåãããã«ãå°ãªããšãã¡ãœããã«ã¯ãfinalããŸãã¯ãsealedãããŒã¯ãŒããå¿ èŠã§ãã ãã®ããŒã¯ãŒãã¯ãéçºè ãã©ã€ãã©ãªã®é¡§å®¢ãéèŠãªã³ãŒããããã¯ãæ¡åŒµããã®ãé²ãããšãã§ããããïŒãã©ã°ã€ã³ãªã©ïŒãæ¬åœã«ä»å 䟡å€ãããããšã«å®å šã«åæããŸãã
ç§ãèŠã€ããå¯äžã®åé¿çã¯ã次ã®ãããªã¡ãœãããã³ã¬ãŒã¿ã䜿çšããããšã§ãã
function sealed(target, key,descriptor){
descriptor.writable = false; // Prevent method to be overriden
}
次ã«ããåºæ¬ãã¯ã©ã¹ã§ããã³ã¬ãŒã¿ã䜿çšããŠã¡ãœããã®ãªãŒããŒã©ã€ããé²æ¢ããŸããäŸïŒ
class MyBaseClass {
<strong i="10">@sealed</strong>
public MySealedMethod(){}
public OtherMethod(){}
...
}
ãã®ããã«ããMySealedMethodãã¯ãµãã¯ã©ã¹ã§ïŒç°¡åã«ïŒãªãŒããŒã©ã€ãã§ããŸããã§ããã äŸïŒ
class AnotherClass extends MyBaseClass {
public MySealedMethod(){} ====>> ERROR at RUNTIME (not at compile time)
}
å®éããã®åé¿çã®å¯äžã®æ¬ ç¹ã¯ããå°å°ãããããå®è¡æã«ã®ã¿è¡šç€ºããïŒjavascriptã³ã³ãœãŒã«ã®ãšã©ãŒïŒãã³ã³ãã€ã«æã«ã¯è¡šç€ºãããªãããšã§ãïŒã¡ãœããã®ããããã£ã¯é¢æ°ãä»ããŠèšå®ãããããïŒ
@RyanCavanaugh
ã¯ãã ããŒã¯ãŒããè¿œå ãããã³ã«ãããããããã®ä»ã®ããŒã¯ãŒããè¿œå ããå¿ èŠããããŸãïŒã èšèªãã§ããã ã泚ææ·±ãæé·ããããã®ã§ããããè¿œå ããããšã«å¯Ÿããé·æã§ãã
ããªãã¯ãã®è°è«ãããã®æ©èœã«å察ããå¿ãæã£ãŠå§ããŠããããã«æããŸãã 人æ°ã®ããæ©èœã¯ããã®ãããªæ©èœãæ€èšããããšã«å察ãããã€ã³ãã§ãã£ãŠã¯ãªããŸããã _ãªã人æ°ãããã®ãââ_ãèªåããæ éã«æ€èšããããšããã€ã³ãã«ãªãã¯ãã§ãã
ããªãã¯ããã«ã€ããŠè°è«ãããããæ€èšãããå察ãããã«ã€ããŠè°è«ãé£ã³äº€ã£ãŠãããšç¢ºä¿¡ããŠããŸãã ããã«å¯Ÿããè°è«ã¯ãããããã£ãŒãã£ãŒã¯ãªãŒãã§ãããšããã ãã§ããããããšããã£ãšå ·äœçãªãã®ããããŸããïŒ ããªã³ãžæ©èœã ãšæããŸããïŒ ãããããªããç§ãã¡ã¯ããªãã®å¿ãå€ããããã«äœããããããšãã§ããŸããïŒ
ç§ãã¡å šå¡ãçèããããã«ããããã®è³ªåãããã«æ®ããŠãããŸãããã
çŸåšã®æ§æã䜿çšããŠ_èšèšã«ãã£ãŠ_ã¯ã©ã¹ãã·ãŒã«ããæ¹æ³ã¯ãããŸããïŒ
æ©èœãè¿œå ãããå Žåãããã¯ç§ãã¡ã«äœãæ°ããããšãããããšãå¯èœã«ããŸããïŒ ïŒã®ããã«ãçŸåšã®æ§æã§ã¯èš±å¯ãããªããã®ïŒ
ãã®æ©èœãç§ãã¡ã«äœãæ°ããããšãããããšãå¯èœã«ãããªããããã¯äœã䟡å€ããããŸããïŒ
å°å°ãããã¯ã©ã¹ãè¿œå ãããšãèšèªã®è€éããå¢ããããŸããïŒ
å°å°ãããã¯ã©ã¹ãè¿œå ãããšãã³ã³ãã€ã©ã®è€éããå¢ããããŸããïŒ
ãããã«ã€ããŠèª¬æããããã«ãç§ã¯å°å°ãããã¡ãœããã説æã«å«ããŠããŸããããŸããå®è£ ã«å®è¡æãã§ãã¯ãå«ããŠããŸããã ãããJavascriptã«é©çšã§ããªãããšã¯èª°ããç解ããŠããŸãã
åèãŸã§ã«ïŒãã®æ©èœãžã®å¯Ÿæçãããã£ãŒãã£ãŒã¯ãªãŒãã«å¯Ÿããåãªãå æ¬çãªå£°æ以äžã®ãã®ã§ãããšããããç§ã¯çŽ æŽããããšæããŸãã
@asimonfããªããèšã£ãããšã¯ãã¹ãŠããã®ã³ã¡ã³ãïŒããã£ãšèŠããã»ã¯ã·ã§ã³ãå±éããŠè¡šç€ºããå¿ èŠããããŸãïŒãšããã«ç¶ã
ããã§ç§ãã¡ã®å¿ãå€ãããã®ã¯äœã§ããïŒ sealed
ããŒã¯ãŒããæ¬ èœããŠããããã«ã äŸã衚瀺ãããŸãã
ããŒã¯ãŒãã察åŠããããšããããã§ã®ã·ããªãªã¯ã誰ãã誀ã£ãŠã¯ã©ã¹ããç¶æ¿ããã·ããªãªã§ãã ã©ã®ããã«ããŠèª€ã£ãŠã¯ã©ã¹ããç¶æ¿ããŸããïŒ ç°¡åãªééãã§ã¯ãããŸããã JavaScriptã¯ã©ã¹ã¯æ¬è³ªçã«è匱ã§ããããããµãã¯ã©ã¹ã¯åºæ¬ã¯ã©ã¹ã®åäœèŠä»¶ãç解ãã
ããããããã«ããªãããšãåããå°ãªããšã2ã€ã®å¥ã ã®é害ã«ééããã¯ãã®ç¶æ³ããã§ã«ããã®ã«ãTypeScriptã«ãã®ããŒã¯ãŒããå¿ èŠãªã®ã¯ãªãã§ããïŒ
ç§ã¯çŽæ°žé ã«ããã°ã©ãã³ã°ãç¶ããŠããŸããããäœããå°å°ãããŠããããšã確èªããããã ãã«ãµãã¯ã©ã¹åãè©Šã¿ãããšã¯äžåºŠããããŸããã ç§ã倩æã ãããããªãïŒ ããã¯éåžžã«ãŸããªééãã§ãããJavaScriptã§ã¯ããããã®ç¶æ³ã¯ãããããåºæ¬ã¯ã©ã¹ã«è³ªåããå¿ èŠãããç¶æ³ã«ãªã£ãŠããŸãã ã§ã¯ãã©ã®ãããªåé¡ã解決ã
ç§ãfinalã䜿çšããå®éã®ã±ãŒã¹ã¯ãã¹ãŒããŒã¡ãœãããåŒã³åºããªããã®ã§ã¡ãœããããªãŒããŒã©ã€ãããªãããã«ããããšã§ãã ãã¡ãããããã€ãã®å ¬éã¡ãœããã ããããç§ãç解ããæ¬åœã®è§£æ±ºçã¯ããµãã¡ãœããã«ã¹ãŒããŒã¡ãœãããåŒã³åºãããã«åŒ·å¶ããæ©èœã§ãã https://github.com/Microsoft/TypeScript/issues/21388
ç§ã¯èšèªãã¶ã€ããŒã§ã¯ãªãã®ã§ãèšèªã«ããŒã¯ãŒããè¿œå ããããšã®æ¬ ç¹ã«ã€ããŠè©±ãããšã¯ã§ããŸããã ç§ã¯çŸåšãæçµçã«ããããšããŠããã¡ãœãããæã€æœè±¡ã¹ãŒããŒã¯ã©ã¹ã«åãçµãã§ãããšèšããŸãããæ®å¿µãªãããããããããšãã§ããŸããã§ããã ä»ã®ãšãããã³ã¡ã³ããä»ãããšããçæ³çãšã¯èšããªãã¢ãããŒããæ¡çšããŸãããã¯ã©ã¹ãå®è£ ããããŒã ã¡ã³ããŒã¯ãã®ã³ã¡ã³ããèªãŸãªãå¯èœæ§ããããŸãã
äžèšã«ã¯ã final
ã圹ç«ã€ã ãã§ãªããæ§ç¯äžã®ãã©ãããã©ãŒã ã«_å®éã®äŸ¡å€_ãš_å®éã®å®å
šæ§_ãæäŸããåªããäŸããããããããšæããŸãã ããã¯ç§ã«ãšã£ãŠãéãã¯ãããŸããã ç§ãèšã£ãããã«ãç§ã¯èšèªèšèšã®è€éãã«ã€ããŠããŸãç¥ããŸããããããã¯æããã«äººã
ãæãã§ãã/䜿çšãã/ãããæªçšããæ¹æ³ãæ¬åœã«ããããªãããŸãã¯ãããæªãã³ãŒããçæããæ©èœã§ãã ã¹ã³ãŒãã¯ãªãŒããæãããšããæŠå¿µã¯ç解ããŠããŸãããTSéçºè
ã¯ã³ãã¥ããã£ãæããã¹ãŠãå®è£
ããå¿
èŠã¯ãããŸããã
è°è«ã«ç§ã®ããããè¿œå ããããã«ããã®åé¡ã¯æ©èœã®è¿œå ããµããŒãããè¯ãè°è«ã§ãã£ã±ãã§ãããç§ãèŠãå察ã®è°è«ã¯æ¬¡ã®ãšããã§ãã®ã§ãç§ã¯ã¹ã±ãŒã«ã®ã€ãšã¹åŽã«èŠªæã眮ããããšæããŸãã
äžèšã®ãããããTSãšã³ã·ã¹ãã èªäœããŸãã¯ããããçæãããã³ãŒãã«å¯Ÿããä¿¡é Œã§ããè åšã®ããã«ã¯èŠããŸããã ãããã¯ãã¹ãŠæ¿æ²»çã§ããããã«èŠããŸãïŒããããå¹çã®ãã®ãé€ããŠãç§ã¯ããªããã¡ã«å€§ããªèªä¿¡ãæã£ãŠããã®ã§ãç§ã¯ããã«ã€ããŠæ¬åœã«å¿é ããŠããŸããããããŠããããªå¹çã®äœäžã¯ç¡æèã®ç¶æ¿ã®ééãã«ãã£ãŠéèŠãªã³ã³ããŒãã³ã/ã©ã€ãã©ãªæ§é ãçç Žããªã䟡å€ããããŸãïŒ ã
ããã建èšçã§ããããšãé¡ã£ãŠããŸãïŒ TSã倧奜ãã§ããããæ¹åããç¶ããã®ãèŠããã§ãïŒ
ð
- ç·šé -
@RyanCavanaughãžã®
So what problem is being solved?
解決ãããŠããåé¡ã¯ãäžèšã®å€ãã®ã³ã¡ã³ãã«ãã£ãŠæŠèª¬ãããŠãããšæããŸãã ç§ã¯ããã䟮蟱ãšããŠæå³ããã®ã§ã¯ãããŸãããããã®è³ªåã¯ãããªããæ瀺ãããè°è«ã«å®éã«æ³šæãæã£ãŠããªãããã«ããããŠããªãããããŒãã«ããªãã®å¿ãèšå®ããŠããããã«ãç§ã«ã¯ãããèãããããŸãã ç§ã¯ããã軜èŠããã€ããã¯ãããŸãããããã ãã§ãæ£çŽãªãšããããã®ã¹ã¬ããã¯ããã解決ããã§ãããåé¡ã®äŸã§ãã£ã±ãã§ãã
ã©ããããããç§ã¯ãã®ã³ã¡ã³ããèŠéããŸãããããã¯æ©èœãè¿œå ããããšãžã®æ·±å»ãªæžå¿µãéåžžã«ããæŠèª¬ããŠããŠãããã¯ç§ã«ãšã£ãŠçã«ããªã£ãŠããŸãã ç¹°ãè¿ãã«ãªããŸãããè¿œå ã®è€éãã¯ããããŸããããå¹çã®åé¡ã¯ããŠããïŒTSã®å¹çã«ã€ããŠå¿é ããã®ã¯éçºè ã®è²¬ä»»ã§ã¯ãªããããTSããŒã ã®ä»äºã§ãïŒããã¡ã€ãã«ã«å察ããè¯ãè°è«ã¯ãªãããã§ãã ïŒç§ã®æãè¬èãªæèŠã§ïŒã
æè¿ã®è°è«ã®ã»ãšãã©ã¯ãæçµçãªã¡ãœããã«éäžããŠã@RyanCavanaughã®ä»¥åã®æçš¿ã®ããã®ã³ã¡ã³ãããªã³ã¯ãå±éãããšã圌ã¯æçµçãªã¡ãœããã®è°è«ããããã¯ããå€ããŠãããšèŠãªããŠããããšã«@ mhegazyã¯ããã®ãã±ãããé©åãªå Žæã§ããããšã瀺åããŸããïŒïŒ9264ãéãããšãïŒã ã§ãããããšã³ããŠãŒã¶ãŒã®å°ãªãç§ã¯ãæçµçãªæ¹æ³ãã©ãã«æ±ããããæ祚ãããããã¹ããã«ã€ããŠå°æããŠã
@cbutterfield
ççŸã¯ç§ãæ°ã¥ãããã®ã§ãããæŽèšãæããŠç§ã®æçš¿ã§ã¯ææããŸããã§ããïŒç§ã¯å®éã«ãã®ã¹ã¬ãããïŒ9264ã§@ mhegazyã®æ瀺ã§ããã«æ¥ãŸããïŒã
@RyanCavanaugh
@mhegazy
äžèšã®ã³ã¡ã³ãã«ãããšãæçµçãªæ¹æ³ãè°è«ããã®ã«é©åãªå Žæã§ããããã¯ãå®éã«ç§ãæãèå³ãæã£ãŠããããšã ããã§ãã
éåžžã«å察æèŠã®ã³ã¡ã³ããæ¯ãè¿ããŸãïŒãŸã è¿œå ããŠããªãå Žåã¯ãå¿
ãðãè¿œå ããŠãã ããïŒïŒ class
ããŒã¹ã®APIã匷å¶ããããšã§ãReactãæªãäŸãèšå®ããããšã¯_ãã¯ã_ãªãããšãå ±åã§ããŠããããã§ãããã®ãŠãŒã¶ãŒã«ïŒ Hooksã®ææ¡ã«ãããReactããŒã ã¯åœŒãã®æèŠãç解ããæ ¹æ¬çã«åçŽãªæ©èœçã¢ãããŒããæ¡çšããŸããã ããã§ãå€ãã®éçºè
ãã¯ã©ã¹ããŸã£ãã䜿çšããªããã°ãªããªãæåŸã®çç±ã¯ãªããªããè¯ã銬鹿ããããšã«ãªããŸããã ç¹°ãè¿ãã«ãªããŸãããã¯ã©ã¹ãå¿
èŠã ãšæããããã®ã¯ãã¹ãŠãã¯ã©ã¹ããªããŠãããé©åã«å®è¡ã§ããŸãã
JSãšTSã®æªæ¥ã¯ã¯ã©ã¹ã¬ã¹ã§ããè³è³ããŠãã ããïŒ
@cbutterfieldç§ãæ°ã¥ããŸããããã®å·ã§è°è«ããããã«åé¡ïŒ9264ãéããããå Žåãã¿ã€ãã«ãSuggestion: Final keyword for classes and methods
ã«å€æŽããå¿
èŠããããšæããŸããããããªããšãæçµçãªæ¹æ³ãæ¢ããŠãã人ã¯ïŒæä»çã«ïŒåå¿ãè¿œå ããªãå¯èœæ§ããããŸããæåã®æçš¿ã
@mhegazyã®åŒçšïŒ
JavaãCïŒã¯ãfinal
ã¯ã©ã¹ã䜿çšããŠãå®è¡æã«ã¯ã©ã¹ãæé©åããŸããããã¯ãã¯ã©ã¹ãç¹æ®åãããªãããšãèªèããŠããŸãã ãããæçµçãªãµããŒãã®äž»ãªäŸ¡å€ã§ãããšç§ã¯äž»åŒµããŸãã TypeScriptã§ã¯ãfinalã䜿çšããªãå Žåãããã³ãŒããå®è¡ããããããããã«æäŸã§ãããã®ã¯ãããŸããã
ç§ã¯æ ¹æ¬çã«åæããŸããã ç§ã¯å€ãã®ããŒã ã§é·å¹ŽJavaã§éçºããŠããŸããããã©ã³ã¿ã€ã ã®æé©åã«æçµçãªã¯ã©ã¹ãã¡ãœããã䜿çšããããšã¯ãããŸããã å®éã«ã¯ãããã¯äž»ã«OOPèšèšã€ãã£ãªã ã§ãã é¢æ°ãä¿è·ããŠä¿èšŒãããããã©ã€ãã©ãªã®APIãã€ãºãæ¬è³ªçãªãã®ã«å¶éããããããŸãã¯APIãŠãŒã¶ãŒãè€éãªAPIã誀解ããªãããã«ããããã«ãã¯ã©ã¹ãŸãã¯ã¡ãœãããå€éšãµãã¯ã©ã¹ã«ãã£ãŠæ¡åŒµ/ãªãŒããŒã©ã€ãããããªãå ŽåããããŸãã
ã¯ãããããã®åé¡ã¯ã³ã¡ã³ããã€ã³ã¿ãŒãã§ãŒã¹ãè¿œå ããããšã§è§£æ±ºã§ããŸããã final
ã¯ãã¯ãªãŒã³ã§æ¡åŒµå¯èœãªAPIãåããåçŽãªã¯ã©ã¹ã ããå¿
èŠãªå Žåã«ã衚瀺ãããAPIãå¿
èŠãªé¢æ°ã«æžããããã®æŽç·Žããããœãªã¥ãŒã·ã§ã³ã§ãã
ãã®åé¡ã¯3幎è¿ãåã®ãã®ã§ããããã§ã«abstract
ããŒã¯ãŒãããããããå®éã«ã¯final
ããŒã¯ãŒããå¿
èŠã§ãã
人ã
ã«ããã匷å¶çã«äœ¿çšãããããªãããšããããŠããã¯abstractããŒã¯ãŒããšåãããã䟿å©ãªæ©èœã§ããããšãèŠããŠãããŠãã ããã ãããã final
ããŒã¯ãŒãã®å©ç¹ã匷ã瀺ãå¥ã®ãŠãŒã¹ã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
abstract class A {
protected abstract myVar: string;
protected abstract myFunction(): void;
}
class B extends A {
protected readonly myVar: string = "toto";
constructor() {
super();
this.myFunction();
}
protected myFunction() {
console.log(this.myVar);
}
}
class C extends B {
constructor() {
super();
}
protected myFunction() {
console.log("tata");
};
public callFunction = () => {
this.myFunction();
}
}
const myB = new B(); // toto
const myC = new C(); // toto
myC.callFunction(); // tata
ã³ã³ãã€ã«åŸã®çµæïŒ
toto
tata
ãããã£ãŠããã®ã³ãŒãã§ã¯ãæœè±¡ã¡ãœãããšããããã£ãæã€æœè±¡ã¯ã©ã¹A
ããããç¶æ¿ãããã¯ã©ã¹ã§ããããå®çŸ©ããå¿
èŠããããŸãããä»ã®ã¯ã©ã¹ããããã®å®è£
ããªãŒããŒã©ã€ãããªãããã«ããŸãã
protected
ããŒã¯ãŒããä¿æããã®ãæåã®æ¹æ³ã§ãããã芧ã®ãšãããå±æ§ãåå®çŸ©ããããšã¯ã§ããŸãã
ã§ã¯ãTypescriptã®ã³ã³ãã€ã«ããã»ã¹ãããã«é²ããŠã readonly
ã䜿çšããŠå±æ§ãä¿è·ãããšãããã©ããªãã§ããããïŒãããŠãã¡ãœãããããããã£ã§ãããšåœã£ãŠïŒã
class B extends A {
[...]
protected readonly myFunction = () => {
console.log(this.myVar);
}
}
class C extends B {
protected myVar: string = "I am not protected that much";
[...]
protected myFunction = () => { // using the readonly keyword doesn't prevent any modification
console.log("tata"); // If you launch this code, tata will still be logged in the console.
};
}
ïŒã³ãŒãã¯tscã§ã³ã³ãã€ã«ãããã³ã³ãã€ã«ãŸãã¯å®è¡æã«ãšã©ãŒãã¹ããŒãããªãããšã«æ³šæããŠãã ããïŒ
ãããã£ãŠã2ã€ã®åé¡ããããŸãã
B
å±æ§ã¯ä¿è·ãããŠããªããããäºæããªãç¶æ¿ãé²ãæ¹æ³ãå¿
èŠã§ããreadonly
ããããã£ããªãŒããŒã©ã€ãã§ããããšãããããŸãããã¯ããTypescriptã¯ã protected
代ããã«private
ã䜿çšããããã«å€æŽãã芪ããããã£ã§ããããšãèªèããŠããŸãã C
ã¯ã©ã¹ã§ã¯ãåãã¢ã¯ã»ã¹ã¿ã€ã/å¯èŠæ§ã§ã¯ãªãããããšã©ãŒãã¹ããŒãããŸããçŸæç¹ã§ã¯ããã³ã¬ãŒã¿ïŒå ¬åŒã®Typescriptããã¥ã¡ã³ãã瀺ãããã«å°å°ãããŠããããæçµçãªãã³ã¬ãŒã¿ïŒã䜿çšã§ããŸãããå®è¡æã«ã®ã¿æçšã§ããã代ããã«ã³ã³ãã€ã«ããã»ã¹ã§ãããé²ãå¿ èŠãããããšã«æ³šæããŠãã ããã
ä¿è·ãããèªã¿åãå°çšå€ããªãŒããŒã©ã€ããããããå®éã«ã¯å¯èœã§ããããã¹ãã§ã¯ãªãå Žåã«ããã»ãã¥ãªãã£éåãïŒãããåŒã³åºãããšãã§ããå ŽåïŒã«é¢ããåé¡ããããã©ããã調ã¹ãŸãã ãã以å€ã®å Žåã¯ã private
ã protected
ããŒã¯ãŒãã®äžã§ãç¶æ¿é¢é£ã®ãã®ã䜿çšããreadonly
ããŒã¯ãŒãã®æ€èšŒã«ã€ããŠè°è«ããåé¡ãéããŸãã
tl; drïŒ final
ããŒã¯ãŒãã¯2ã€ã®åé¡ã解決ããŸãïŒãã ãã readonly
æ€èšŒã¯ãäžæ£ãªæžãæããé²ãããã®è¯ãã¹ã¿ãŒãã§ãïŒ
3幎åŸ...ããã¯ãšãŠãã°ãããŠããŸãã
ãã®æ©èœã®å¿ èŠæ§ã蚌æããããã«ãä»ã®èšèªã§äœãè¡ããããã確èªããããšããå§ãããŸãã
Java:
final class SomeClass { ... }
PHP:
final class SomeClass { ... }
C#:
sealed class SomeClass {...}
C++:
class SomeClass final { ... }
Delphi:
type SomeClass = class sealed() ... end;
ãããã£ãŠãæãäžè¬çãªãã¹ãŠã®OOPèšèªã§ããã®æ©èœã¯OOPã®ç¶æ¿ããžãã¯ã«ç±æ¥ããããã«ååšããããšãããããŸãã
ãŸããTSã®éçºãªãŒããŒã®èšèãåŒçšããå¿ èŠããããŸã
æçµã¯ã©ã¹ãããå Žåã¯ãæçµã¡ãœãããŸãã¯ããããã£ããå¿ èŠãã«ãªããŸãã
ç®èãªããšãã©ããã¯ããããŸããããJSã§ã¯readonlyããŒã¯ãŒããããããã£ïŒããã³ããŒãããå Žåã¯ã¡ãœããïŒã«äœ¿çšããããããããã¯ããªã銬鹿ããç¹ã§ãã
ãããŠãã³ãã¥ããã£ã圌ã«åŒ·ãå察ããŠããããšãæå³ãã+40ã®å察祚ãæã£ãŠãããšãã«ãäžäººã®ç·ã«åé¡ãçµããããªãããšã¯ããããªãæããªç¶æ³ãé¿ããããã®è¯ãã¢ããã€ã¹ã§ãããã
Typescriptã®äž»ãªæ©èœã匷åããããšã«èå³ããªãå Žåã¯ãæè¡ãã¥ãŒã¹ãTwitterã§ãããäžç¶ã§ããããã«ã倧声ã§èšã£ãŠãã ãããããããªããšãé ããæªã話é¡ã«ãªããŸãã ããªãã¯èªåã®ã³ãã¥ããã£ãç¡èŠããŠããã ãã§ãããã³ãã¥ããã£ã«ç§ãã¡ãå¿ èŠãã©ãããæ€èšŒãããããã»ã¹ã¯ãããŸããã
+40ã®å察祚ããããšãã«ã1人ã®ç·ã«åé¡ãçµããããªãããã«ããããšã¯ãã³ãã¥ããã£ã圌ã«åŒ·ãå察ããããšãæå³ããŸãããã以äžã®æããªç¶æ³ãé¿ããããã®è¯ãã¢ããã€ã¹ã§ãã
ç§ã¯ãäžäººã®ç·ãã§ã¯ãããŸããã ããã§æ±ºå®ãäžããšããããã¯TypeScriptããŒã å šäœã®ææ決å®ããã»ã¹ãåæ ããŠããŸãã èšèšããŒã ã¯ããã®åé¡ã§è€æ°åèŠãŠããŸããããæ¯ååãçµè«ã«æ¥ãŸãã ããªãã¯ãã®çµæã«å察ããããšãæè¿ããŸãããããã»ã¹ã¯è°è«ã®äœå°ããããŸããã
ã³ãã¥ããã£ã«ç§ãã¡ãå¿ èŠãã©ãããæ€èšŒãããããã»ã¹ã¯ãããŸããã
ãããããã»ã¹ã§ããããã§ãããªãã¯ç§ãã¡ã®æšè«ã®èŠçŽããã°ãããããšåŒã³ãç§ïŒããã³ããŒã ã®ä»ã®äººã ïŒã¯ãããèªãã§ããŸãã ç§ãã¡ã¯ãã£ãŒãããã¯ãèããŠããŸãã
ãããæ€èšããçç±ãšããŠä»ã®å®è£ ãããæ©èœãææããããšã¯åãã§ãããå®éã«ã¯è°è«ã§ã¯ãªãããšãç§ã¯ç¥ã£ãŠããŸãããã¿ã€ããšã€ãªã¢ã·ã³ã°ã¡ã«ããºã ãèæ ®ãããŠè¿œå ãããã®ã¯ç®èã§ãïŒããã¯çŽ æŽããããããããŸãããããããªãã§çããããšã¯ç¢ºãã§ãïŒãããããã®ãããªãã®ã¯æåŠãããŸãã
çµå±ãç§ã¯ãã®ãããªæ©èœãªãã§çããããšãã§ããŸãããTSãæã£ãŠããæ©èœã®çŽååã«ã€ããŠãåãããšãèšããŸãã ã§ã¯ããããå®è£ ããããšãæ€èšããé©åãªçç±ã¯äœã§ããããïŒ
GitHubã¯ããã«å€ãã®ã³ã¡ã³ããé ããŠããŸãã®ã§ãéå»ã«è¡ã£ãããŸããŸãªåçïŒããã³ããã€ãã®è¿œå ïŒãåæçš¿ããŸãã 以äžã«ãããã€ãã®èããè¿œå ããŸãã
ååã¬ãã¥ãŒããéã«ããã€ãã®ç¹ãèæ ®ãããŸãã
final
ãªããšã¯ã©ã¹ããŸã£ãã圹ã«ç«ããªããšæ¬åœã«æããå Žåãããã¯TC39å§å¡äŒã§åãäžãããães-discussã«æã¡èŸŒããã®ã§ãã final
ãå¿
é ã®æ©èœã§ããããšãTC39ã«çŽåŸãããããšããªãããŸãã¯çŽåŸãããããšãã§ããªãå Žåã¯ãTypeScriptã«è¿œå ããããšãæ€èšã§ããŸããnew
ãåŒã³åºãããšãåæ³ã§ããå Žåãããã¯ããããç¶æ¿ããããšãš1察1ã®ã©ã³ã¿ã€ã 察å¿ãæã£ãŠããŸãã new
'dã§ãããã super
' dã§ã¯ãªããã®ã®æŠå¿µã¯JavaScriptã«ã¯ååšããŸããTSããããå¿ èŠãšããªãçç±ã«ã€ããŠã®èª¬åŸåã®ããè°è«ãèããããšããããŸãã
ããã¯ãããã©ã®ããã«æ©èœãããã§ã¯ãªãããšãæãåºããŠãã ããã ãã¹ãŠã®æ©èœã¯-100ããå§ãŸããŸãã ãã®æçš¿ãã
ãããã®è³ªåã®ããã€ãã§ã¯ã質åã¯ããªãç¹å®ã®æ©èœããåé€ããŸãã¯ãé€å€ãããã®ããå°ããŸãã ãã®èšãåãã¯ãæ¢åã®èšèªïŒããã§ã¯ãC ++ãšJavaãäžè¬çãªéžæè¢ã§ãïŒããå§ããŠã奜ããªãšãããŸã§æ©èœãåé€ãå§ããããšãæå³ããŸãã ãããŠãä¿¡ãããã人ããããããããŸããããããã¯èšèªãèšèšãããæ¹æ³ã§ã¯ãããŸããã
è€éãã®äºç®ã«ã¯éãããããŸãã ç§ãã¡ãè¡ããã¹ãŠã®ããšã¯ãç§ãã¡ãè¡ã次ã®ãã¹ãŠã®ããšã0.1ïŒ é ãããŸãã æ©èœããªã¯ãšã¹ããããšãä»ã®ãã¹ãŠã®æ©èœãå°ãé£ãããªããå°ãé ããªããå¯èœæ§ãå°ãäœããªãããã«èŠæ±ããŸãã Javaããããæã£ãŠããããCïŒããããæã£ãŠãããããããã»ãã®æ°è¡ã®ã³ãŒãã§ããããã³ãã³ãã©ã€ã³ã¹ã€ãããè¿œå ã§ãããããããã§ã¯äœãå ¥ããŸããã æ©èœã¯ãããèªäœãšå°æ¥ã®è² æ å šäœã«å¯ŸããŠæ¯æãå¿ èŠããããŸãã
ããã§ç§ãã¡ã®å¿ãå€ãããã®ã¯äœã§ããïŒ final
ããŒã¯ãŒããæ¬ èœããŠããããã«ã äŸã衚瀺ãããŸãã
ããŒã¯ãŒãã察åŠããããšããããã§ã®ã·ããªãªã¯ã誰ãã誀ã£ãŠã¯ã©ã¹ããç¶æ¿ããã·ããªãªã§ãã ã©ã®ããã«ããŠèª€ã£ãŠã¯ã©ã¹ããç¶æ¿ããŸããïŒ ç°¡åãªééãã§ã¯ãããŸããã JavaScriptã¯ã©ã¹ã¯æ¬è³ªçã«è匱ã§ããããããµãã¯ã©ã¹ã¯åºæ¬ã¯ã©ã¹ã®åäœèŠä»¶ãç解ãã
èšãæãããšãJavaScriptã§ã¯ã©ã¹ããç¶æ¿ããããã®å¯äžã®æ£ããããã»ã¹ã¯ãåžžã«ãã®ã¯ã©ã¹ã®ããã¥ã¡ã³ããèªãããšããå§ãŸããŸãã åºæ¬ã¯ã©ã¹ãåçŽã«å°åºããŠã³ãŒãã£ã³ã°ãéå§ããªããã°ãªããªãå¶çŽãå€ãããŸãã æåã®ã¹ãããã§ãè©Šè¡ããªãããšããã§ã«ç¥ã£ãŠããå¿ èŠãããå Žåãéç匷å¶ã¯ã¹ããã3ã§ã©ã®ãããªå€ãæäŸããŸããïŒ
ããããããã«ããªãããšãåããå°ãªããšã2ã€ã®å¥ã ã®é害ã«ééããã¯ãã®ç¶æ³ããã§ã«ããã®ã«ãTypeScriptã«ãã®ããŒã¯ãŒããå¿ èŠãªã®ã¯ãªãã§ããïŒ
ç§ã¯çŽæ°žé ã«ããã°ã©ãã³ã°ãç¶ããŠããŸããããäœããå°å°ãããŠããããšã確èªããããã ãã«ãµãã¯ã©ã¹åãè©Šã¿ãããšã¯äžåºŠããããŸããã ç§ã倩æã ãããããªãïŒ ããã¯éåžžã«ãŸããªééãã§ãããJavaScriptã§ã¯ããããã®ç¶æ³ã¯ãããããåºæ¬ã¯ã©ã¹ã«è³ªåããå¿ èŠãããç¶æ³ã«ãªã£ãŠããŸãã ã§ã¯ãã©ã®ãããªåé¡ã解決ã
Typescriptã®äž»ãªæ©èœã匷åããããšã«èå³ããªãå Žåã¯ãæè¡ãã¥ãŒã¹ãTwitterã§ãããäžç¶ã§ããããã«ã倧声ã§èšã£ãŠãã ãã
èšèªã®èšèšæ¹æ³ã«ã€ããŠã¯éåžžã«æ確ã§ãã ç®æšã§ã¯ãªããã³ããŒã¯ã³ã¯ããã®ææ¡ãæ£ç¢ºã«ç©èªã£ãŠããŸãã
ããã§å€ãã®ã³ã¡ã³ããèªãã åŸã®ç§ã®å人çãªåå¿ã¯ãä»ã®èšèªã«ååšããæ§é ã«ãã匷ããã€ã¢ã¹å¹æããããšããããšã§ãã çœçŽã®ç¶æ ã®èŠ³ç¹ããããã«ã¢ãããŒããããšãæ³åã§ããè¡åãæ°åãããŸãããTypeScriptã«ã¯å°ããªãµãã»ãããããããŸããã
ã¡ãœããã«é©çšããã掟çã¡ãœãããsuper
ä»ããŠãããåŒã³åºãããã«åŒ·å¶ãããããŒã¯ãŒããç°¡åã«æ³åã§ããŸãã CïŒãšJavaã«ãã®ããŒã¯ãŒããããã°ã人ã
ã¯ãããçã«ããªã£ãŠããå Žæã«ãã®ããŒã¯ãŒãã絶察ã«é©çšããã§ãããã å®éãã©ã³ã¿ã€ã ãã§ãã¯ãé©çšããããšã¯äžå¯èœã§ãããã掟çã¯ã©ã¹ãååšããªãå¯èœæ§ãããããããåºæ¬æŽŸçã³ã³ãã©ã¯ãã®ã¯ããã«åŸ®åŠãªåŽé¢ã§ããããã final
ãããã¯ããã«äžè¬çã«é©çšãããŸãã "ã final
ã¯ãªãããŸããŸãªæ¹æ³ã§åœ¹ç«ã¡ãŸãã ç§ã¯ãããããããããã®ããŒã¯ãŒããæã£ãŠãããšæããŸãïŒã©ã¡ããè€éããšäŸ¡å€ã®ããŒãæºãããŠããªããšæããŸããïŒã
ã§ã¯ããããå®è£ ããããšãæ€èšããé©åãªçç±ã¯äœã§ããããïŒ
ãã£ãŒãããã¯ãèŠããšã次ã®ãããªåŒ·åãªèæ ®äºé ããããŸãã
final
ã¯ãããã«åœãŠã¯ãŸããŸãããããã®é¢æ°ã2åç¶ããŠåŒã³åºãããšã¯ã§ããŸããããŸãã¯ããã®ã¯ã©ã¹ã®æ§ç¯ã¯æ¬¡ã®éåæãã£ãã¯ãŸã§å®éã«ã¯çµäºããŸããããšãã修食åãåœãŠã¯ãŸããŸãã æ³åã§ãããã¹ãŠã®ãã®ãååšããå¿
èŠã¯ãããŸããã
ãå®éã«ã¯ãµãã¯ã©ã¹åã§ããªãã¯ã©ã¹ããç¶æ¿ããããšããããããããã°ã«äœæéãè²»ãããããªã©ã®ãã£ãŒãããã¯ã¯èŠãããšããããŸãããå®éã«ã¯æ³åã§ããªãããããã¯ããããæ£ããããªã¬ãŒããããšèª°ããèšã£ãŠããŸãã 修食åãååšãããšããŠããã¯ã©ã¹ãæçµçãªãã®ã§ãããã©ãããã©ã€ãã©ãªãææžåããªããããå®éã«ã¯ç¶æ³ãæ¹åããŸãããããšãã°ã fs.FSwatcher
final
ïŒ ããŒãã®äœè
ã§ããç¥ããªãããã§ãã ãããã£ãŠãäœæè
ãfinal
ã§ããããšãç¥ã£ãŠããã°ã final
ã§ååã§ãããããã¯é¢ä¿ãªãææžåãããŸãã final
ããªãå Žåã¯ãå€ãã®å Žåãå®éã«ã¯äœãããããŸãããã©ã¡ãã®æ¹æ³ãç¥ãããŠããªãã ãã§ãã
ç§ã¯ãäžäººã®ç·ãã§ã¯ãããŸããã ããã§æ±ºå®ãäžããšããããã¯TypeScriptããŒã å šäœã®ææ決å®ããã»ã¹ãåæ ããŠããŸãã
ç³ãèš³ãããŸããããç§ã¯mhegazyãšãTypescriptã䜿çšããã³ãã¥ããã£ãã圌ãåŸãããªã倧èŠæš¡ãªãã£ãŒãããã¯ã«ã€ããŠèšåããŠããŸããã
ãã¡ã€ãã«ãªãã§ã¯ã¯ã©ã¹ãå®å šã«åœ¹ã«ç«ããªããšæ¬åœã«æããå Žåãããã¯TC39å§å¡äŒã§åãäžãããães-discussã«æã¡èŸŒããã®ã§ãã ãã¡ã€ãã«ãå¿ é ã®æ©èœã§ããããšãTC39ã«çŽåŸãããææããªãããŸãã¯çŽåŸã§ããªãå Žåã¯ãTypeScriptã«è¿œå ããããšãæ€èšã§ããŸãã
private
ããŒã¯ãŒãã®ææ¡ããã§ã«ããããã final
ãæåã®ã¹ãããã§ã¯ãªããšæããŸãhttps://github.com/tc39/proposal-private-methods
ç§ã¯You should a comment to say *dont do this*
ã«æççã§ããããã¯ãã©ãŒã Hey don't write down specific characters
ã§èšã£ãŠãããããªãã®ã§ããããªãã¯ã»ãŒæ°žé ã«ã³ãŒãã£ã³ã°ããã®ã§ãéçºè
ã®n°1ã«ãŒã«ãç¥ã£ãŠããå¿
èŠããããŸãïŒãŠãŒã¶ãŒãä¿¡é Œããªãã§ãã ããïŒããã³ã³ãŒãã䜿çšããéçºè
ïŒ
ãŠãŒã¹ã±ãŒã¹ãäœãããŠå¹ççã§ã¯ãªãããããã¹ãŠãå®å
šã«åæ¢ããæçµçãªããŒã¯ãŒããå®è£
ããããã«10åãã«ãæå
¥ããå¿
èŠããããšèšã£ãŠããããã§ã¯ãããŸããããŸããå¶éãTSãšJSã®äž¡æ¹ããã®ãã®ã§ããäŸãããã€ãæããããšãèæ
®ããŠãã ããã人ã
ãTSãéžæããå Žåãããã¯å®è¡æã§ã¯ãªãã³ã³ãã€ã«æã®ãšã©ãŒãé²ãããã§ãã å®è¡æã«ççºããããå Žåã¯ãJSã䜿çšããŠTSã®ããšãæ°ã«ããã®ããããããšãã§ããŸããã final
ããŒã¯ãŒãã®äœ¿çšæ¹æ³ã瀺ã究極ã®ãŠãŒã¹ã±ãŒã¹ããããããããã¯éèŠã§ã¯ãããŸãããã¡ãœãããç§ã¯èª°ã«ããããäžæžãããŠã»ãããªãã
Javascriptã¯ããã«ãã£ãŠå¶éãããŠãããããã³ãã¥ããã£ã¯Typescriptããã®å¶éãè¶ ããå¯èœæ§ããããšèããŠããŸããããã®ããããã®åé¡ã¯3幎éç¶ããŠããŸãããã®ããããã®æ©èœãããã«ãªãã®ã¯ãªãããšäººã ã¯ãŸã çåã«æã£ãŠããŸãããã®ãããã³ã³ãã€ã©ã«ã¯ã©ã¹ãã¡ãœããã®æåãã§ãã¯ãè¡ããŸãã
JSãããããå®è£
ããããã®ãã©ã€ããŒã/ãããªãã¯ã¡ãœãããæã£ãŠããã®ãåŸ
ã¡ãŸããã§ããããå®éã«ã¯ãããã#
ããŒã¯ãŒãã«å«ããææ¡ããããŸãïŒ public
/ private
ãããåé·ã§ã¯ãããŸããïŒ ïŒãå®ç§ãªèšèªãäœæãããã£ãã®ã¯ããã£ãŠããŸããå®ç§ãšã¯ãäœãè¿œå ã§ããªããªã£ããšãã§ã¯ãªããäœãåé€ã§ããªããªã£ããšãã ããã§ãã
ã³ã³ãã€ã«ããã»ã¹ã§ã¡ãœãããäžæžããããã®ãé²ãããã®è§£æ±ºçãèŠã€ããããšãã§ãããïŒãã€ã³ããæå¹ã§ã¯ãªããããã©ã³ã¿ã€ã ããã»ã¹ã§ã¯äžæžããããŸããïŒãç§ã®ã²ã¹ãã«ãªããŸãã
ç§ã¯ç¶æ³ã®åŒ±ç¹ïŒã¯ã©ã¹ã§ã¯ãªãã¡ãœãã/ããããã£ïŒã瀺ããããšããŸãããTSéçºè ã¯å¿ èŠãªã©ã€ãã©ãªãæžãæããŠãå¿ èŠãªãã®ãå£ãããšãã§ããããã§ãããããããããçŸããã ãšæããŸãã
ã¡ãªã¿ã«è¿ä¿¡ããããšãããããŸããéçºããŒã ãããªãã«å¯Ÿããææªãæªãè¡åã¯ãããŸããã
ãã¹ãŠã®æå¹ãªãã€ã³ãïŒ ããããè°è«ãã«åããŠã¿ãŸããã
aïŒæçµã¯ã©ã¹ããµããŒããã
bïŒæçµçãªæ¹æ³ããµããŒããã
ãã¹ãŠã®åŒæ°ã¯aïŒã察象ãšããŠããŸãããbã察象ãšãããã®ã¯ãããŸããã
è°è«ã§äœåºŠãææãããããã«ãæçµçãªæ¹æ³ãæã€ããšã¯éåžžã«éèŠã§ãã ç§ããããŸã§èããå¯äžã®çãã¯ãOOPãããªããã§ãã-ããããããã¯ç§ïŒãããŠä»ã®å€ãã®äººïŒãäžç·ã«è¡ãããšã§ã¯ãããŸããã
ã¢ã 2019幎1æ28æ¥20æ32 umã®schriebã©ã€ã¢ã³Cavanaughã®[email protected] ïŒ
GitHubã¯ããã«å€ãã®ã³ã¡ã³ããé ããŠããŸãã®ã§ãéå»ã«è¡ã£ãããŸããŸãªåçïŒããã³ããã€ãã®è¿œå ïŒãåæçš¿ããŸãã 以äžã«ãããã€ãã®èããè¿œå ããŸãã
ååã¬ãã¥ãŒããéã«ããã€ãã®ç¹ãèæ ®ãããŸãã
ã¯ã©ã¹ã¯JAVASCRIPTæ©èœã§ãããTYPESCRIPTæ©èœã§ã¯ãããŸããã ãã¡ã€ãã«ãªãã§ã¯ã¯ã©ã¹ãå®å šã«åœ¹ã«ç«ããªããšæ¬åœã«æããå Žåãããã¯TC39å§å¡äŒã§åãäžãããães-discussã«æã¡èŸŒããã®ã§ãã ãã¡ã€ãã«ãå¿ é ã®æ©èœã§ããããšãTC39ã«çŽåŸãããææããªãããŸãã¯çŽåŸã§ããªãå Žåã¯ãTypeScriptã«è¿œå ããããšãæ€èšã§ããŸãã
äœãã«å¯ŸããŠnewãåŒã³åºãããšãåæ³ã§ããå Žåãããã¯ããããç¶æ¿ããããšãš1察1ã®ã©ã³ã¿ã€ã 察å¿ãæã£ãŠããŸãã æ°ããããããšã¯ã§ããããã¹ãŒããŒã«ããããšã¯ã§ããªããšããæŠå¿µã¯ãJavaScriptã«ã¯ååšããŸããã
TypeScriptãOOPããŒã¯ãŒãã¹ãŒãã«ãªããªãããã«æåãå°œãããŠããŸãã JavaScriptã®ç¶æ¿ãããåªããæ§æã¡ã«ããºã ãå€æ°ãããCïŒãšJavaãæã€ãã¹ãŠã®ããŒã¯ãŒããçšæããå¿ èŠã¯ãããŸããã
ã©ã³ã¿ã€ã ãã§ãã¯ãç°¡åã«èšè¿°ããŠããæçµçãªãã¯ã©ã¹ããã®ç¶æ¿ãæ€åºã§ããŸããããã¯ããã¹ãŠã®ã³ã³ã·ã¥ãŒããŒãTypeScriptã䜿çšããŠãããšã¯éããªãããã誰ãã誀ã£ãŠã¯ã©ã¹ããç¶æ¿ããããšããå¿é ãããŠããå Žåã¯ããšã«ããå®è¡ããå¿ èŠããããŸãã ã
lintã«ãŒã«ãèšè¿°ããŠãç¹å®ã®ã¯ã©ã¹ãç¶æ¿ãããªãã¹ã¿ã€ã«ã®èŠåãé©çšã§ããŸãã
誰ããããªãã®å°å°ãããã¹ãã¯ã©ã¹ãããå¶ç¶ã«ãç¶æ¿ãããšããã·ããªãªã¯ãäžçš®ã®å¥åŠãªãã®ã§ãã ãŸããç¹å®ã®ã¯ã©ã¹ããç¶æ¿ããããšããå¯èœãã§ãããã©ããã«ã€ããŠã®èª°ãã®åå¥ã®è©äŸ¡ã¯ãããããããªãçããããšæããŸãã
ã¯ã©ã¹ãå°å°ããçç±ã¯åºæ¬çã«3ã€ãããŸããã»ãã¥ãªãã£ãããã©ãŒãã³ã¹ãæå³ã§ãã ãããã®ãã¡ã®2ã€ã¯ãTypeScriptã§ã¯æå³ããªããããä»ã®ã©ã³ã¿ã€ã ã§å®è¡ãããžã§ãã®3åã®1ããå®è¡ããªããã®ã®è€éããšã²ã€ã³ãèæ ®ããå¿ èŠããããŸãã
TSããããå¿ èŠãšããªãçç±ã«ã€ããŠã®èª¬åŸåã®ããè°è«ãèããããšããããŸããããã¯ãããã©ã®ããã«æ©èœãããã§ã¯ãªãããšãæãåºããŠãã ããã ãã¹ãŠã®æ©èœã¯-100https ïŒ //blogs.msdn.microsoft.com/ericgu/2004/01/12/minus-100-points/ããå§ãŸã
ãããã®è³ªåã®ããã€ãã§ã¯ã質åã¯ããªãç¹å®ã®æ©èœããåé€ããŸãã¯ãé€å€ãããã®ããå°ããŸãã ãã®èšãåãã¯ãæ¢åã®èšèªïŒããã§ã¯ãC ++ãšJavaãäžè¬çãªéžæè¢ã§ãïŒããå§ããŠã奜ããªãšãããŸã§æ©èœãåé€ãå§ããããšãæå³ããŸãã ãããŠãä¿¡ãããã人ããããããããŸããããããã¯èšèªãèšèšãããæ¹æ³ã§ã¯ãããŸããã
è€éãã®äºç®ã«ã¯éãããããŸãã ç§ãã¡ãè¡ããã¹ãŠã®ããšã¯ãç§ãã¡ãè¡ã次ã®ãã¹ãŠã®ããšã0.1ïŒ é ãããŸãã æ©èœããªã¯ãšã¹ããããšãä»ã®ãã¹ãŠã®æ©èœãå°ãé£ãããªããå°ãé ããªããå¯èœæ§ãå°ãäœããªãããã«èŠæ±ããŸãã Javaããããæã£ãŠããããCïŒããããæã£ãŠãããããããã»ãã®æ°è¡ã®ã³ãŒãã§ããããã³ãã³ãã©ã€ã³ã¹ã€ãããè¿œå ã§ãããããããã§ã¯äœãå ¥ããŸããã æ©èœã¯ãããèªäœãšå°æ¥ã®è² æ å šäœã«å¯ŸããŠæ¯æãå¿ èŠããããŸãã
ããã§ç§ãã¡ã®å¿ãå€ãããã®ã¯äœã§ããïŒ æåŸã®ããŒã¯ãŒããæ¬ èœããŠããããã«ãæ¬æ¥ã®æ¹æ³ã§æ©èœããªãã£ãã³ãŒãã®äŸã衚瀺ãããŸãã
ããŒã¯ãŒãã察åŠããããšããããã§ã®ã·ããªãªã¯ã誰ãã誀ã£ãŠã¯ã©ã¹ããç¶æ¿ããã·ããªãªã§ãã ã©ã®ããã«ããŠèª€ã£ãŠã¯ã©ã¹ããç¶æ¿ããŸããïŒ ç°¡åãªééãã§ã¯ãããŸããã JavaScriptã¯ã©ã¹ã¯æ¬è³ªçã«è匱ã§ããããããµãã¯ã©ã¹ã¯ãã®åºæ¬ã¯ã©ã¹ã®åäœèŠä»¶ãç解ããå¿ èŠããããŸããã€ãŸããäœããã®åœ¢åŒã®ããã¥ã¡ã³ããäœæããå¿ èŠãããããã®ããã¥ã¡ã³ãã®æåã®è¡ã¯åã«ããã®ã¯ã©ã¹ããµãã¯ã©ã¹åããªãã§ãã ãããã«ããããšãã§ããŸãã ãŸãã¯ãã©ã³ã¿ã€ã ãã§ãã¯ãè¡ãããšãã§ããŸãã ãŸãã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ããã¡ã¯ããªã¡ãœããã®èåŸã«é ãããšãã§ããŸãã ãŸãã¯ä»ã®æ°ã®ãªãã·ã§ã³ã
èšãæãããšãJavaScriptã§ã¯ã©ã¹ããç¶æ¿ããããã®å¯äžã®æ£ããããã»ã¹ã¯ãåžžã«ãã®ã¯ã©ã¹ã®ããã¥ã¡ã³ããèªãããšããå§ãŸããŸãã åºæ¬ã¯ã©ã¹ãåçŽã«å°åºããŠã³ãŒãã£ã³ã°ãéå§ããªããã°ãªããªãå¶çŽãå€ãããŸãã æåã®ã¹ãããã§ãè©Šè¡ããªãããšããã§ã«ç¥ã£ãŠããå¿ èŠãããå Žåãã¹ããã3ã§éç匷å¶ãæäŸããå€ã¯äœã§ããïŒ
ããããããã«ããªãããšãåããå°ãªããšã2ã€ã®å¥ã ã®é害ã«ééããã¯ãã®ç¶æ³ããã§ã«ããã®ã«ãTypeScriptã«ãã®ããŒã¯ãŒããå¿ èŠãªã®ã¯ãªãã§ããïŒ
ç§ã¯çŽæ°žé ã«ããã°ã©ãã³ã°ãç¶ããŠããŸããããäœããå°å°ãããŠããããšã確èªããããã ãã«ãµãã¯ã©ã¹åãè©Šã¿ãããšã¯äžåºŠããããŸããã ç§ã倩æã ãããããªãïŒ ããã¯éåžžã«ãŸããªééãã§ãããJavaScriptã§ã¯ããããã®ç¶æ³ã¯ãããããåºæ¬ã¯ã©ã¹ã«è³ªåããå¿ èŠãããç¶æ³ã«ãªã£ãŠããŸãã ã§ã¯ãã©ã®ãããªåé¡ã解決ãããŠããã®ã§ããããã
Typescriptã®äž»ãªæ©èœã匷åããããšã«èå³ããªãå Žåã¯ãæè¡ãã¥ãŒã¹ãTwitterã§ãããäžç¶ã§ããããã«ã倧声ã§èšã£ãŠãã ãã
èšèªã®èšèšæ¹æ³ã«ã€ããŠã¯éåžžã«æ確ã§ãhttps://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals ; ç®æšã§ã¯ãªããã³ããŒã¯ã³ã¯ããã®ææ¡ãæ£ç¢ºã«ç©èªã£ãŠããŸãã
ããã§å€ãã®ã³ã¡ã³ããèªãã åŸã®ç§ã®å人çãªåå¿ã¯ãä»ã®èšèªã«ååšããæ§é ã«ãã匷ããã€ã¢ã¹å¹æããããšããããšã§ãã çœçŽã®ç¶æ ã®èŠ³ç¹ããããã«ã¢ãããŒããããšãæ³åã§ããè¡åãæ°åãããŸãããTypeScriptã«ã¯å°ããªãµãã»ãããããããŸããã
ã¡ãœããã«é©çšããã掟çã¡ãœãããã¹ãŒããŒhttps://github.com/Microsoft/TypeScript/issues/21388ãä»ããŠãããåŒã³åºãããã«åŒ·å¶ãããããŒã¯ãŒããç°¡åã«æ³åã§ã
ã§ã¯ããããå®è£ ããããšãæ€èšããé©åãªçç±ã¯äœã§ããããïŒ
ãã£ãŒãããã¯ãèŠããšã次ã®ãããªåŒ·åãªèæ ®äºé ããããŸãã
ãã®JavaScriptã©ã€ãã©ãªã®åäœãé©åã«è¡šçŸã§ããŸãã
ç§ã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸãããããã®ïŒåŸ®åŠãªïŒãšã©ãŒããã£ããããå®éã«ã¯ã³ã³ãã€ã«ãããã¹ãã§ã¯ãããŸãã
ãã®ã³ãŒãã®æå³ã¯ãåã·ã¹ãã ã«ãã£ãŠé©åã«äŒéãããŠããŸãã
finalã¯ãããã«ãããããŸãããããã®é¢æ°ã2åç¶ããŠåŒã³åºãããšã¯ã§ããŸããããŸãã¯ããã®ã¯ã©ã¹ã®æ§ç¯ã¯æ¬¡ã®éåæãã£ãã¯ãŸã§å®éã«ã¯çµäºããŸããããšãã修食åãåæ§ã§ãã æ³åã§ãããã¹ãŠã®ãã®ãååšããå¿ èŠã¯ãããŸããããå®éã«ã¯ãµãã¯ã©ã¹åã§ããªãã¯ã©ã¹ããç¶æ¿ããããšããããããããã°ã«äœæéãè²»ãããããªã©ã®ãã£ãŒãããã¯ã¯èŠãããšããããŸãããå®éã«ã¯æ³åã§ããªãããããã¯ããããæ£ããããªã¬ãŒããããšèª°ããèšã£ãŠããŸãã 修食åãååšãããšããŠããã¯ã©ã¹ãæçµçãªãã®ã§ãããã©ãããã©ã€ãã©ãªãææžåããªããããå®éã«ã¯ç¶æ³ãæ¹åããŸãããããšãã°ãfs.FSwatcher https://nodejs.org/api/fs.html#fs_class_fs_fswatcher final ïŒ ããŒãã®äœè ã§ããç¥ããªãããã§ãã ãããã£ãŠãäœæè ãæçµã§ããããšãããã£ãŠããå Žåã¯æçµã§ååã§ãããããã¯é¢ä¿ãªãææžåãããŸããæçµããªãå Žåã¯ãã©ã¡ãã®æ¹æ³ã§ãããããªãããšãå€ããããå®éã«ã¯äœãããããŸããã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHub https://github.com/Microsoft/TypeScript/issues/8306#issuecomment-458268725ã§è¡šç€ºããããã¹ã¬ããããã¥ãŒãããŸãhttps://github.com/notifications/unsubscribe-auth/AA3NA4o9wu54CcJyK1C8WHVjXIQwfmsUks5vH1A8gaJpZ
ãããè°è«ã¯ä»ãšãŠãæ¡æ£ããŠããŸãã IntelliJ / webstormã®åé¡ã«äœ¿çšããããããªãæ祚ã§ãããã©ãã«ãŒã§ãããã®åé¡ã確èªããããšæããŸãã ã¯ã©ã¹ãã¡ãœããã®final
ãèŠãã人ã®å®éã®æ°ãååŸããŸãã
ãã¡ã€ãã«ã¯ãšãŠã圹ã«ç«ã¡ãŸã
æœè±¡ããŒã¯ãŒãã¯ããã£ãŒã«ãããªãŒããŒã©ã€ãããå¿ èŠãããããšãããã°ã©ããŒã«æãåºãããããã«äœ¿çšãããŸãã ãªãŒããŒã©ã€ãããªãããã«æ³šæãä¿ãããŒã¯ãŒããåæ§ã«åœ¹ç«ã¡ãŸãã
æçµçãªã¡ãœããã¯ãã³ãŒããããæ§é åããã³/ãŸãã¯å®å šã«ããããã«éèŠã«ãªãå¯èœæ§ããããŸãã
ããšãã°ããµãŒãããŒãã£ã®ãã©ã°ã€ã³ããµããŒãããã¢ããªã±ãŒã·ã§ã³ããããšããŸãã ãã¹ãŠã®ãã©ã°ã€ã³ã«ãäœæããå¿ èŠã®ããã¡ãœããã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããæäœã®é åºãå¶åŸ¡ããæäœéã«ããã¯ãå®è£ ã§ããããã«ããããã€ãã®æçµã¡ãœãããå«ãæœè±¡ã¯ã©ã¹ãæ¡åŒµããããã«åŒ·å¶ã§ããŸãã ãã®ãããã¢ããªã±ãŒã·ã§ã³ã¯åã ã®ãã©ã°ã€ã³ã®è©³çŽ°ãèªèããå¿ èŠã¯ãªãããã®å éšç¶æ ã®äžéšãèªèããŠããå¿ èŠããããŸãã
æçµçãªã¡ãœããããªããšãæäœã®é åºãå¶åŸ¡ããé¢æ°ã«å¹²æžããå¯èœæ§ããããŸãã ã¢ããªã±ãŒã·ã§ã³å ã§ãã°ããšã¯ã¹ããã€ãããŸãã¯ãã®ä»ã®äºæããªãåäœãåŒãèµ·ããå¯èœæ§ããããŸãã ã»ãšãã©ã®ç¶æ³ã«ã¯äœããã®åé¿çããããŸããããããã®åé¿çã¯è€éã§å埩çã§ãããå Žåã«ãã£ãŠã¯ä¿¡é Œæ§ãäœãå¯èœæ§ããããŸãã äžæ¹ãfinalã¡ãœããã¯ãã¡ãœãããå®çŸ©ãããŠããå Žåãããã1ã€ã®åçŽãªãœãªã¥ãŒã·ã§ã³ã«ããŸãã
ãŸãããã®äŸã¯ãã©ã°ã€ã³ã«åºæã§ãããä»ã®ç¶æ³ã«ãé©çšã§ããŸãã ïŒããŒã ã®æ°ããéçºè ãç¹å®ã®ããžãã¯ãã¹ã³ãŒãå€ã§å®è¡ãããªãããã«ãããã³ãŒãã®å®è¡æ¹æ³ãæšæºåãããã»ãã¥ãªãã£ããŒã¹ã®ã¡ãœãããå€æŽãããªãããã«ãããªã©ããã¹ãŠãããããæ©æµãåããå¯èœæ§ããããŸãïŒ
@RyanCavanaugh finalãå¿
èŠãªrenderïŒïŒã®è¯ãäŸã¯ãããŸããããªãŒãã³ã¯ããŒãºã®ååã«ã€ããŠã¯èª°ãèšåããŠããŸããïŒçŸåšã¯SOLIDã®äžéšãšããŠ2äœã«ãªã£ãŠããŸãïŒã
ä»ã®äººã䜿çšãããã¬ãŒã ã¯ãŒã¯ãäœæããã«ã¯ãããã圹ç«ã¡ãŸãã
ããã§ãªãå ŽåãTypescriptã§ãªãŒãã³ã¯ããŒãºã¢ãããŒããæ¡çšããããã®å¥œãŸããã¢ãããŒãã¯äœã§ããïŒ
ç§ã¯ã¡ãœããã«final
ã倧奜ãã§ãïŒãããŠç§ã¯äžè¬çã«ããããã£ãšå®£èšãæ³å®ããŠããŸãïŒã ããã¯æ¬åœã®åé¡ãåŒãèµ·ãããŠããŸã-人ã
ã¯èª€ã£ãŠç©äºãäžæžããç¶ãããã®äžã«äœããããããšã«æ°ã¥ããŠããŸãã...ç©äºãå£ããŸã...
ãŸããfinalã¡ãœããã¯éåžžã«äŸ¡å€ããããšæããŸããä»ã®äººãææããŠããããã«ãå察ã®è°è«ã¯ãã¹ãŠæçµã¯ã©ã¹ã«çŠç¹ãåœãŠãŠããããã§ãã å¥ã®åé¡ïŒïŒ9264ïŒããããŸãããããã®åé¡ããããã«ããŒããŠããããã§ãããããã¯ããŒãºãããŸããããå®éã«ã¯ããã§ã¯ãªããšæããŸãã ãã®åé¡ãå床éãããããã§é©åã«å¯ŸåŠã§ããŸããïŒ
ç§ã®ç¶æ³ã¯@ 0815foxã«äŒŒãŠã
ãã®æ©èœãæ¯æããã³ãã¥ããã£ã®å§åçãªæ¯æã«ãããããããTypeScriptéçºè ã«ãã£ãŠãŸã æåŠãããŠããã®ã¯å°æããŠãããšæããŸã...
ããããã¹ãããã®ã£ããã¯ãTS-Docã«æšæºãè¿œå ããããšã§ããã誰ããç¹å®ã®ã¯ã©ã¹ãç¶æ¿ããããç¹å®ã®ã¡ãœããããªãŒããŒã©ã€ããããããªãããã«ã¢ããã€ã¹ãããŸãã @final
泚éãªã©ã®ããã«ã
ããŠããæçµãã«æ祚ããä»ã®ãã¹ãŠã®äººãèšã£ãããšã«äœãè¿œå ããã°ããã®ã§ãããã...ãããç§ã®æ祚ã§ãã
åæããŸããã 確ãã«ãé¢æ°åã®ããããã£ã®ããã«æ±ãå Žåã¯ãã¡ãœããã§readonly
ã䜿çšã§ããŸããããã®åé¿çã¯ããªãæ··ä¹±ããå¯èœæ§ããããŸãã ãã®åé¡ã®ãã€ãã£ããœãªã¥ãŒã·ã§ã³ãããã°ããã®ã«ãšæããŸãã
final
ãç¹ã«final method
ã¯ããã³ãã¬ãŒããã¿ãŒã³ãä»ã®ãã¶ã€ã³ãã¿ãŒã³ã§åŒã³åºãããã¡ãœããã®é åºãä¿èšŒããã¡ãœããã®ã¯ãŒã¯ãããŒãå¶åŸ¡ããããšãå€ããããåãã§ãã¯ã§ã¯éèŠã ãšæããŸãã
final
ã¯è¡ãæ¹æ³ã§ãªããã°ãªããŸãã
ã®ã£ã³ã°ã¯- ïŒïŒãã®ãã±ãããããã®ã§ãéããããã³ïŒbïŒã¯ãç§ã¯æ°ãããã±ãããäœæããããšã決ããè°è«ã¯ãåã«æçµçãªæ¹æ³ã«çŠç¹ãåœãŠããæåŸã®æ¹æ³ãã«ã€ããŠèª€è§£ãæãã¿ã€ãã«ãæã£ãŠããŸãã ããŸãããã°ãããã¯ç¡èŠããã®ãé£ãããªããããçšåºŠã®é²æ©ãåºæ¿ãããããããŸããã ããããã httpsïŒ//github.com/microsoft/TypeScript/issues/33446ãåç §ããŠ
@RyanCavanaugh
è€éãvsããªã¥ãŒããŒ
final
äœããããªã«è€éãªã®ãã詳ããæããŠããã ããŸããïŒ ç¹ã«abstract
ãªã©ã®ããŒã¯ãŒãããã§ã«å®è£
ãããŠãããããããå€ãã®ããžãã¯/ã³ãŒããåå©çšã§ããããšãèãããšãå®è£
ãæãç°¡åãªããŒã¯ãŒãã®1ã€ã§ããããã«ç§ã«ã¯æããŸãã
@vinayluzrao
ã©ã³ãã ãªäŸãšããŠãçŸåšãæ§æã·ã°ããã£ãæã€ãã®ããç¶æ¿ã§ãããšèšã£ãŠããŸãã
// OK
declare const SomeParent: new() => { a: string };
class A extends SomeParent { }
æããã«ã final
ã¯ã©ã¹ã¯new
ã§ãïŒ
function make<T>(ctor: new() => T) {
return ctor;
}
final class Done {
}
// No problem
const d = make(Done); // d: Done
ããããä»ã§ã¯ççŸããããŸãã new
ã«å¯Ÿå¿ã§ãããã®ããããŸããã extends
å¥ãæ¿å
¥ããããšã¯åæ³ã§ã¯ãããŸããã ãããã£ãŠã1ã¬ãã«ã®éæ¥final
ã¯
function subvertFinal(ctor: new() => any) {
class Mwhahaah extends ctor {
constructor() {
super();
console.log("I extended a final class! So much for 'types'!")
}
}
}
final class Done {
}
subvertFinal(Done);
ããã¯ãã§ã«äººã
ãabstract
ã«ã€ãŸãããã人ã
ã¯abstract
ã¯ã©ã¹ã«ã¯åãã§ãã¯ã®ç®çã§ååšããããå®éã«ã¯åŒã³åºããªããããªæé»ã®æ§æ眲åãå¿
èŠã§ãããšåžžã«äž»åŒµããŠããŸãã
åèãŸã§ã«ããããã®è°è«ã§ãè€éãããšèšããšãã®90ïŒ ã¯ã TypeScriptã®ãŠãŒã¶ãŒãçµéšããéåžžã«è€éã§ãïŒã æŠå¿µã®è€éãã¯ãããå€ãã®ããè³¢ããšã³ãžãã¢ã補åã«æå ¥ããããšã§å¯ŸåŠã§ãããã®ã§ã¯ãããŸããã äºæããªãããŸãã¯èª¬æãé£ããåäœãåŒãèµ·ããäœããèšèªã«è¿œå ãããã³ã«ãããã¯èšèªã®ãã¹ãŠã®ãŠãŒã¶ãŒã®ç²Ÿç¥çãªè² æ ã«ãªããŸãã
ã¡ãœããã®finalãå¿ èŠãªã®ã¯ãæ¯èŒçå®æçã«ã誰ãããã®äžã®ã¡ãœãããïŒç¥ããªããã¡ã«ïŒãªãŒããŒã©ã€ããããããã³ãŒããå®è¡ããããéåžžã«å¥åŠãªæ¹æ³ã§åé¡ãçºçãã人ã ãçç±ãç¥ããªãããã§ããå€ãã®å Žåããããã°ã«ã¯é·ãæéãããããŸãã
æ¬åœã«ãããæ確ã«ãã@RyanCavanaugh ãããããšãã ããããç§ã¯èããæšãŠãããšæããŸãïŒããªããäžããäŸã®åé¡ã¯ã new
ãšextends
éã®åŒ·ãçµåãåå ã§çºçããŠããããã§ããããããããã¯ãã倧ããªåé¡ã§ãã final
èªäœã§ã¯ãããŸããã ãªããã®çµåã®æ±ºå®ããªãããã®ãããããŠãã®æç¹ã§ãããå
ã«æ»ãã®ã¯ã©ãã»ã©é£ããã®ã ãããïŒãŸã£ããå
ã«æ»ãå¿
èŠãããããšãæå³ããããã§ã¯ãªãïŒã
ãããããããããŸãã«ãæ¥ç·çãªè°è«ã§ãããããã§è°è«ããããšãã§ããªããã©ããã¯ããããŸããã
ããã¯ç§ãééããåé¡ã§ãã ãã®ãããªåçŽãªã³ãŒããµã³ãã«ã¯ã³ã³ãã€ã«ã§ããŸããã
final
ããŒã¯ãŒãã¯ãããå®å
šã«è§£æ±ºããŸãïŒ
abstract class Parent {
public abstract method(): this;
}
class Child extends Parent {
public method(): this {
return new Child();
}
}
ã¿ã€ããåãã¯ã¿ã€ãããããã«å²ãåœãŠãããšãã§ããŸããã
'Child'ã¯ã¿ã€ã 'this'ã®å¶çŽã«å²ãåœãŠãããšãã§ããŸããã 'this'ã¯å¶çŽ 'Child'ã®ç°ãªããµãã¿ã€ãã§ã€ã³ã¹ã¿ã³ã¹åã§ããŸãã
ãããåéã§ããŸããïŒ ãã®æ©èœãå¿ èŠãªããšã¯æããã§ã
ç§ãã¡ã¯ãã®åé¡ã«ã€ããŠããŸããŸãªäŒè°ã§çŽ12åè°è«ãããã®ãã³ã«å察ããããšã決å®ããŸããã ãããåéããŠ13åç®ã®è°è«ãããããšã¯ãç§ãã¡ã®æéãããŸãå©çšããããšã§ã¯ãããŸããã
TypeScriptããŒã ã®æ±ºå®ã«å察ããããšã¯ã§ããŸãããããã¯åé¡ãããŸãããã人ã ãå察ãã決å®ãå決å®ããããšã¯ã§ããŸããã ãã®ãªããžããªã«ã¯ãæåéãããã®ãªããžããªãåã³åãäžããããåã«æåã«æ€èšãã䟡å€ã®ãã1000ã®ææ¡ããããŸãã
@ nicky1038ã®ã³ã¡ã³ãã®ãããªå»ºèšçãªè°è«ã¯ããã§å€§æè¿ã§ãã ãã®ã¹ã¬ãããããã¯ããå¿ èŠããªãããã«ããã¥ãŒã¹/åæ€èšã®ãªã¯ãšã¹ãã«ã€ããŠãã®ã¹ã¬ããã«ç¶ç¶çã«pingãéä¿¡ããªãããã«ãé¡ãããŸãã
ã¡ãœããã®finalã®è¿œå ããµããŒãããããã«ããã«ããŸãã ãµãã¯ã©ã¹ããªãŒããŒã©ã€ãã§ããªãããã«ãã_init_ãšããé¢æ°ãæã€åºæ¬ã¯ã©ã¹ããããŸãã ãã¡ã€ãã«ã¯å®ç§ãªè§£æ±ºçã«ãªãã§ãããã
ã¡ãœããã«final
ããŒã¯ãŒããè¿œå ããããšããµããŒãããŠããŸãã
ä»æ¥ã§ã¯ãããã¯ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®æšæºã§ãã
final
ãè¿œå ããããšã¯ç§ã«ã¯çã«ããªã£ãŠããŸãã ç¹ã«ãä»ã®äººã䜿çšã§ããããã«ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯ãæ§ç¯ããå Žåãé¢æ°ããªãŒããŒã©ã€ããããªã¹ã¯ãã蚱容ããããªãå Žåã
ééãããªããã°ã final
è¿œå ãããšããžã§ããªãã¯ãæäœãããšãã«'myObj' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'MyClass'
ãšã©ãŒãçºçããæéãçãããšãã§ããŸããããã¯ã MyClass
final
ãäœæã§ãããããããã§ä¿èšŒã§ããããã§ããä»ã®ãµãã¿ã€ãã§ã¯ãããŸããã
100ïŒ
確å®ã§ã¯ãããŸããããJavaã§ãã®åé¡ã解決ããæ¹æ³ã¯ããã ãšæããŸãã
åããã®ããããŸããä»ã®å€ãã®ããã±ãŒãžãããŒã¹ãšããŠæ¡åŒµã§ããããŸãã¯æ¡åŒµããå¿
èŠãããè§åºŠã®ããŒã¹ã³ã³ããŒãã³ããäœæããŠããŸãã
ngOnChangesãangularã®ngOnInitã®ãããªãã®ããããåºæ¬ã¯ã©ã¹ã®ã¿ãå®è£
ããå¿
èŠãããããµãã¯ã©ã¹ã¯ãããããªãŒããŒã©ã€ãããã¹ãã§ã¯ãããŸããããå®éã«ã¯ngOnInitRealïŒãŸãã¯ãããåŒã³åºããã®ïŒãå®è£
ããããããããåŒã³åºããããšãã«å®å
šã«å¶åŸ¡ã§ããŸãããã®ã«ãã£ãŠã
ãããå¶åŸ¡ããããšã¯ã§ããªãã®ã§ãææžåã«ãã£ãŠã®ã¿ãããè¡ãããšãã§ããŸãã ããã³ã³ããŒãã³ãã¡ãŒã«ãŒããããèªãŸãªããšããã®ã³ã³ããŒãã³ããå£ããããåãããšãããããã«ããŒã¹ããå€ãã®ã³ãŒããã³ããŒããå¿
èŠããããŸãã
ãããã£ãŠãæçµçãªæ¹æ³ããªããã°ãå å®ãªAPIå¥çŽãçµã¶ããšã¯ã§ããŸããã
誰ããèšåããŸããã
class Fancy {
readonly secureFoo = (message: string) => {
console.log(message);
}
}
誰ããèšåããŸããã
class Fancy { readonly secureFoo = (message: string) => { console.log(message); } }
ãããè¡ãããšã¯ã§ããŸãããããã€ãã®éãããããŸãã ããšãã°ã誰ãã䜿çšããé¢æ°ãæã€ãããã¿ã€ãã ãã§ã¯ãªããã¯ã©ã¹ã®åã€ã³ã¹ã¿ã³ã¹ã«ã¯é¢æ°ã®ç¬èªã®ã³ããŒããããŸãã
æãåèã«ãªãã³ã¡ã³ã
ã¡ãœããã«ã¯
final
修食åãå¿ èŠã§ããããšãã°ãfooItããªãŒããŒã©ã€ããããã®ãç·æ¥ã«åé¿ãããå Žåã¯ã次ã®ãã¿ãŒã³ããã䜿çšããŸãã