typeScript 具有类型系统,而且是 javaScript 的超集;它可以编译成普通的 javaScript 代码;typeScript 支持任意的浏览器,支持任意环境、任意的系统,并且它是开源的。
typeScript 的安装
typeScript 的安装可以通过两种方式:
方式一:安装 visual studio code 的 typeScript 插件;
方式二:通过 npm 安装;(npm i -g typeScript)
typeScript 的基本构建方法
创建 demo.ts 文件;然后在命令行中执行 tsc demo.ts 文件,即可生成 demo.js 文件;
基础类型
typeScript 除了具有和 javascript 一样的数组类型,还提供了实用的枚举类型; 需要注意的是,在定义变量的时候,一旦声明了变量是什么类型的,那么修改和赋值的时候就必须要是这种类型的值;
布尔值: let isShow: boolean = false;
数字:let num: number = 1;
与 javaScript 一样,typeScript 中的所有数字都是浮点数;类型都是 number;而且在 typeScript 中也是同样的支持 ECMAScript 2015 中引入的二进制和八进制的字面量的;
字符串:let str = ' name' ; nam = " str"
数组: 数组的定义可以有两种方式:
方式一:let arr: number[] = [1,2,3]
方式二:let list: Array<number> = [1,2,3]
【注意】:一旦声明了 数组的元素是什么类型的,那么添加值的时候也必须是相应的类型
元组 TUple:元组类型允许表示一个 已知元素数量 和 类型的数组,各元素的类型不必相同;
例如: let arr: [string, number]; 则
arr = ['word', 10] -->正确
arr = [10, 'word] -->错误
设置了元素的类型之后,当访问已知索引的元素的时候,拿到的值也是设置时候的类型,
例如: console.log(typeof arr[0]) // string
console.log(typeof arr[1]) // number
如果要给数组新增元素的话,这个元素可以是定义中的任意类型,
例如:arr.push(2)
arr.push('abc')
而且也可以访问不存在的元素,例如 arr[6].toString()
枚举 enmu:枚举类型是对 javaScript 标准数据类型的一个补充
例如:enum Color = { Red, Blue, Green }
let co: Color = Color.Red
默认的情况下,元素都是像数组一样用索引对其枚举的元素做赋值标记,因此上例中的 co 最终的值是 0;我们也可以对其中的一个或者多个元素进行设置标记值,但是需要注意的是他们的类型必须是一致的;
例如: enum Color = {Red = 1, Blue, Green = 3 }
enmu Color = { Red = 'a', Blur = 'b', Green = 'c' }
【注意】: 默认情况下枚举元素的标记值都是像索引一样的数值类型的,所以手动改部分值的时候需要注意;此外,枚举元素的标记值可以重复;
除了可以通过枚举元素拿到他们的标记值,而且也可以通过标记值拿到元素,
例如: Color[3] // Green
需要注意的是,这种方式只对标记是数值的元素有效可以拿到,如果是字符串的话是拿不到的;如果设置的标记是数字且重复的时候,如果是手动设置的,那么权重将大于默认的,如果是手动设置的重复了,那么后边的将覆盖前边的;
任意值 any:对于那些我们不知道类型的,或者是不想让类型检查器对这些值进行检查而直接通过编译阶段的检查的变量,我们就可以采用任意值来定义;
例如: let num: any = '4'
空值 void:从某种意义上来说, void 类型是没有什么用的,因为只能给它赋值 undefined 和 null;所以一般用在像用 let、vat 或者 const 定义函数的时候,而这个函数没有返回值;
null 和 undefined
在 typeScript 中,undefined 和 null 是两个类型,它们和 void 一样,用处不是很大,;
默认情况下,null 和 undefined 是所有类型的子类型,也就是说可以将 undefined 和 null 赋值给 number 等其他类型的变量;但是,如果定义了 strictNullChecks 标记的话, null 和 uundefined 就只能赋值给 void 和它们自身了;
never:never类型表示的是那些永远不存在的值的类型;
例如:never 可以用在那些总是会抛出异常或者根本就不会有返回值的函数表达式或者箭头函数表达式中;
变量也可以是 never 类型,当他们被永不为真的类型保护所约束时;
never 类型是任何类型子类型,也可以赋值给任何类型,然而没有类型是 never 的子类型或者可以赋值给 never 类型的类型变量(除了自身);就算是 any 也不可以赋值给 never
用法:
例如: function error(message: string) : never { throw new Error('something failed') }
或者 function infinitLoop():never{ while (true) {} }
Object:表示非原始类型,也就是除了 number、string、Boolean、Symbol、Null 或者 undefined 之外的类型
例如:let a: object = { name: 'a' }
console.log(a.name)
上例中定义了 a 可以是object 也可以是 null ;即在创建变量的时候,如果想要给变量设置多种类型就可以用 ‘ | ’ 进行设置;
类型断言
类型断言其实就相当于类型转换,只在编译的时候起作用,就是告诉编译器,‘听我的,执行吧’,它不进行特殊的数据检查和结构
一般有两种形式:
形式一: “尖括号”语法
let someValue: any = "someValue"
let someLength: number = (<string>someValue).length
形式二:as 语法
let someValue:any = "someValue"
let someLength: number = (someValue as String).length
其实,类型断言也是只能处理那些像 any 这种子类型的的转换,如果是 number 和 string 这种还是转换不了的