TS是一个可选的静态的类型系统
需要在变量、函数的参数、函数的返回值后面加上: 类型
基本类型
- number:数字
let num: number = 123;
- string:字符串
let str: string = "abc";
- boolean:布尔值
let isTrue: boolean = true;
- 数组
let arr1: number[] = [123, 234];
// 或
let arr2: Array<number> = [1, 2, 3];
- object:对象
function printValues(obj: object) {
const vals = Object.values(obj);
vals.forEach(v => console.log(v))
}
- null 和 undefined:空
null 和 undefined 是所有其他类型的子类型,它可以赋值给其他类型
在配置中添加strictNullChecks: true
可以获得更严格的空类型检查,此后null和undefined只能赋值给自身
其他常用类型
- 联合类型:多种类型任选其一,配合类型保护进行判断
let name: string | undefined = undefined;
- void类型:通常用于约束函数的返回值,表示该函数没有任何返回值
function printMenu() {
console.log("1. 登陆");
console.log("2. 注册");
}
- never类型:通常用于约束函数的返回值,表示该函数永远不可能结束
function throwError(msg: string): never {
throw new Error(msg);
}
- 字面量类型:使用一个值进行约束
let a: "A";
- 元祖类型(Tuple):一个固定长度的数组,并且数组中每一项的类型确定
let tuple: [string, number];
- any类型:可以绕过类型检查,any类型的数据可以赋值给任意类型
let data: any = "abcde";
let num: number = data;
类型别名
对已知的一些类型定义名称,type 类型名 = ...
type Gender = "男" | "女"
type User = {
name: string
age: number
gender: Gender
}
let u: User = {
name: "张三",
age: "18",
gender: "男"
}
function getUsers(g: Gender): User[] {
return []
}
函数的相关约束
函数重载:在函数实现之前,对函数调用的多种情况进行声明
function combine(a: number, b: number): number;
function combine(a: string, b: string): string;
function combine(a: string | number, b: string | number): string | number {
if (typeof a === "string" && typeof b === "string") {
return a + b
} else if (typeof a === "number" && typeof b === "number") {
return a * b
} else {
throw new Error("a和b类型必须相同")
}
}
可选参数:可以在某些参数名后加上?
,表示该参数可以不用传递,可选参数必须在参数列表的末尾
function sum(a: number, b: number, c?: number) {
}
sum(3, 4)
sum(3, 4, 5)
枚举
用于解决类型别名 逻辑含义与真实含义相混淆的问题
定义枚举:
enum 枚举名 {
枚举字段1 = 值1,
枚举字段2 = 值2,
...
}
enum Gender {
male = '男',
female = '女',
}
枚举的规则:
- 枚举的字段可以是数字,也可以是字符串
- 数字枚举的值会自动自增
- 被数字枚举约束的变量,可以直接赋值为数字(可能会导致一些问题,尽量避免)
- 数字枚举的编译结果 和 字符串枚举有差异
- 尽量不要在一个枚举中即出现字符串字段,又出现数字字段
- 使用枚举时,尽量使用枚举字段的名称,而不使用真实的值
接口
用于约束类、对象、函数的标准
接口与类型别名一样,不出现在编译结果中
// 约束对象
interface User {
name: string
age: number
}
// 约束函数 - 对象中的函数
interface User {
name: string
age: number
sayHello1: () => void
sayHello2(): void
}
// 约束函数 - 直接约束
interface Condition {
(n: number): boolean
}
接口的继承
interface A {
T1: string
}
interface B extends A {
T2: number
}
interface C extends A, B {
T3: boolean;
}