æè©ã®çŽ¹ä»
äžè¬ã«ãããã¯ãšã³ããšããã³ããšã³ãã.NETã¹ã¿ãã¯ã«ç·å¯ã«çµ±åãããšããã¢ã€ãã¢ã«é·ãé匷ãæåŸ ããŠããããã®çµæãJavaScriptã§CïŒãããã©ã³ã¹ã¬ãŒã¿ãŒå šäœãäœæããããšããããšãããããŸããã çµæãåŸãããªãã£ããšã¯èšããŸãã-ç§ã®ç¿»èš³è ã¯ããã€ãã®CïŒã¯ã©ã¹ãJavaScriptã«æ£åžžã«å€æããæçµçã«äžæãããã¢ãã¡ãŒã·ã§ã³ãšã¢ãŒããã¯ãã£ãåèããŸããã ãã€ã圌ã«æ»ã£ãŠããŸãã å¿ é ã§ãã
ããããããã«ããããããããããžã§ã¯ãã®çŸåšã®ã¿ã¹ã¯ãäœããã®åœ¢ã§è§£æ±ºããå¿ èŠããããŸããã ãããŠãã»ãšãã©ãã¹ãŠã®Webãããžã§ã¯ãã§ã®çŸåšã®ã¿ã¹ã¯ã¯ãäžè¬çã«éåžžã«å žåçãªãã®ã§ãããéå±ãšããèšèãæããŠããŸããã ä»ãç§ã¯ããªãã®èš±å¯ãåŸãŠãAutomapperã®äœ¿çšãIoCã³ã³ããã®åéãEF / NH /äœãã䜿çšããããŒã¿ããŒã¹ã§ã®ãããããªã©ãããããçš®é¡ã®è€éãªãã®ããæœè±¡åããããã³ããšã³ãã«è¿ã¥ããŸãã ãã®ãããããã¯ãšã³ããšããã³ããšã³ãã®æ¥åéšã«ã¯ãå€ãã®éå±ã§å žåçãªã¿ã¹ã¯ïŒç®èïŒããããŸãã å ·äœçã«ã¯ãããŒã¿ãå«ãJSONã®ãµãŒããŒãžã®ãªã¯ãšã¹ãããã®è¡šç€ºãããã³AJAXã«ããããŸããŸãªæäœã®ããã©ãŒãã³ã¹ã Reinforced.TypingsïŒããã¯ãŸãã«ç§ã®ã¡ãã£ãšããå©ããšåŒãã§ããŸãïŒã¯ããã®æé»ã®çåœã«ã¡ãã£ãšãã楜ãããå žåçãªã¿ã¹ã¯ã®ç°¡çŽ åãå®åã³ãŒãã®åé€ããããŠããå°ãã®äžè²«æ§ããããããŸãã
MicrosoftãTypeScriptãæäŸããŠä»¥æ¥ãã¯ã©ã€ã¢ã³ãåŽã®JavaScriptã®èšè¿°ã¯ãã£ãšå¿«é©ã«ãªããŸããã TypeScriptã¯ããããæ¬ ããŠããå Žæã«ã¿ã€ãã³ã°ãšã³ã³ãã€ã«ã®æèŠããããããŸããã ãŸã è©ŠããŠããªãå Žåã¯ãå¿ ãè©ŠããŠãã ããïŒããã¯åºåã§ã¯ãããŸããïŒã ãã¡ãããç¹å®ã®ãããžã§ã¯ãã®TypeScriptã®ãååšãããããªãããã®åé¡ã«ã€ããŠå€ãã®ããšãè°è«ããããšã¯ã§ããŸãããè°è«ãçç¥ããŠã-身äœã«è¿ã¥ããŸãããïŒ-Guy de Maupassantãèšã£ãããã«ãã«é²ã¿ãŸãããã
å®çšäŸ
ãã®ãããã·ã³ãã«ã ãããªãäžè¬çãªäŸãèããŠã¿ãŸãããããµãŒããŒã«ãªã¯ãšã¹ããè¡ãã泚æã«é¢ããæ å ±ãååŸããŠããã©ãŠã¶ã®ããŒãžã«äœããã®æ¹æ³ã§è¡šç€ºããå¿ èŠããããŸãã
ãã®åé¡ã解決ããããã«éåžžäœãããŸããïŒ ããã ãã POCO泚æã¢ãã«ãšãJSONã§ã©ãããããã€ã³ã¹ã¿ã³ã¹ãè¿ãã³ã³ãããŒã©ãŒã¡ãœãããå®è¡ããŸãã ããã«ãç§ãã¡ã®ããŒããŒãããŸãïŒãåãã®ãšãããäœåãªã³ãŒããåé€ããŠã¹ããŒã¹ãç¯çŽããŸãïŒïŒ
ã¢ãã«
public class OrderViewModel { public string ItemName { get; set; } public int Quantity { get; set; } public decimal Subtotal { get; set; } public bool IsPaid { get; set; } public string ClientName { get; set; } public string Address { get; set; } }
ã³ã³ãããŒã©ãŒæ¹åŒ
public ActionResult GetOrder(int orderId) { var orderVm = new OrderViewModel() { // ... ... }; return Json(orderVm, JsonRequestBehavior.AllowGet); }
ããã§ã¯ãã¹ãŠãå€ããå°ãªããæ確ã§ãããã³ã¡ã³ãã¯äžèŠã ãšæããŸãã ã¯ã©ã€ã¢ã³ãã«åãæ¿ããŸãããã éåžžã«æ確ã«ããããã«ãajaxãªã¯ãšã¹ãã«jQueryã䜿çšããŸãããå¿ èŠã«å¿ããŠjQueryãç¬èªã®ãã®ã«çœ®ãæããããšãã§ããŸãã åãšåãããã«ãåé·ãªã°ã«ãŒã³ãŒããçç¥ãããã¥ãŒãTypeScriptãã¡ã€ã«ãäœæããããŒãžã«æ¥ç¶ããNuGetããjQueryãã€ã³ã¹ããŒã«ããŸããããã¯ç§ãªãã§å®è¡ã§ããŸãã ç§ã¯ãã®æ¬è³ªã匷調ããŸãïŒãã®TypeScriptã³ãŒããããäžåºŠæãåºããŸãïŒïŒ
TypeScriptã³ãŒã
private btnRequest_click() { $.ajax({ url: '/Home/GetOrder?orderId=10', success:this.handleResponse }); } private handleResponse(data: any) { var text = `${data.ClientName}, ${data.Address} (${data.ItemName}, ${data.Quantity})`; $('#divInfo').text(text); }
ããã§ãã¹ãŠãé 調ã§ãã åºæ¬çã«JavaScriptãé€ããŠããã®æ§é ã¯åãã§ãã ãµãŒããŒããJSONã®äžéšãååŸããŸãããã®ãªããžã§ã¯ãã§ã¯ãClientNameãAddressããã®ä»ã®ãã£ãŒã«ãããããšããäºå®ã«äŸåããŠãdivã«è¡šç€ºããŸãã ããŸãå®å®ããŠããŸããã äžå¹žãªãžã¥ãã¢ãViewModelããã³CïŒã³ãŒãããClientNameãã£ãŒã«ããåé€ããå ŽåïŒãŸãã¯ãžã¥ãã¢ãªãã¡ã¯ã¿ãªã³ã°ã®ããã«ååãå€æŽããå ŽåïŒããã®ãããªæ§æã䜿çšãããããã³ããšã³ãäžã®ãã¹ãŠã®å Žæãèµ·çè£ çœ®ã«ãªããåŸ æ©ããŸããã¹ã¿ãŒã®å°çã ããŠããŸãã¯ãšã³ããŠãŒã¶ãŒããããŠèª°ãããšãŠã幞éã«ãªããŸãã ã©ãããïŒ çãã¯æããã§ããTypeScriptã䜿çšããŠããããããã®ç¹å®ã®ViewModelã®ããããèšè¿°ããŠã次ã®ããã«ã³ãŒããæžãæããããšãã§ããŸãã
private handleResponse(data: IOrderViewModel) { var text = `${data.ClientName}, ${data.Address} (${data.ItemName}, ${data.Quantity})`; $('#divInfo').text(text); }
ã¯ããä»ã§ã¯ããå¿«é©ã«ãªããŸãã-宣èšãããŠããªããã£ãŒã«ããžã®ã¢ã¯ã»ã¹ã«å¯ŸããŠä¿éºããããŸããã ãããããã£ãŒã«ãã®ååãå人çã«å€æŽããåŸèŒ©ã®ç¶æ³ã§ã¯ãç§ã¯å¹³åã«ç ãããšãã§ããŸããã ã¯ãããã¹ãŠã®ViewModelã®ã¿ã€ãã³ã°ãèšè¿°ããŸã...æã§...å€ã«...ãããŠããããžã§ã¯ãã«äœçŸäººãããå Žåã¯ïŒ ãããŠããäœåïŒ ççŽã«èšã£ãŠãèŠéãã¯ãŸããŸãã§ãã
ãããReinforced.Typingsã®åºçªã§ãããåââé¡ã®è§£æ±ºçã¯æ ¹æ¬çã«ç°ãªãæ¹æ³ã§å§ãŸããŸãã ããã§ãPMã³ã³ãœãŒã«ãéãïŒãŸãããŸãã¯èª°ã«ãšã£ãŠã䟿å©ã§ã-ã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãããè¡ãããšãã§ããŸãïŒãèšå®ããŸãã
PM > Install-Package Reinforced.Typings
ãããžã§ã¯ãã®ã«ãŒãã«æ°ãããã¡ã€ã«Reinforced.Typings.settings.xmlããããŸãã ããã¯ååã«è©³çŽ°ã«ææžåãããŠãããããã«èšèŒãããŠãããã¹ãŠãæžãçŽãããšã¯éèŠã§ã¯ãããŸããïŒãã¡ãã
<RtTargetFile>$(ProjectDir)Scripts\app\Server.ts</RtTargetFile>
ãã®åŸãmodelkaã®ã³ãŒãã«ç§»åããReinforced.Typings.Attributesãšmodelkaã®ã¯ã©ã¹èªäœã®äžã®[TsInterface]å±æ§ã䜿çšããŠã2è¡ã®ã³ãŒãã®ã¿ãè¿œå ããŸãã ãã®ãããªãã®ïŒ
using Reinforced.Typings.Attributes; [TsInterface] public class OrderViewModel { // }
ãã®åŸããããžã§ã¯ããåæ§ç¯ïŒåæ§ç¯ïŒããServer.tsã®æ§æã«åŸã£ãŠçæãããScripts \ app \ã«æåã§è¿œå ããŸãã æå®ããããã©ã«ããŒã«æ¢ã«ãããŸã-åã«ãããžã§ã¯ãã«è¿œå ãããŠããŸããã Server.tsãéããŠããã®äžèº«ãèŠãŠã¿ãŸãããã
Server.tsã³ã³ãã³ã
// This code was generated by a Reinforced.Typings tool. // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. module Reinforced.Typings.Samples.Simple.Quickstart.Models { export interface IOrderViewModel { ItemName: string; Quantity: number; Subtotal: number; IsPaid: boolean; ClientName: string; Address: string; } }
èŠããŸããïŒ çŽ æŽãããã ãããžã§ã¯ãå šäœã®ViewModelã®ã¿ã€ããäœæããã¿ã¹ã¯ã¯ãããã»ã©æãã¯ãªãããã§ãã ã¯ããViewModelã®åé€ãšååå€æŽã¯æ²åã§ã¯ãªããªããŸããã次ã«ãããžã§ã¯ãããã«ããããšãããããåçæããããããã«é¢é£ä»ããããŠããTypeScriptã³ãŒããåéãåæ¢ããŸãã
äž»ãªå¯èœæ§ã®ãã®å®çšçãªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã¯ã次ã®èšäºã§ããè€éãªäŸãæ®ããåçãªçµè«ã«é²ãããšã§å®äºãããšæããŸãã
åçãªçµè«ãšããã«ã€ããŠå°ã
Reinforced.Typingsã¯å®éã«ã¯å€ãã®ããšããµããŒãããŠããŸãã 以äžã«çããªã¹ãã瀺ããŸãã
- èªåçã«é¢é£ä»ããããããªã²ãŒããIEnumerableããã³IDictionaryã®åå«ïŒããããã£ãšããŠäœ¿çšããå ŽåïŒ
- åæåãšã¯ã©ã¹ã®å€ªååïŒã¡ãœããã®æ¬äœãTypeScriptã«èªåçã«å€æããããšã¯ã§ããŸããããèªåã§è¡ãããšã¯ã§ããŸã-以äžã§è©³çŽ°ã説æããŸãïŒ
- è€ååãæã€å-Reinforced.Typingsã¯ãã¯ã©ã¹ã§å¥ã®ãšã¯ã¹ããŒããããåã䜿çšããŠããããšãç解ãããã®å Žæã§äœ¿çšãããåã®å®å šä¿®é£Ÿåãèªåçã«é 眮ããŸãã ãã以å€ã®å Žåã¯ãä»»æã®
- é©åãªæ§æãã©ã¡ãŒã¿ãŒã䜿çšããŠãçæãããã³ãŒããç°ãªããã¡ã€ã«ïŒã¯ã©ã¹ããšã®ãã¡ã€ã«ïŒã«åæ£ãããããšãã§ããŸãã
- ã¢ã»ã³ããªå±æ§[TsReference]ã䜿çšããŠãçæããããã¡ã€ã«ã«/// <reference ...>ãè¿œå ã§ããŸãã ã¯ã©ã¹ããšã®ãã¡ã€ã«ã®å Žåãåç §ã¯èªåçã«é£æ¥ãã¡ã€ã«ã«è¿œå ãããŸã
- éåžžã®.tsã³ãŒãã®ä»£ããã«.d.tsãã¡ã€ã«ãçæã§ããŸãïŒæ§æã«ããã€ãã®éãããããŸãïŒ
- ã±ãŒãã®ãã§ãªãŒ-åå±æ§ã«ã¯CodeGeneratorTypeããããã£ããããReinforced.Typings.Generators.ITsCodeGenerator <>ïŒãªãã·ã§ã³ãšããŠãæ¢åã®ãžã§ãã¬ãŒã¿ãŒããç¶æ¿ïŒããç¶æ¿ã¿ã€ããæå®ããä»»æã®ãã³ãã¬ãŒãTypeScriptã³ãŒããç¬èªã«çæã§ããŸãã ã ãã®ããã«ããŠããµãŒããŒåŽã®ViewModelã³ãŒãããçŽæ¥ãããã¯ã¢ãŠãã®ViewModelã®èªåäœæã«é²ãããšãã§ããŸãã çŸåšã®äœæ¥å Žæã®ãããžã§ã¯ãã§ã¯ãã³ã³ãããŒã©ãŒã¢ã¯ã·ã§ã³ã®ã³ãŒããžã§ãã¬ãŒã¿ãŒããªãŒããŒããŒãããæå®ããããã©ã¡ãŒã¿ãŒã§å¯Ÿå¿ããã³ã³ãããŒã©ãŒã¡ãœãããåŒã³åºããŠãå€ãã®ã¡ãœããã®jsçªç®ã®ã°ã«ãŒã³ãŒããçæããŸããã ãã®ãããªã¡ãœããã¯q-shny promiseãè¿ããŸãïŒåã«Q.jsã倧奜ãã ããã§ãïŒã ããã«ã€ããŠã¯æ¬¡ã®æçš¿ã§èª¬æããŸã
ãã€ãã¹ã®ç¹ïŒ Reinforced.Typingsã¯ã¯ã©ã¹ã¡ãœããã®ããã£ãèªåçã«çæã§ããŸãã -Reflection ãä»ããŠæ©èœããŸãã ãŸãããµãŒããŒãšã³ãã£ãã£ã¯æ£ããTypeScriptã³ãŒããæ瀺ããããæ¢ã«çæãããã³ãŒãã«ã»ãã³ãã£ãã¯ãšã©ãŒãå«ãŸããïŒãã£ãŒã«ããåé€ããããªã©ïŒç¶æ³ã§ã®ããã€ãã®åé¡ã«æ³šæãããã§ãã TypeScriptã¢ã»ã³ããªã®æ©èœïŒãããžã§ã¯ãå šäœã§æåã®ã¢ã»ã³ããªïŒã«ããããããžã§ã¯ããåæ§ç¯ãããšã©ãŒãæåã§ä¿®æ£ãããŸã§ãšã©ãŒãä¿®æ£ããæ£ããããããçæããããšã¯ã§ããŸããã ããããç§ã¯ããã«åãçµãã§ããŸãã MSBuildã®éæ³ã¯é©ç°çã§ãã
åè¿°ã®ããã«ããããžã§ã¯ãã«ã¯ãŸã ããã¥ã¡ã³ããã»ãšãã©ãããŸããïŒãã®èšäºã§ãããgithubã®readmeïŒã ãããïŒ XMLDOCã¯éåžžã«è©³çŽ°ã§ãããèšå®ãã¡ã€ã«ã«ã³ã¡ã³ããä»ããããŠããŸãã ã§ããããåããŠã§ååã ãšæããŸãã ãããŠãç§ã¯ãã§ã«åŠçã®ãã¯ãã«ã«ã©ã€ã¿ãŒãåéããŠãããéåžžã®
ä»æ¥ã¯ä»¥äžã§ãã ã質åãããå Žåã¯ãã³ã¡ã³ããèšå ¥ããŠãã ããã çããããšããŸãã
ãããžã§ã¯ããžã®åç §ïŒ
匷åïŒGithubã®ã¿ã€ãã³ã°
匷åãããNuGetã®ã¿ã€ãã³ã°
æ€èšãããäŸã®å®å šãªã³ãŒã
UPD ïŒ Reinforced.Typingsã«é¢ãã2çªç®ã®èšäºã§ã詳现ã説æããŠããŸãã