这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
TypeScript 基本类型
1. 类型声明
类型声明是TS非常重要的一个特点,通过类型声明可以指定TS中变量、参数、形参的类型。
指定类型之后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错。
简而言之,类型声明就是给变量设置了类型,使得变量只能存储某种类型的值。
2. 基本类型
| 类型 | 例子 | 描述 |
|---|---|---|
| number | 1, -33, 2.5 | 任意数字 |
| string | 'hi', "hi", hi | 任意字符串 |
| boolean | true、false | 布尔值true或false |
| 字面量 | 其本身 | 限制变量的值就是该字面量的值 |
| any | * | 任意类型 |
| unknown | * | 类型安全的any |
| void | 空值(undefined) | 没有值(或undefined) |
| never | 没有值 | 不能是任何值 |
| object | {name:'孙悟空'} | 任意的JS对象 |
| array | [1,2,3] | 任意JS数组 |
| tuple | [4,5] | 元素,TS新增类型,固定长度数组 |
| enum | enum{A, B} | 枚举,TS中新增类型 |
3. 类型声明使用示例
-
number、string、boolean
// 一 :先声明 后赋值 // 声明一个变量a,同时指定它的类型为number,在之后a 的使用中必须是number类型 var a; a = 20; a = 10; // a = 'hello' // 此句会报错,前面一定指定了a 的类型为number // 字符串类型 var b; b = 'hello'; b = '12213'; //b = 111 //此句会报错,因为前面一定指定了b 的类型为string ,现在却赋值的是数字 // 二:声明完直接赋值 var c = true; c = false; // c = 123 // 报错 之前c 已经 声明为boolean类型了 // 三:只赋值不声明 如果变量的声明和赋值是同时进行的,TS可以自动对变量进行类型检测 var d = 123; d = 222; // d = false // 报错 虽然之前没有声明类型 ,但TS 会自动将第一次d 的赋值类型判断为默认类型TS拥有自动的类型判断机制,当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型。
所以如果的变量的声明和赋值是同时进行的,可以省略掉类型声明。
-
字面量
// 可以直接使用字面量进行声明 let a: 10; a = 10; // a = 11; 报错 // 可以使用 | 来连接多个类型(联合类型) let b: boolean | string; b = true; b = '12'; -
any 类型
// any 类型 表示对变量没有任何显示,编译器失去了对 TS 的检测功能(不建议使用) let c: any; c = true; c = 123; c = 'dsas'; let s: string; s = c; // any 类型的c 可以赋值给任何类型的变量 // 变量声明没有指定类型,则TS解析器会自动判断变量的类型为 any (隐式的any) let d; d = true; d = 123; d = 'dsas'; -
unknown 未知类型
// unknown 表示未知类型 let e: unknown; e = 123; e = false; e = 'dsas'; // unknown 实际上就是一个类型安全的any 该类型的变量不能直接赋值给他变量 // 想赋值给其他变量的方法如下: if (typeof e === 'string') { s = e } // 或者使用 类型断言 可以用来告诉解析器变量的实际类型 /* * 语法: * 变量 as 类型 * <类型>变量 */ s = e as string; s = <string>e; -
void 空值
// void 表示空值 返回值为空 可以为undefined null function fn (): void { // return 123; return; } -
never 没有值
// never 表示没有值 永远不会返回结果 不能为任何值 (用的较少) function fm (): never { throw new Error('报错了!'); } -
object 对象
// 1. object 表示一个js 对象 let v: object; v = {}; v = function () { }; // {} 用来指定对象中可以包含哪些属性 // 语法:{属性名:属性值,属性名:属性值} // 在属性名后加 ? 表示属性是可选的 let n: { name: string, age?: number } n = { name: '上完课', age: 12 } n = { name: '上完课' } // [propName:string]:any 表示任意类型的属性 propName是随意命名的 let x: { name: string, [propName: string]: any } x = { name: 'asd', age: 23 } // 2. 设置函数结构的类型声明 // 语法:(形参:类型,形参:类型...)=> 返回值 let f: (a: number, b: number) => number f = function (n1, n2): number { return n1 + n2 } -
array 数组
// 3. 数组 语法:类型[] let g: string[] g = ['1', '2'] // ② Array<number> let k: Array<number> k = [1, 2, 3] -
tuple 元组
// 元组 元组就是固定长度的数组 新增类型 // 语法: [类型,类型,类型] 类型和长度必须一致 let u: [string, number] u = ['12', 12] -
enum 枚举
// enum 枚举 新增类型 enum Gender { Male = 0, Female = 1 } let i: { name: string, gender: Gender }; i = { name: '孙悟空', gender: Gender.Male } console.log(i.gender === Gender.Male)