TypeScript语言基础
一、什么是TypeScript
编程语言包括动态类型语言和静态类型语言。动态类型语言是指在程序运行阶段才检查变量数据类型的语言,在定义变量时不需要指定变量的数据类型,通常在编译时不容易发现错误,因此前端开发工具发明了一些检查插件,比如eslint等,用于在编译时根据一定的规则检查数据类型,避免一些错误;反之静态类型语言是在编译阶段就确定变量数据类型的语言,在编译时编译器就会检查错误,比如Java、C#等。
TypeScript可理解成Type+javaScript,理解为可扩展的JavaScript(参考Javascript基础),既保留了JavaScript动态类型的特点,也集成了静态类型的特点。TypeScript可以使用JavaScript中的所有代码和编码概念,TypeScript与JavaScript相比,进步的地方包括:加入注释,让编译器理解所支持的对象和函数,编译器会移除注释,不会增加开销;增加一个完整的类结构,使之成为一个全新的面向对象语言,适用于大型的开发项目。
二、JavaScript 和 TypeScript 的主要差异
1、TypeScript 可以使用 JavaScript 中的所有代码和编码概念,TypeScript 是为了使 JavaScript 的开发变得更加容易而创建的。
2、TypeScript 从核心语言方面和类概念的模塑方面对 JavaScript 对象模型进行扩展。
3、JavaScript 代码可以在无需任何修改的情况下与 TypeScript 一同工作,同时可以使用编译器将 TypeScript 代码转换为 JavaScript。
4、TypeScript 通过类型注解提供编译时的静态类型检查。
5、TypeScript 中的数据要求带有明确的类型,JavaScript不要求。
6、TypeScript 为函数提供了缺省参数值。
7、TypeScript 引入了 JavaScript 中没有的“类”概念。
8、TypeScript 中引入了模块的概念,可以把声明、数据、函数和类封装在模块中。
三、安装和使用TypeScript
首先需要安装nodejs环境,然后执行" npm install -g typescript "就可以全局安装Typescript,编写完成*.ts文件后,可以通过编译命令" tsc *.ts "将TypeScript编写的ts代码转换为*.js代码。目前最流行的IED工具是vsCode,它对typeScript具有很好的支持。本章节只介绍基本用法,不对具体概念做深入探究。
四、变量定义
let isok:boolean =false; let age:number=10; let name:string='我若安好,便是晴天'; let u:undefined=undefined; let n:null=null; let num:number=undefined; let notSure:any=xxx; //any为任意类型,任何值都可以赋值给该类型,该类型会绕过编译器检查 let arrOfNum:number[]=[1,2,3,4,5,6]; //数组元素必须为同一类型 arrOfNum.push(7); let item:[string,number]=['123',123];//元组为特殊的数组,指定元素的类型范围 interface IUser{ //定义接口,用来约束对象的属性类型,方便编译时检查 name:string; age:number; tel?:number; readonly id:number; } let mine:IUser={ id:1, name:'我若安好,便是晴天', age:20, tel:15000000000 } mine.name='zhangshan';
五、函数定义
function add(x:number,y:number,z?:number):number{ //约束参数类型 ?表示可选参数 return x+y; } const add=(x:number,y:number,z?:number):number=>{ //lambda写法 return x+y; } function hellow(x:number | string ,y:number):number{ //number | string表示可以是这两种类型中的一种 const str=x as string; //类型断言后赋值给str if(str.length){ return str.length; }else { const n=x as number; return n.toString().length; } } function isNum(x:number|string):boolean { if(type x ==='number') //判断类型 { return true; } return false;
}
六、类的定义
class Animal { constructor(name){ //构造函数 this.name=name; } run(){ return '${this.name} is running' } } const dog=new Animal('小黄'); dog.run(); const dog1 extends Animal { //类的继承 constructor(name){ //构造函数 super(name) //调用父类方法 } public eat(){ //自身方法 , public/private/protected/readonly为访问修饰符。默认为public } } const xiaogou=new dog1 ('xiaogou11');
七、类和接口的配合
interface IPlay{ //定义接口,包含2个方法 on():void; off():void; } class Mp3 implements IPlay{ //Mp3类实现接口IPlay on(){ console.log("播放"); } off(){ console.log("关闭"); } } interface IPlaymini extends IPlay{ //接口也可以继承接口 openmini(){ console.log("最小化"); } }
八、枚举类
enum week{ //不手动赋值时默认从0开始1,2,3.... Monday, Tuesday Wednesday, Thursday, Friday, Saturday, Sunday } console.log(week.Sunday); console.log(week[6]); enum Direc{ //可以手动赋值 up =1, down=2, left=3, right=4 }
九、泛型
function gettype<T>(arg:T):T{ //T为泛型类参数,可理解为占位符,在调用时才传入具体类型 return arg; } const res=gettype<Boolean>(true); function gettype<T extends xxx>(arg:T):T{ //给泛型T参数增加类型约束,约束T的类型必须属于xxx类型 return arg; } class Cls<T> { //泛型参数除了作为函数参数传递外,还可以附加在接口和类上,作为全局泛型参数使用 }
十、类型别名+字面量+交叉类型
type add = (x:number,y:number)=>{ return x+y} //声明类型,add 为类型的别名 let sum:add; //指定sum的类型为add类型 const res= sum(1,2); type strornum=string | number; //联合类型,表示strornum可以为字符串或者数字 let:res:strornum ='123'; res:strornum =123 type dir= 'up' |'down' | 'left' | 'right' ;//定义联合类型dir,其值只能有这四种 let where:dir ='up'; //正确 let where:dir ='up11'; //编译报错 interface Iname{ name:string} interface Iage{ age:string} type Iperson=Iname & Iage;//交叉类型,Ipersion同时属于Iname和Iage类型,具有两种类型的属性 let per:Iperson={name:'zhangshan',age:'18'}; //上面的例子可以说明,使用type关键字为类型定义别名
十一、内置数据类型
const a:Array<number> =[1,2,3,4,5,6] //数组 const date =new Date();//日期 const reg=/abcd/;//正则表达式 const sum=Math.pow(2,2);//数学计算类 const body=document.body;//DOM对象document
十二、声明文件
在编写项目的时候,我们通常需要使用一些第三方的库文件,这些库文件不是通过typeScript写的,如果直接在ts文件中引用和使用它的类型会报无法识别的编译错误。这时我们可以使用关键字 declare 来为这些类型做声明,手动创建声明的语法如下:
declare var
声明全局变量declare function
声明全局方法declare class
声明全局类declare enum
声明全局枚举类型declare namespace
声明(含有子属性的)全局对象interface
和type
声明全局类型export
导出变量export namespace
导出(含有子属性的)对象export default
ES6 默认导出export =
commonjs 导出模块export as namespace
UMD 库声明全局变量declare global
扩展全局变量declare module
扩展模块/// <reference />
三斜线指令
假如我们想使用第三方库 jQuery,一种常见的方式是在 html 中通过 <script>
标签引入 jQuery,然后就可以使用全局变量 $
或 jQuery
了。但是在 ts 中,编译器并不知道 $
或 jQuery
是什么,我们需要使用 declare var
来定义它的类型。
declare var jQuery: (selector: string) => any; //declare var 并没有真的定义一个变量,只是定义了全局变量 jQuery 的类型,仅仅会用于编译时的检查,在编译结果中会被删除。
通常我们会把以上声明语句放到一个单独的文件(比如jQuery.d.ts
)中,可以在项目全局使用,这个d.ts类型的文件就是声明文件。
通常我们使用的第三方库,它的官方或者社区都已经为我们编写好了声明文件(如果没有则需要手动编写),不需要我们亲自编写,比如在vue项目中使用 install 安装库时,会在node_modules对应的文件夹下找到它的声明文件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!