TypeScript与JavaScript的结合使用

TypeScript是一种由微软开发的开源编程语言,它是JavaScript的一个超集,添加了静态类型检查和基于类的面向对象编程。TypeScript代码在编译时会被转换成纯JavaScript代码,这个过程移除了类型注解,使得最终的JavaScript代码可以在任何支持JavaScript的平台上运行。

类型注解

在TypeScript中,可以为变量和函数参数定义类型。这使得编译器能够在编译时捕捉到类型错误,并提供了IDE的智能提示功能。例如:

function test(a: number, b: number): number { return a * b; } alert(test(10, 20));

在上述代码中,函数test的参数a和b被明确定义为数字类型,返回值也是数字类型。

编译过程

当编写TypeScript代码时,它会被编译成JavaScript代码和一个映射文件。映射文件用于将JavaScript代码映射回TypeScript代码,以便调试。编译命令如下:

tsc test.ts -> test.js

在编译过程中,类型注解会被移除,因此最终的JavaScript代码中不包含这些类型信息。

DefinitelyTyped

DefinitelyTyped是一个存储库,它为许多现有的JavaScript库提供了类型定义,以接口的形式存在。这些类型定义用于开发目的,并不部署到生产环境。它们用于检查类型。

模块和导出关键字

TypeScript使用模块来避免命名冲突,并提供立即执行函数表达式(IIFE)的功能。要使模块的内部部分在模块外部可访问,需要使用export关键字。例如:

module App.Model { export class Project { public Title: string; public Id: number; public Client: string; } }

在上述代码中,Project类被定义在App.Model模块中,并使用export关键字导出,以便可以在模块外部访问。

构建和部署Sharepoint应用

要创建一个Sharepoint托管应用和必要的TypeScript定义文件,可以使用Nuget包管理器。需要验证项目属性中是否包含TypeScript选项。如果缺少,可以按照以下步骤操作:

<PropertyGroup> <TypeScriptSourceMap>true</TypeScriptSourceMap> </PropertyGroup> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets" />

保存并重新加载项目后,可以通过包管理器控制台包含DefinitelyTyped。

AngularJS和TypeScript的结合

AngularJS中,可以使用TypeScript来定义控制器和服务。例如:

module App.Controller { export class ProjectCtrl { public projects: Array<App.Model.Project> public project: App.Model.Project; static $inject = ['ProjectService']; constructor(private projectService: App.Service.ProjectService) { this.project = new App.Model.Project(); } public getProjects(): void { this.projectService.getProjects().then(data => { this.projects = data.data.d.results; console.log(this.projects); }).catch(e => { alert('Error' + e); }); } public addProject(): void { this.projectService.addProject(this.project).then(data => { this.getProjects(); this.project = new App.Model.Project(); }).catch(e => { alert('Error' + e); }); } } }

在上述代码中,ProjectCtrl控制器使用了ProjectService服务,并定义了注入的依赖项。

构建项目并将TS文件合并。构建完成后,将test.js和test.map文件包含在项目中。打开element.xml,移除.ts文件路径,并包含test.js和test.map文件。

<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <Module Name="App"> <File Path="App\test.js" Url="App/test.js" ReplaceContent="TRUE" /> <File Path="App\test.js.map" Url="App/test.js.map" ReplaceContent="TRUE" /> </Module> </Elements> <html> <head> <link rel="Stylesheet" type="text/css" href="../Content/App.css" /> <script src="../Scripts/jquery-1.9.1.js"></script> <script src="../Scripts/angular.js"></script> <script src="../Scripts/angular-ui-router.js"></script> <script src="../App/test.js"></script> </head> <body> <form runat="server"></form> <h1>Project</h1> <div ng-app="projectApp"> <div ng-controller="ProjectCtrl as vm"> <div style="float: left; border: 1px solid gray;"> <table ng-init="vm.getProjects()"> <tr> <td>SNO</td> <td>Project</td> <td>Client</td> </tr> <tr ng-repeat="project in vm.projects"> <td>{{$index+1}}</td> <td>{{project.Title}}</td> <td>{{project.Client}}</td> </tr> </table> </div> <div> <table> <tr> <td>Project</td> <td> <input type="text" ng-model="vm.project.Title" /> </td> </tr> <tr> <td>Client</td> <td> <input type="text" ng-model="vm.project.Client" /> </td> </tr> <tr> <td colspan="2"> <button ng-click="vm.addProject()">Add Project</button> </td> </tr> </table> </div> </div> </div> </body> </html>
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485