前言
TS 现在使用地越来越多,而且在vue3出来后越来越重要,就开始学习起来TS,在这从中记录,如果有出错的地方且需要改进的点,欢迎大佬指明。
一、类型声明
1.1 含义和作用
- 类型声明是ts的重要特性,通过类型声明可以指定TS中变量(参数、形参)的类型。
- 类型声明给变量指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错;
- 简单来说:类型声明是对变量的一种约束。
1.2 语法
- 单纯的变量声明
let 变量: 类型;
- 变量的声明和赋值,同时进行
let 变量: 类型 = 值;
// 可简化为:
let 变量 = 值;
// 因为当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型,所以可以省略类型声明
- 函数中类型声明
function fn(参数: 类型, 参数: 类型): 类型{
...
}
二、基础类型
1.1 boolean类型
let isDool: boolean = false;
isDool = true
1.2 number类型
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
let big: bigint = 100n;
1.3 string类型
let name: string = 'lily';
let age: number = 16;
let speak: string;
speak = `我的名字叫${name}, 我今年${age}`;
1.4 字面量类型
通过字面量可以确定变量的取值范围
- 限制变量的值
let num: 1;
// 相当于 const num = 1; 设置固定值,赋其他的值会报错
// num = 2; (报错)
let val: 2 | 3 | 4;
// 限制val后面的取值只能在这个范围
// val = 5; (报错)
- 使用字面量去指定变量的类型
let a: boolean | string;
a = false;
a = '123'
// a = 1 ; (报错)
1.5 any类型
- 属于任意类型 注意:声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
let b: any = 'hello';
b = 1;
b = true;
- 变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
注意: 未声明类型的变量虽然一开始被识别为
any类型,但是经过赋值后,TS 会根据赋值类型来标识变量的类型
let value;
value = 'seven';
let val = value - 1;
value = 7;
let val1 = value - 1;
1.6 unknown类型
- 表示未知类型的值,赋任意类型的值,跟
any类型相似 - any类型与unknown不同点是什么?
// 当any类型时,可赋值给任意变量,且不会报错
let a:any;
let b:string;
b = a
// 当unknown类型时,赋值任意变量时,会出现报错
let c: unknown;
b = c; (报错)
- unknown 实际上就是一个类型安全的any, unknown类型的变量,不能直接赋值给其他变量
1.7 void类型
- 表示空值,以函数为例,就表示没有返回值的函数
function fn(): void{
}
简化:当函数不写return时,TS编译器会自动判断函数返回值为void类型
function fn(){
}
- 申明为
void类型的变量,只能赋予undefined和null
let unusable: void = undefined;
1.8 never类型
- 表示不会返回结果
- 声明返回值为never的函数,就函数必须中途必定中断,无法到达的终点,即这个函数永远不能执行结束
// 函数必须中途必定中断,无法到达的终点
function error(message: string): never {
throw new Error(message);
}
// 函数永不结束,陷入死循环
function cycle(): never{
while(true){
console.log('循环')
}
}
1.9 object类型
- 一般不会这么用
let obj: object = {};
- 在对象中一般限制对象中属性的类型和方法
- {} 用来指定对象中可以包含哪些属性
- 语法: {属性名:属性值,属性名?:属性值, [propName: string]: any }
let d: {name: string, age: number}
d = {name: 'tom', age: 18}
// 注意:当d对象中少了name或者age会报错,多了一个属性也会报错
// 当属性赋值是可有可无时,在属性名后面加上?, 表示属性是可选的
let e: {name: string, age?: number}
e = {name: 'tom'}
//当对象中多个属性是不固定时,可使用[propName: string]: any 表示任意类型的属性
let f: {name: string, [propName: string]:any};
f = {name: 'jery', age: 16, sex: '男'}
- 设置函数结构的类型声明: 语法: (形参: 类型, 形参: 类型...) => 返回值类型
let g: (a:number, b:number) => number
1.10 array类型
- 限制数组中内容的类型
- 语法: 类型 [] Array<类型>
let h: string[];
let i: Array<string>;
1.11 tuple类型
- 元组,就是固定长度的数组
- 语法: [类型,类型]
let x: [string, number];
x = ["hello", 10];
1.12 enum类型
- 枚举,TS中新增类型
- 枚举用于表示固定的几个取值
enum Color {
Red,
Green,
Blue,
}
let c: Color = Color.Green;
// 注意点: TS中的枚举类型的取值, 默认是从上至下从0开始递增的
//虽然默认是从0开始递增的, 但是我们也可以手动的指定枚举的取值的值
enum Color {
Red = 1,
Green,
Blue,
}
let c: Color = Color.Green;
//注意点: 如果手动指定了前面枚举值的取值, 那么后面枚举值的取值会根据前面的值来递增
//注意点: 如果手动指定了后面枚举值的取值, 那么前面枚举值的取值不会受到影响
enum Color {
Red = 1,
Green = 2,
Blue = 4,
}
let c: Color = Color.Green;
三、类型断言
1.1 是什么?
有些情况下,变量的类型对于我们来说是很明确,但是TS编译器却并不清楚,此时,可以通过类型断言来告诉编译器变量的类型
1.2 作用
告诉解析器变量的实际类型,通常解决unknown声明变量的赋值
1.3 语法
- 变量 as 类型
let c: unknown;
b = c as string;
- <类型>变量
let c: unknown;
b = <string>c;
四、类型别名
type (可以给一个类型定义一个名字)多用于符合类型
type myType = 1 | 2 | 3 | 4 | 5;
let n: myType;
n = 1;
五、 | 与 & 符号
- | 表示 或 语法: 类型 | 类型
let k : 1 | 2 ;
k = 1;
k = 2;
let l : string | number;
l = 'hello';
l = 100
- & 表示 且,连接两个对象,同时满足 语法: {属性名: 类型} & {属性名: 类型}
let j: {name: string} & {age: string}
j = {name: 'j', age: 18}