ããã«ã¡ã¯ï¼ããããªã³ã¦ã¨ãã£ã³ã°ãéçºãã¼ã ã®æ»å£(@ytakiguche)ã§ããæ®æ®µã¯ãµã¼ãã¼ãµã¤ãéçºãæ å½ãã¦ãã¾ãã
ç§ãã¡ã®ãã¼ã ã¯ç¾å¨ããªã³ãã¬ãã¹ã§é·å¹´ç¨¼åãã¦ãã PHP ã®ã·ã¹ãã ãAWSã¯ã©ã¦ãã¸ç§»è¡ããåæã« TypeScript ã§å ¨é¢çã«æ¸ãæããã¨ããã大ããªææ¦ã®çã£åªä¸ã«ãã¾ãã
ãã®è¨äºã§ã¯ãããã³ãã¨ã³ãã¨ããã¯ã¨ã³ãã®è¨èªçµ±ä¸ãããã¼ãã«ããã®éç¨ã§æç¢ºã«ãªã£ãæè¡ç課é¡ã¨ããããã«å¯¾ããæã ã®ã¢ããã¼ãã«ã¤ãã¦ã話ããã¾ãã
ç®æ¬¡
- ç®æ¬¡
- ããã¸ã§ã¯ãã®èæ¯ï¼ ãªããPHP ãã TypeScript ã¸ç§»è¡ããã®ã
- TypeScript 対å¿ã¨ã¢ãã¬ãå
- ããã¸ã§ã¯ãã§ç´é¢ãã課é¡
- 課é¡ã¸ã®ã¢ããã¼ã
- ã¾ã¨ãã¨ä»å¾ã®å±æ
ããã¸ã§ã¯ãã®èæ¯ï¼ ãªããPHP ãã TypeScript ã¸ç§»è¡ããã®ã
ããããªã³ã¦ã¨ãã£ã³ã°ãã¯ãçµå©å¼å ´æ¢ãããäºæ¬¡ä¼ãè¨å¿µæ¥ã¾ã§ããµãã¼ããããæ´å²ãããµã¼ãã¹ã§ãããã®è£å´ã§ã¯ãé·å¹´ã®æ¹ä¿®ãéãã PHP ã·ã¹ãã ãè¤éåããããã¤ãã®å¤§ããªèª²é¡ã«ç´é¢ãã¦ãã¾ããã
åæ´»ç¨ãä¸ååãªã³ã¼ãåºç¤ï¼  - PHP 7/8 ã«ã¯å宣è¨ãéçè§£æãããã¾ãããæ¢åã³ã¼ããå¤ããåã®æ©æµãååã«åãããã¦ãã¾ããã§ããããã®çµæãæ¹ä¿®æã®å½±é¿ç¯å²ã®ç¹å®ããããã°ã«æéãããã£ã¦ãã¾ããã
å±äººåã¨æè¡çè² åµ:  - è¤æ°ã®è¨èªãæ··å¨ããããã¥ã¡ã³ããæ´çããã¦ããããæèè ã®ç°åãéè·ã®ãã³ã«ç¥èã失ãããã¾ãã«ãå²ãçªçè«ãã®ããã«å°ããªåé¡ã®ç©ã¿éããã·ã¹ãã å ¨ä½ã®å¥å ¨æ§ãæãªã£ã¦ãã¾ããã
éçºãªã½ã¼ã¹ã®åæã¨éå¹ç:  - éãããã¡ã³ãã¼ã§éçºã»éç¨ãè¡ãä¸ã§ãããã³ãã¨ã³ã(以ä¸FE)ã¨ããã¯ã¨ã³ã(以ä¸BE)ã®å°éæ§ãåæããã¦ãã¾ã£ããããã¿ã¹ã¯ã«å¿ããæè»ãªäººå¡é ç½®ãé£ãããéçºãªã½ã¼ã¹ãå¹ççã«æ´»ç¨ã§ãã¦ãã¾ããã§ããã
ãããã®åé¡ã解決ãããããPHP ã®ã³ã¼ãåºç¤ãæ´»ããããããTypeScript ã§æ°ãã«æ¸ãç´ããã¨ããå ¨é¢çãªåæ§ç¯ã鏿ãã¾ããã
TypeScript 対å¿ã¨ã¢ãã¬ãå
FE 㨠BE ã§ä½¿ç¨ããè¨èªã TypeScript ã«çµ±ä¸ããã¢ãã¬ãæ§æã§ç®¡çããæ¹éã¨ãã¾ããã FE éçºã§ TypeScript ãæ¨æºçã«ãªã£ã¦ããç¾ç¶ãè¸ã¾ããè¨èªçµ±ä¸ã®é¸æè¢ã¨ã㦠TypeScript ãæé©ã ã¨å¤æãã¾ããã
ãããã°ã©ã è¨èªãçµ±ä¸ããã° FE 㨠BE ã®æ å½é åãéå®ããããã¼ã å ¨ä½ã®çç£æ§åä¸ãè¦è¾¼ããã¯ãã ã
ãã®çæ³ãå®ç¾ãããããæè¡ã¹ã¿ãã¯ãå·æ°ããã¢ãã¬ãæ§æãæ¡ç¨ãã¾ããã

ããã¯ã¨ã³ãã®ãã¬ã¼ã ã¯ã¼ã¯ã«ã¯ NestJS ãã¢ãã¬ã管çãã¼ã«ã«ã¯ Turborepo ãæ¡ç¨ãã¾ããããããã社å ã§ã®æ¡ç¨å®ç¸¾ããããå®å®ããéçºåºç¤ãæ§ç¯ã§ããã¨å¤æããæ¡ç¨ã決å®ãã¾ããã
æè¡ã¹ã¿ãã¯ã¨ãã£ã¬ã¯ããªæ§æ
. âââ apps   # åã¢ããªã±ã¼ã·ã§ã³ â  âââ api   # APIãµã¼ãã¼ (NestJS) â  âââ bat   # ãããå¦ç (commander.js) â  âââ web   # Webããã³ãã¨ã³ã (Next.js) âââ infra   # ã¤ã³ãã©å®ç¾© (AWS CDK in TypeScript) âââ packages # å ±éã©ã¤ãã©ãªã»ã¢ã¸ã¥ã¼ã« âââ docs   # ããã¥ã¡ã³ãä¸å¼ (markdown)
packages ãã£ã¬ã¯ããªã«åå®ç¾©ãå ±é颿°ãé ç½®ãããã¨ã§ FE/BE éã§ã®ã³ã¼ãå ±æãä¿é²ããéçºã®å¹çåã¨å®å ¨æ§ã®åä¸ãç®æãã¾ããã
ããã¸ã§ã¯ãã§ç´é¢ãã課é¡
ããã¸ã§ã¯ããé²è¡ããä¸ã§ãããã°ã©ã è¨èªçµ±ä¸ã ãã§ã¯è§£æ±ºã§ããªãã主ã«2ã¤ã®èª²é¡ãæããã«ãªãã¾ããã
課é¡1ï¼ æ¢åãã¼ã¿ã®ä¸æ´å
æåã«ç´é¢ãã課é¡ã¯ãæ¢å DB ã®ãã¼ã¿ä¸æ´åã§ããç¹ã«ãnullable ãªã«ã©ã ã®æ±ããåé¡ã¨ãªãã¾ããã
管çç»é¢ã®ä»æ§ä¸ã¯å¿ é å ¥åã¨ãªã£ã¦ãããã£ã¼ã«ãã§ã DB å®ç¾©ã§ã¯ NULL ã許容ããã¦ããã±ã¼ã¹ã夿°åå¨ãã¾ããã TypeScript ã®å³æ ¼ãªåã«åãããä¸ã§ãã©ãã¾ã§ null ã許容ãããï¼null assertion / åã¬ã¼ã / å¿ é åï¼ã¨ããè¨è¨å¤æã¯ API ã®ã¬ã¹ãã³ã¹ä»æ§ã«ãå½±é¿ãåã¼ãé£ããåé¡ã¨ãªãã¾ããã
課é¡2ï¼ FE 㨠BE ã®ã¹ãã«ã»ããã¨è¨è¨ææ³ã®å·®ç°
ããã°ã©ã è¨èªãçµ±ä¸ãã¦ããFE/BE ããããã«æ±ããããå°éç¥èã¨è¨è¨ææ³ï¼ãã¶ã¤ã³ãã¿ã¼ã³ï¼ã¯å¤§ããç°ãªãã¾ããä¾ãã°ãFE ã§ã¯ã³ã³ãã¼ãã³ããã¼ã¹ã®è¨è¨ãç¶æ 管çãéè¦è¦ããã䏿¹ãBE ã§ã¯ãã¼ã¿ãã¼ã¹è¨è¨ã API è¨è¨ãã¤ã³ãã©æ§ç¯ãä¸å¿ã¨ãªãã¾ãã
å®éã«ããäºãã®é åã«è¸ã¿è¾¼ãã«ã¯ã以ä¸ã®ãããªã¹ãã«ã®ã£ãããããã¾ããã
- BEã¨ã³ã¸ãã¢ã«æ±ããããã¹ãã«:  - FEç¹æã®ã³ã³ãã¼ãã³ãè¨è¨ãã¹ã¿ã¤ãªã³ã°ãPHPãã¡ã¤ã³ã ã£ãã¨ã³ã¸ãã¢ã«ã¨ã£ã¦ TypeScript ã®è¨èªä»æ§ãã¨ã³ã·ã¹ãã ã¸ã®ç¿çãªã©ã  - ï¼ä¾ï¼Container/PresentationalãHooks/Composition ã¨ãã£ãFEç¹æã®è¨è¨ãã¿ã¼ã³ã®çè§£ãªã©ï¼
- FEã¨ã³ã¸ãã¢ã«æ±ããããã¹ãã«:  - BEã§æ¡ç¨ãããªããªã³ã¢ã¼ããã¯ãã£ã®çè§£ãããã¥ã¡ã³ããä¸ååãªæ¢åDBã®æ§é ãèªã¿è§£ãã¹ãã«ãCDKï¼Composite ãã¿ã¼ã³ï¼ã«ãã IaC ãªã©ã
BE ã§æ¡ç¨ãã ãªããªã³ã¢ã¼ããã¯ãã£ã¯ FE ã«ã¯é¦´æã¿ãèããéãã¾ãç¶ããäºãã®ãå½ããåããéç¨ããªãå ´é¢ãå¤ãããã¾ããã
課é¡ã¸ã®ã¢ããã¼ã
ä¸è¨ã®èª²é¡ã«å¯¾ãããã¼ã å ã§è°è«ãéãã以ä¸ã®ãããªå¯¾å¿ãåãã¾ããã
1. ãã¼ã¿ä¸æ´åã¸ã®æ®µéç対å¿
nullable åé¡ã«å¯¾ããå½åã¯åå®å ¨æ§ãéè¦ãã¦å³æ ¼ãªåã®çµãè¾¼ã¿ï¼narrowingï¼ãé©ç¨ãã¾ããããããããã¼ã¿ä¸æ´åã®ä»¶æ°ãæ³å®ä»¥ä¸ã«å¤ããéçºã®é²è¡ã妨ããè¦å ã¨ãªã£ããããæ¹éã夿´ãã¾ããã
ç¾å¨ã¯ãä¸å¾ã§ warning ãã°ãåºåãã¦å¦çãç¶ç¶ããããã¼ã¿èªä½ã®ä¿®æ£ã¯ãµã¼ãã¹éç¨ãã§ã¼ãºã§åªå 度ãä»ãã¦æ®µéçã«å¯¾å¿ãã¦ããè¨ç»ã§ãã
2. ã¹ãã«ã®ã£ããã¨æåå·®ã¸ã®å¯¾å¿
ã¹ãã«ã¨è¨è¨ææ³ã®å·®ç°ã«å¯¾ãã¦ã¯ãå¹çæ§ã¨ãã¼ã å ã§ã®ç¥èå ±æã®ãã©ã³ã¹ãèæ ®ããã¢ããã¼ããåãã¾ããã
- å¦ç¿ã¨ã¹ãã«ãã©ã³ã¹ãã¡ã¼:  - ããã¸ã§ã¯ãåæã«ã¯ãBE ã¨ã³ã¸ãã¢ã Udemy ãªã©ãæ´»ç¨ã㦠TypeScript ã®ãã£ããã¢ãããè¡ãã¾ãããã¾ã FE ã¨ã³ã¸ãã¢ãç°¡å㪠API ã IaC ãå®è£ ããã¨ãã¨ã§ããã¯ã¨ã³ãã¸ã®çè§£ãæ·±ãã¾ããã
- è¨è¨ã®æ¨æºå:  - BE ã®ãã£ã¬ã¯ããªæ§æã¯ package-by-feature ãåºæ¬ã¨ãã¤ã¤ããã¼ã¿ã¢ã¯ã»ã¹å±¤ãåé¢ããããªãã¸ããªãã¿ã¼ã³ããå°å ¥ãããã¨ã§ã両è ã®è¨è¨ææ³ã®å©ç¹ãçµã¿åãããæ§æã¨ãã¾ããã
- æè»ãªã¿ã¹ã¯ã¢ãµã¤ã³:  - å¤§è¦æ¨¡ãªæ©è½éçºã¯ãå¹çãåªå ãã¦å¾æ¥ã®è·è½ï¼FE/BEï¼ã«åºã¥ãæ å½è ãæ±ºå®ãã¾ããã䏿¹ã§ããã¹ãå·¥ç¨ã§ã®è»½å¾®ãªä¿®æ£ãªã©ã¯ãæå³çã«æ å½é åãã¾ããå½¢ã§ã¢ãµã¤ã³ããç¸äºã®ã³ã¼ãçè§£ãä¿é²ããæ©ä¼ãè¨ãã¦ãã¾ãã
FE/BE ã§åããããã¼ã ã§ã¯ãªããããã¾ã§ä¸ã¤ã®ãã¼ã ã§ããã ããããããã¹ã¦ãæ··ãåãããã®ã§ã¯ãªãããäºãã®å¼·ã¿ãæ´»ãããªãããç¾å®çãªæ¹æ³ã§ååä½å¶ãç¯ãã¦ãããã¨ãç®æãã¾ããã
ã¾ã¨ãã¨ä»å¾ã®å±æ
ãTypeScriptã«è¨èªãçµ±ä¸ããã°ãFEã¨BEã®æ å½é åã®å£ã¯ãªããªãã®ãï¼ãã¨ããåãã«å¯¾ããç¾æç¹ã§ã®çµè«ã¯ããªããªããªããã忥ã¯ããåæ»ã«ãªããã§ãã
è¨èªçµ±ä¸ã¯ãå ¨ã¦ã®åé¡ã解決ãããéã®å¼¾ä¸¸ãã§ã¯ããã¾ããã§ããããããããã¼ã å ã®ã³ãã¥ãã±ã¼ã·ã§ã³ãæ´»æ§åãããã³ã¼ãã®ç¸äºã¬ãã¥ã¼ã容æã«ãããªã©ããããã¯ãéçºã®å質ã¨é度ãåä¸ãããä¸ã§æå¹ãªææ®µã§ãããã¨ã¯ééãããã¾ããã
ããã¸ã§ã¯ãå®äºå¾ã¯ããªãã¸ããªãä¸ã¤ã«éç´ããããã¨ã§ãå½±é¿èª¿æ»ã®å·¥æ°ãå¤§å¹ ã«åæ¸ãããæ°ã¡ã³ãã¼ã®å¦ç¿ã³ã¹ãã使¸ããããã¨ãæå¾ ããã¾ããããã«ãããããè¿ éãªæ©è½éçºã¨ãªãªã¼ã¹ãå¯è½ã«ãªãã¨èãã¦ãã¾ãã
