3 常用类型
3.1 类型注解
ts
let age:number = 18
3.2 常用基础类型概述
- JS已有类型
- 原始类型: number/string/boolean/null/undefined/symbol
- 对象类型: object(数组,对象,函数)
- TS新增类型
- 联合类型,自定义类型(类型别名),接口,元组,字面量类型,枚举,void,any
3.3 原始类型
原始类型: number/string/boolean/null/undefined/symbol
tslet age: number = 18; let myName: string = "刘老师"; let isLoading: boolean = false;
3.4 数组类型
- 对象类型: object(数组,对象,函数)
对象类型,每个具体的对象都有自己的类型语法
数组类型,两种写法
ts
let arr1: number[] = [1, 2, 3];// 推荐
let arr2: Array<number> = [1, 2, 3];
let arr3: (number | string)[] = [1, "2", 3];
let arr4: Array<number | string> = [1, "2", 3];
提示
解释:| (竖线)在 TS 中叫做联合类型
(由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种)。
3.5 类型别名type
类型别名(自定义类型):为任意类型起别名。
ts
type CustomArray = (number | string)[];
const arr1: CustomArray = [1, "a", 3, "b"];
const arr2: CustomArray = ["x", "y", 6, 7];
3.6 函数类型
- 函数的类型实际上指的是:函数参数和返回值的类型。
3.6.1 为函数指定类型
单独指定参数、返回值的类型:
tsfunction add(num1: number, num2: number): number { return num1 + num2; } const add1 = (num1: number, num2: number): number => { return num1 + num2; };
同时指定参数、返回值的类型:
tsconst add2: (num1: number, num2: number) => number = (num1, num2) => { return num1 + num2; };
3.6.1 返回值,可选参数
无返回值void
如果函数没有返回值,那么,函数返回值类型为:void。
tsfunction greet(name: string): void { console.log("Hello", name); }
可选参数?
注意:可选参数只能出现在参数列表的最后,也就是说可选参数后面不能再出现必选参数ts function mySlice(start?: number, end?: number): void { console.log("起始索引:", start, "结束索引", end); }
3.7 对象类型
JS 中的对象是由属性和方法构成的,而 TS 中对象的类型就是在描述对象的结构(有什么类型的属性和方法)
3.7.1 写法
ts
let person: { name: string; age: number; say(): void } = {
name: "jack",
age: 19,
say() {},
};
let person: { name: string; age: number; say: () => void } = {
name: "jack",
age: 19,
say() {},
};
3.7.2 可选属性
ts
function myAxios(config: { url: string; method?: string }) {
console.log(config);
}
3.8 接口interface
3.8.1 使用
ts
interface IPerson {
name: string;
age: number;
sayHi(): void;
}
let person: IPerson = {
name: "john",
age: 19,
sayHi() {},
};
3.8.2 type与interface不同点
- 接口,只能为对象指定类型。
- 类型别名,不仅可以为对象指定类型,实际上可以为任意类型指定别名。
3.8.3 接口继承
ts
interface Point2D {
x: number;
y: number;
}
interface Point3D extends Point2D {
z: number;
}
const point3D: Point3D = { x: 1, y: 2, z: 3 }; // OK
3.9 元组Tuple
元组类型是另一种类型的数组,它确切地知道包含多少个元素,以及特定索引对应的类型
ts
let position: number[] = [39.5427, 116.2317];// 数组
let position2: [number, number] = [39.5427, 116.2317];//元组
3.10 类型推论
发生类型推论的地方尽量省略
3.10.1 常见场景
声明变量并初始化时
tslet age:number let age = 18 //推荐
决定函数返回值时。
tsfunction add(num1:number,num2:number):number function add(num1:number,num2:number){return num1+num2}//推荐
3.11 类型断言
ts
const aLink = document.getElementById('link') as HTMLAnchorElement // 推荐
const aLink = <HTMLAnchorElement>document.getElementById('link')
提示
技巧:使用console.dir()可以快速查看对象类型
3.12 字面量类型
3.12.1 基本使用
除字符串外,任意的 JS 字面量(比如,对象、数字等)都可以作为类型使用
ts
let str1 = 'Hello TS'// 类型string
const str2 = 'Hello Ts'//类型‘Hello TS’
3.12.2 与联合类型
ts
function changeDirection(direction:'up'|'down'|'left'|'right'){
console.log(direction);
}
3.13 枚举
枚举的功能类似于字面量类型+联合类型组合的功能,也可以表示一组明确的可选值
ts
enum Direction{Up,Down,Left,Right}
function changeDirection(direction:Direction){
console.log(direction);
}
changeDirection(Direction.Up);
3.13.1 数字枚举
- 默认从0开始自增
- 也可初始化值
ts
enum Direction{Up,Down,Left,Right} // Right=3
enum Direction{Up=2,Down=4,Left=8,Right} // Right=9
3.13.2 字符串枚举
注意:字符串枚举没有自增长行为,因此,字符串枚举的每个成员必须有初始值。
ts
enum Direction {
Up = "UP",
Down = "DOWN",
Left = "LEFT",
Right = "RIGHT",
}
3.13.2 值
- 枚举可作类型,可提供值(枚举成员都是有值的)
- 推荐使用字面量类型+联合类型组合的方式
3.14 any类型
不推荐使用any!,最多临时使用
ts
let obj:any = {x:0} //显示声明
let a;//隐式声明any
function(num1,num2){} //隐式声明
3.15 typeof
- TS中的typeof,根据已有变量的值,获取该值的类型,来简化类型书写。
- typeof 只能用来查询变量或属性的类型,无法查询其他形式的类型(比如,函数调用的类型)
ts
let p = { x: 1, y: 2 };
function formatPoint(point: { x: number; y: number }) {}
formatPoint(p);
function formatPoint2(point: typeof p) {}//同typeof 获取p的类型