ã¯ããã«
ãã®èšäºã§ã¯ãASP.NET Web APIã«åºã¥ãããã¯ãšã³ããšTypeScriptã䜿çšããŠäœæãããããã³ããšã³ããšã®éã§åä»ãã¡ãã»ãŒãžã³ã°ãå®è£ ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ããã¯ã倧èŠæš¡ãããžã§ã¯ãã§äœæ¥ããå Žåã«ç¹ã«éèŠã§ãããããŒã ãåæ£ããŠããå Žåã¯ããã«éèŠã§ãã ããšãã°ãããã¯ãšã³ãéçºè ãšããã³ããšã³ãéçºè ãç°ãªãã¿ã€ã ãŸãŒã³ã®ç°ãªãå Žæã§åããŠããå Žåãåžžã«äœãã«é£çµ¡ããã話ãåã£ããããæ©äŒã¯ãããŸããã ãã®å Žåãå€æŽã®è¿œè·¡ã¯éªšã®æããäœæ¥ã§ãããå€ãã®åŸ®åŠãªãšã©ãŒã䌎ãå¯èœæ§ããããŸãã
ãã®èšäºã®èè ã«ãšã£ãŠãWPFãšSilverlightã«ããããã³ããšã³ãã®éçºã«æºãã£ã人ã«ãšã£ãŠã倧ããªåé¡ã¯éçåä»ãã®æ¬ åŠã§ããã ã2ããšã2ããè¿œå ãã代ããã«ãã2ããšã2ãè¿ãé¢æ°ããè¿œå ããããjQueryã©ãããŒã®ä»£ããã«DOMãªããžã§ã¯ããæž¡ããåæ°ã JSLintãªã©ã®éçã³ãŒãã¢ãã©ã€ã¶ãŒã®åºçŸã«ãããåé¡ã¯å€å°ç·©åãããŸããããTypeScriptã¯ãç¹ã«ããŒã éçºã«ãããŠçã®ãã¬ãŒã¯ã¹ã«ãŒãšãªããŸããã

åé¡ã®æ¬è³ª
TypeScriptã¯éçåä»ããå¯èœã«ããèšèªã§ããããé¯èŠããšåŒã°ãããã®ããããŸãïŒ habrahabr.ru/post/258957ãhabrahabr.ru/post/272055 ïŒã äžæè°ãªããšã«ãæ¹è©å®¶ã¯äžè¬çã«å®å šã§ãªãã·ããªãªãšããŠããã¯ãšã³ãã§äœæ¥ããããšã匷調ããŠããŸãã
ãã ããåé¡ã®æ¬è³ªã¯ã以åããã³çŸåšã®TypeScriptã§JavaScriptã§ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããå ŽåãWCFã«ãã£ããããªã¡ã¿ããŒã¿ããã³ã¯ã©ã€ã¢ã³ãã³ãŒãã®èªåçæãæäœããããã®ããŒã«ãååšããªããšããäºå®ã«ãããŸãã
ã¡ã¿ããŒã¿
WPF + WCFã®çµéšã«ç®ãåãããšããã®ç¹ã§ãã¹ãŠãéåžžã«è¯å¥œã§ãã ãã¡ãããäžè¬çã«èšãã°ãããŒã¿ã¯åžžã«åä»ããããŠããªã圢åŒã§éä¿¡ãããŸãããéä¿¡ããããšãããŒã¿ã¯ã»ãŒæåŸãŸã§åä»ãããããŸãŸã§ãå察åŽã«éä¿¡ãããçŽåã«ã®ã¿æååãŸãã¯ãã€ããªã¹ããªãŒã ã«ã·ãªã¢ã«åãããŸãã å察åŽã§ã¯ãåã³ã圌ãã¯ã¿ã€ãããããã®ã«ããããåãç¹å®ã®ã¯ã©ã€ã¢ã³ãã«ãªããŸãã ãã®ãããªã¯ã©ã€ã¢ã³ãã®æã§æžããªãã§ãè€æ°ã®ãšã©ãŒããã£ããããããšããªãããã«ãã¡ã¿ããŒã¿ãååšããŸãã .NETã®äžçã§ã¯ã90ïŒ ã®ã±ãŒã¹ã§ãããããçæãããåŠçãããããäœæ¥ã¯ãŸã£ããå¿ èŠãããŸããã ãµãŒãã¹ãæžãã ãã§ãé©åãªãšã³ããã€ã³ããè¿œå ããããšãå¿ããã«ãèªåçæãããã¡ã¿ããŒã¿ãååŸããŸãã ãŸããã¯ã³ã¯ãªãã¯ã§ã¯ã©ã€ã¢ã³ããçæãããã®çµæãå ¥åãããã¡ãã»ãŒãžã亀æã§ããŸãã
JavaScript / TypeScriptã§åäžããŒãžã¢ããªã±ãŒã·ã§ã³ãéçºããå ŽåãWCFã¯Web APIã«çœ®ãæããããŸãã ãã€ãŠã¯ãWeb APIã®ã¡ã¿ããŒã¿ãããã«çæããæ¹æ³ããªãã£ãçç±ãå€å°é©ãã§ããïŒãã«ãããŒãžã®ã¡ã¿ããŒã¿ãèæ ®ããªãïŒã ã©ããããã®çãã¯ãWeb APIããã®ããŒã¿ã®äž»ãªåä¿¡è ã¯JavaScriptã³ãŒãã§ãããå ¥åã¯æå³ããªããªããšããããšã§ãã ãã ããçŸåšã¯JavaScriptã§ã¯ãªãTypeScriptããããåä»ããããããŒã¿ãæäœããããšããèŠæãåã³é¢é£ããŠããŸãã
çŸåšãéåžžã«äººæ°ã®ããã¡ã¿ããŒã¿åœ¢åŒã¯OpenAPI / Swaggerã§ãã åœç¶ã®ããšãªããããã®åœ¢åŒã§ã¡ã¿ããŒã¿ãšããã¥ã¡ã³ããçæããæ©äŒããããŸãã
次ã«ãåä»ãçžäºäœçšãæŽçããããã»ã¹ã瀺ããŸãã
ã€ãŸãã次ã®æé ã«åŸããŸãã
- Swashbuckleã©ã€ãã©ãªãæ¥ç¶ããŠæ§æãã
- ããã¥ã¡ã³ã/ã¡ã¿ããŒã¿ãçæãã
- çæããããã¡ã€ã«ãããŒãžã§ã³ç®¡çã·ã¹ãã ã«ä¿åããããšã®å©äŸ¿æ§ãæ€èšŒããŸã
- AutoRestãæ¥ç¶ãã
- ã¯ã©ã€ã¢ã³ãã¢ãã«ãçæããŸã
- ããžãã¹ã§ãã¹ãããŸãã
ã¹ã¯ãã·ã¥ããã¯ã«
github.com/domaindrivendev/Swashbuckle
ãŸããã¡ã¿ããŒã¿ãçæããŸãã
ãã®ãããWeb APIãããããã®äžã«åŸæ¥å¡ãšã®äœæ¥ãæ åœããã³ã³ãããŒã©ãŒããããšããŸãã
/// <summary> /// Gets all employees. /// </summary> /// <remarks> /// Gets the list of all employees. /// </remarks> /// <returns> /// The list of employees. /// </returns> [Route("api/employees")] [HttpGet] public Employee[] GetEmployees() { return new[] { new Employee { Id = 1, Name = "John Doe" }, new Employee { Id = 2, Name = "Jane Doe" } }; }
ã芧ã®ãšãããEmployeeåã®åä»ããªããžã§ã¯ãã®é åãè¿ãããŸãã ãããžã§ã¯ããéå§ãããšãåŸæ¥å¡ã®ãªã¹ãããªã¯ãšã¹ãã§ããŸãã
httpïŒ// localhostïŒ1234 / api / employees
ããã§Swashbuckleã©ã€ãã©ãªãæå¹ã«ããŸãããã NuGetã«ã¯2ã€ã®Swashbuckle.Coreããã³Swashbuckleããã±ãŒãžããããŸãã 2ã€ã®éãã¯ã1ã€ç®ã¯ã«ãŒãã«ã§ãããããžãã¯ãå®è¡ãããã¹ãŠã®ã³ãŒããå«ãŸããŠããããšã§ãã2ã€ç®ã¯ãã«ãŒãã«ãæ§æããããŒãã¹ãã©ãããã€ã³ã¹ããŒã«ããåãªãã¢ããªã³ã§ãã
ããã¯github.com/domaindrivendev/Swashbuckle#iis-hosted documentationã«æžãããŠããŸã
Coreãã€ã³ã¹ããŒã«ããç¬èªã®æ§æã³ãŒããèšè¿°ããããšããå§ãããŸãã ãããåå©çšããæ¹ã䟿å©ã§ãã
ã€ã³ã¹ããŒã«ããŸããã
PM> Install-Package Swashbuckle.Core
WebActivatorExã«ç»é²ãã
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(FullyTypedExample.WebApi.SwaggerConfig), "RegisterGlobal")]
ãŸããæ§æã³ãŒããæžããŸã
/// <summary> /// Configures Swagger. /// </summary> /// <param name="config"> /// The Swagger configuration. /// </param> public static void ConfigureSwagger(SwaggerDocsConfig config) { config.SingleApiVersion("v1", "FullyTypedExample.WebApi"); config.IncludeXmlComments(GetXmlCommentsPathForControllers()); config.IncludeXmlComments(GetXmlCommentsPathForModels()); config.GroupActionsBy(apiDescription => apiDescription.ActionDescriptor.ControllerDescriptor.ControllerName); config.OrderActionGroupsBy(Comparer<string>.Default); config.PrettyPrint(); }
ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ããæåã«ãAPIã®ããŒãžã§ã³ãšã¿ã€ãã«ãèšå®ããŸãã 次ã«ãã³ã³ãããŒã©ãŒãšã¢ãã«ã®xmlã³ã¡ã³ããæå¹ã«ããå¿ èŠããããšèšããŸãã swagger-documentå ã®ã¢ã¯ã·ã§ã³ã®é åºãšã°ã«ãŒãåã調æŽããŸãã PrettyPrintãªãã·ã§ã³ã«ã€ããŠãèšåããããšæããŸãã Swaggerããã¥ã¡ã³ãã®JSONãã©ãŒããããæå¹ã«ããŸãã ãã®ãªãã·ã§ã³ã¯ãå°æ¥ããŒãžã§ã³ç®¡çã·ã¹ãã ã«ããã¥ã¡ã³ããä¿åããå·®åãã¥ãŒã¢ãŒã䜿çšããŠãã®å€æŽãç°¡åã«è¡šç€ºããããã«åœ¹ç«ã¡ãŸãã
ããã§ããããžã§ã¯ããéå§ããŠSwaggerã€ã³ã¿ãŒãã§ãŒã¹ã確èªã§ããŸãã
httpïŒ// localhostïŒ1234 / swagger

è¿ãã§ãSwaggerããã¥ã¡ã³ãèªäœãJSON圢åŒã§èŠãããšãã§ããŸãã
httpïŒ// localhostïŒ1234 / swagger / docs / v1
ããã§ãçæãããããã¥ã¡ã³ããããŒãžã§ã³ç®¡çã·ã¹ãã ã«è¿œå ããå¿ èŠããããŸãã Swashbuckleã¯å éšã§Microsoft IApiExplorerã䜿çšããŠãããããswaggerãã¡ã€ã«ãçæããã«ã¯ãWeb APIãå®è¡ããå¿ èŠããããŸãïŒããã«ã€ããŠã¯ãã¡ãgithub.com/domaindrivendev/Swashbuckle/issues/559 ïŒã ã€ãŸããããã¥ã¡ã³ããçæãããã³ã«ãWeb APIãèµ·åããæåã§swagger / docsããã¡ã€ã«ã«ã³ããŒããå¿ èŠããããŸãã ãã¡ããããã£ãšèªååããããã®ã欲ããã§ãã
èªå·±ãã¹ãåã¢ããªã±ãŒã·ã§ã³ãšããŠWeb APIãèµ·åããéãšã³ããã€ã³ãã®swaggerãªã¯ãšã¹ããéä¿¡ããå¿çããã¡ã€ã«ã«æžã蟌ãããšã§ããã解決ããŸããã Swashbuckleæ§æã³ãŒããåå©çšãããšäŸ¿å©ã§ããã ãã¹ãŠæ¬¡ã®ããã«ãªããŸãã
/// <summary> /// Generate Swagger JSON document. /// </summary> /// <param name="filePath"> /// The file path where to write the generated document. /// </param> private static void GenerateSwaggerJson(string filePath) { // Start OWIN host using (TestServer server = TestServer.Create<WebApiHostStartup>()) { HttpResponseMessage response = server.CreateRequest("/swagger/docs/v1").GetAsync().Result; string result = response.Content.ReadAsStringAsync().Result; string path = Path.GetFullPath(filePath); File.WriteAllText(path, result); } }
ãã¹ãŠãå®è¡ããŠã¿ãŸãããã
nuget.exe restore "..\FullyTypedExample.sln" "C:\Program Files (x86)\MSBuild\12.0\bin\MSBuild.exe" "..\FullyTypedExample.WebApi.SelfHosted\FullyTypedExample.WebApi.SelfHosted.proj" /v:minimal "..\FullyTypedExample.WebApi.SelfHosted\bin\Debug\FullyTypedExample.WebApi.SelfHosted.exe" --swagger "swagger.json"
åèšã§ãJSONãã¡ã€ã«ã®åœ¢åŒã®swaggerããã¥ã¡ã³ããåãåããããŒãžã§ã³ç®¡çã·ã¹ãã ã«å ¥ããŸããã åæ£ããŒã ã®ããã³ããšã³ãéçºè ã¯ããšã³ããã€ã³ãã®å€æŽãç°¡åã«è¿œè·¡ã§ããããã«ãªããŸããã ãããã©ã®ããã«èŠãããèŠãŠã¿ãŸãããã
åŸæ¥å¡ãèå¥åã§ååŸããããã®æ°ããã¢ã¯ã·ã§ã³ãè¿œå ãããšããŸãããã
/// <summary> /// Gets employee by id. /// </summary> /// <param name="employeeId"> /// The employee id. /// </param> /// <remarks> /// Gets the employee by specified id. /// </remarks> /// <returns> /// The <see cref="Employee"/>. /// </returns> [Route("api/employees/{employeeId:int}")] public Employee GetEmployeeById(int employeeId) { return this.GetEmployees().SingleOrDefault(x => x.Id == employeeId); }
ãããŠãswagger.jsonãåçæããŸããã äœãå€ãã£ãã®ãèŠãŠã¿ãŸããã

ã芧ã®ãšããããã®ã¢ã¯ã·ã§ã³ã«é¢ããããã¥ã¡ã³ãã衚瀺ãããŠãããdiffãã¥ãŒã¢ãŒã䜿çšããŠç°¡åã«ç¢ºèªã§ããŸãã PrettyPrintãªãã·ã§ã³ã®ãããã§ããã©ãŒããããããŠããŠèªã¿ããããªã£ãŠããŸãã
AutoRest
ããã§ãã¿ã¹ã¯ã®æåã®éšåã¯å®äºããŸãããã¡ã¿ããŒã¿ããããŸãã ã¯ã©ã€ã¢ã³ãããŒããã€ãŸã ã¯ã©ã€ã¢ã³ãåŽã®ããŒã¿ã®çš®é¡ïŒãµãŒããŒããåä¿¡ïŒ
Web APIããªã¯ãšã¹ãããããã®ã³ãŒãèªäœãçæã§ããããšãèšããªããã°ãªããŸãããããã¯ããå°ãè€éã§ãã³ãŒããžã§ãã¬ãŒã¿ãŒãæ§æããããç¬èªã®ã³ãŒããèšè¿°ãããããã®ã«æéããããäœæ¥ã§ãã ãŸãã䜿çšããã©ã€ãã©ãªïŒjQueryãSuperAgentããŸãã¯æ°ããå®éšçãªFetch API developer.mozilla.org/en/docs/Web/API/Fetch_APIãªã© ïŒãšã¢ãããŒãïŒPromiseãRxãªã©ïŒã«å€§ããäŸåããŸãã¯ã©ã€ã¢ã³ãã³ãŒãã
ã³ãŒãçæã«ã¯ã次ã®ãªãã·ã§ã³ããããŸãã
1. Swagger Code Generator github.com/swagger-api/swagger-codegen
Javaã§èšè¿°ãããSwaggerããŒã ã®å ¬åŒããŒã«ã§ãããé©åãªã€ã³ãã©ã¹ãã©ã¯ãã£ãå¿ èŠã§ãã Dockerã§ãå®è¡ã§ããŸãã 確ãã«ãJavaScriptã®çæãç¹ã«TypeScriptã¯æ¬ èœããŠããŸãã ãã ããããšãã°Javaã§ã³ãŒããçæããå¿ èŠãããå Žåã¯ããããããªãã®éžæã§ãã 圌ã¯æãããªçç±ã§ç§ãã¡ã«åããªãã£ãã
2. Swagger JSã©ã€ãã©ãª github.com/swagger-api/swagger-js
SwaggerããŒã ã®å ¬åŒããŒã«ã§ããããŸãã ãã§ã«æããã JSã§èšè¿°ãããããã«å¿ããŠJSã³ãŒããçæããŸãã npmãŸãã¯bowerãä»ããŠã€ã³ã¹ããŒã«ãããŸãã ã€ã³ãã©ã¹ãã©ã¯ãã£ã¯ç§ãã¡ã«é©ããŠããŸãããæ®å¿µãªããããã®ã¿ã€ãã®äžä»£ã¯ååšããŸããã
3. JSããã³Typescript Codegenã« Swaggerãã github.com/wcandillon/swagger-js-codegen
ãããžã§ã¯ãã¯ããã®ã¢ãããŒãã®éçºãå§ããå°ãåŸã«å ¬éãããŸããã ããããè¿ãå°æ¥ããããæé©ãªãœãªã¥ãŒã·ã§ã³ã«ãªãã§ãããã
4.
5. AutoRest github.com/Azure/autorest
æåŸã«ãAzure MicrosoftããŒã ã®AutoRestã çŸåšã®ããŒãžã§ã³ã¯0.15.0ã§ãããççŽã«èšã£ãŠãå®å šãªãªãªãŒã¹ã§ãããšèŠãªããããã©ããã¯æ確ã§ã¯ãããŸããããåã®ãã®ãšåæ§ãPreããŒã¯ã¯èŠ³å¯ãããŸããã äžè¬ã«ãããã§ã¯ãã¹ãŠãç°¡åã§ãå¿ èŠãª.d.tsãã¡ã€ã«ãã€ã³ã¹ããŒã«ããŠããã«çæããŸããã
ããã§ã¯ããã®ããŒã«ã䜿çšããŠç§ãã¡ã®æ ã®æçµæ®µéãèŠãŠãããŸãããã
AutoRestã¯NuGetãä»ããŠæ¥ç¶ããŸãã
PM> Install-Package AutoRest
ããã±ãŒãžã¯ç¹å®ã®ãããžã§ã¯ãã«ã¯é 眮ãããããœãªã¥ãŒã·ã§ã³ãžã®ãªã³ã¯ãè¿œå ãããŸãã
<?xml version="1.0" encoding="utf-8"?> <packages> <package id="AutoRest" version="0.15.0" /> </packages>
ããã±ãŒãžã«ã¯ãå®éã«çæãå®è¡ããã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³AutoRest.exeããããŸãã å®è¡ããã«ã¯ã次ã®ã¹ã¯ãªããã䜿çšããŸã
nuget.exe restore "..\FullyTypedExample.sln" "..\packages\AutoRest.0.15.0\tools\AutoRest.exe" -Input "swagger.json" -CodeGenerator NodeJS move "Generated\models\index.d.ts" "..\FullyTypedExample.HtmlApp\models.d.ts"
å ¥åã§ã¯ã以åã«çæãããswagger.jsonãéä¿¡ããåºåã§ã¯ãmodels \ index.d.ts-ã¢ãã«ãå«ããã¡ã€ã«ãååŸããŸãã ã¯ã©ã€ã¢ã³ããããžã§ã¯ãã«ã³ããŒããŸãã
ããã§ãTypeScriptã«ã¯æ¬¡ã®ã¢ãã«èšè¿°ããããŸãã
/** * @class * Initializes a new instance of the Employee class. * @constructor * Represents the employee. * @member {number} id Gets or sets the employee identifier. * * @member {string} name Gets or sets the employee name. * */ export interface Employee { id: number; name: string; }
å®éã«è©ŠããŠã¿ãŸãããã
public makeRequest() { this.repository.getEmployees() .then((employees) => { // Generate html using tempalte string this.table.innerHTML = employees.reduce<string>((acc, x) => { return `${acc}<tr><td>${x.id}</td><td>${x.name}</td></tr>`; }, ''); }); }
ããã§ã¯ãidããã³nameã¢ãã«ãã£ãŒã«ããåç §ããŸãã ãµãŒããŒãžã®ãªã¯ãšã¹ãã®å®è£ ãæå³çã«äžããŸããã æ¢ã«è¿°ã¹ãããã«ãéžæããã©ã€ãã©ãªãšã¢ãããŒãã«äŸåããå¯èœæ§ããããŸãã
ååšããªã幎霢ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããããšãããšãTSã³ãŒãã¯ã³ã³ãã€ã«ãããŸããã 以åã«ã¢ã¯ã»ã¹ãããã£ãŒã«ããAPIã§æ¶ããå Žåãã³ãŒãã¯å床ã³ã³ãã€ã«ãããŸããã æ°ãããã£ãŒã«ããè¿œå ããããšãåãå·®åã䜿çšããŠããã«è¡šç€ºãããŸãã ããã«ãã¡ã¿ããŒã¿ã«åºã¥ããŠJSDocããã¥ã¡ã³ããèªåçã«åãåããŸãã äžè¬ã«ãéçåä»ãã®é åã¯ãã¹ãŠæçœã§ãã
ResponseType
èå³æ·±ãããšã«ãå¿ èŠã«å¿ããŠãããã¥ã¡ã³ãåã®ããã«ãè¿ããããã®ãšã¯ç°ãªãã¿ã€ããæå®ã§ããŸãã ããšãã°ãããã¯ãåæå®ãããŠããªãDataSetã§åäœããã¬ã¬ã·ãŒã³ãŒããããå Žåã«åœ¹ç«ã¡ãŸãã ã³ã³ãããŒã©ãŒããIHttpActionResultãè¿ãå Žåã ã¡ãœããã®å®è£ ã«åœ±é¿ãäžããããšãªããResponseTypeå±æ§ã§ããããããŒã¯ããç¹å¥ãªåãéçºã§ããŸã
/// <summary> /// Gets all departments. /// </summary> /// <remarks> /// Gets the list of all departments. /// </remarks> /// <returns> /// The list of departments. /// </returns> [Route("api/departments")] [HttpGet] [ResponseType(typeof(DepartmentsResponse))] public DataSet GetDepartments() { var dataTable = new DataTable("Departments"); dataTable.Columns.Add("Id", typeof(int)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Rows.Add(1, "IT"); dataTable.Rows.Add(2, "Sales"); var dataSet = new DataSet(); dataSet.Tables.Add(dataTable); return dataSet; }
ã¯ã©ã€ã¢ã³ãåŽã®åä»ãã¢ãã«ãååŸãã
/** * @class * Initializes a new instance of the Department class. * @constructor * Represents the department. * @member {number} id Gets or sets the department identifier. * * @member {string} name Gets or sets the department name. * */ export interface Department { id: number; name: string; }
åé¡
ãŸããmodels.d.tsãã¡ã€ã«ã®ãµã€ãºã¯æéãšãšãã«å¢å ããŸãã ããã€ãã®ãµããã¡ã€ã«ã«åå²ããããšã¯ãŸã æ±ã£ãŠããŸããããééããªããããè¡ãå¿ èŠããããŸãã
ãŸããã¢ã³ããŒã¹ã³ã¢ã䜿çšãããŠããå Žåãªã©ãéæšæºè¡šèšã䜿çšãããŠããå Žåããã£ãŒã«ãåã®äžæ£ãªçæã«åé¡ãããå¯èœæ§ããããŸãã CïŒã³ãŒãã®LAST_NAMEãã£ãŒã«ãã¯ãSwaggerã®lagT_NAMEã§çæãããTypeScrptã®lasTNAMEãšããŠçæãããŸãã
/// <summary> /// Gets or sets the last name. /// </summary> [Required] // ReSharper disable once InconsistentNaming public string LAST_NAME { get; set; }
"lasT_NAME": { "description": "Gets or sets the last name.", "type": "string" }
export interface Employee { id: number; name: string; firstName: string; lasTNAME: string; }
ãã€ããŒãªåé¡ã®ã»ãšãã©ã¯ãæ§æã䜿çšããŠç°¡åã«è§£æ±ºã§ããåå¥ã«èšåãã䟡å€ã¯ãããŸããã
ãããã«
ãã®ã¢ãããŒãã«ãããåä»ãã¡ãã»ãŒãžäº€æãæŽçããããšãã§ããŸããã åæã«ã圌ã¯ã¯ã©ã€ã¢ã³ãã¢ãã«ã®ã¿ã€ãã³ã°ãæäŸããã¯ã©ã€ã¢ã³ãã³ãŒããšãµãŒããŒã³ãŒãã®äžäžèŽã®å¯èœæ§ãæžãããAPIãšã¢ãã«ã®å€æŽã®è¿œè·¡ã容æã«ããŸããã çŽ æŽãããããŒãã¹ã¯ãRESTã¯ã©ã€ã¢ã³ããçµã¿èŸŒãŸããAPIã®äŸ¿å©ãªæåãã¹ããšãã¹ããŒã ã«åŸã£ãŠãªã³ã¶ãã©ã€ã§ãã€ããŒããçæããæ©èœã§ããã ãã®ã¢ãããŒãã䜿çšãããšãããã¯ãšã³ãéçºè ãšããã³ããšã³ãéçºè ã®çžäºäœçšãæ¹åããã®ã«ã圹ç«ã¡ãŸããã
å®çšçãªäŸãããã§èŠãããšãã§ããŸãã
github.com/EBTRussia/fully-typed-example