强类型语言,需要做数据类型的校验(JavaScript不做数据类型的校验,执行不下去会报错)
- 静态类型(本质是主动声明变量的数据类型)
let age: number = 30;
let name: string = "Alice";
- 类型推断(不显示声明变量数据类型,也会进行推断,过于智能补充一下案例)
2.1 根据值推断没有声明的数据类型
let age = 30; // TypeScript 推断 age 为 number 类型
let name = "Alice"; // TypeScript 推断 name 为 string 类型
2.2 函数返回值推断
function add(x: number, y: number) {return x + y; // 返回值被推断为 number 类型
}let result = add(5, 10); // result 被推断为 number
2.3 复杂类型推断
let numbers = [1, 2, 3]; // numbers 被推断为 number[] 类型
let user = { id: 1, name: "Alice" }; // user 被推断为 { id: number; name: string; } 类型
- 接口(可以理解为用户可以自行定义数据类型,可选属性用?标识,只读属性readonly,方法可以重载即实现的方法优先级高)
3.1基础介绍
interface Person {name: string;age: number;greet(): void; // 方法
}
const user: Person = {name: "Alice",age: 30,greet() {console.log(`Hello, my name is ${this.name}.`);},
};user.greet(); // 输出: Hello, my name is Alice.
3.2 扩展接口(接口可以通过继承来扩展其他接口,从而组合多个接口的属性。)
interface Animal {name: string;
}interface Dog extends Animal {bark(): void;
}const dog: Dog = {name: "Rex",bark() {console.log("Woof!");},
};dog.bark(); // 输出: Woof!
3.3接口与类(类可以实现接口,确保类的结构符合接口的定义)
interface User {
id: number;
name: string;
email?: string; // 可选属性
}
class UserAccount implements User {
id: number;
name: string;
email?: string;
constructor(id: number, name: string, email?: string) {this.id = id;this.name = name;if (email) this.email = email;
}
}
const account = new UserAccount(1, "Alice", "alice@example.com");
3.4索引签名
interface StringArray {[index: number]: string; // 数字索引返回字符串
}const strings: StringArray = ["hello", "world"];
console.log(strings[0]); // 输出: hello
-
类和继承
-
泛型
-
枚举(定义一组相关的常量,枚举值默认数字0并递增,支持字符串,支持字符串数字混用)
第一个枚举值为数字会自动递增,
第一个枚举值为字符串则必须生命
enum Direction {Up,Down,Left,Right,
}console.log(Direction.Up); // 输出: 0
console.log(Direction.Down); // 输出: 1// 支持反向映射 你也可以根据值访问名称
- 联合类型和交叉类型(联合类型即多类型中的一种使用竖线 | 来定义,交叉类型同时使用多类型特性使用 & 来定义)
type 声明数据类型 并相关类型对属性进行 运算
联合类型 即为仅为多种类型中的一种
交叉类型 即为同时存在 - 可选属性和只读属性(可选属性用?标识,只读属性readonly)
interface Product {readonly id: number; // 只读属性name: string;description?: string; // 可选属性
}const product: Product = {id: 1,name: "Laptop",// description 属性可以省略
};// product.id = 2; // 错误: 不能修改只读属性
- 模块和命名空间
模块机制 组织代码(导出,导入,默认导出) 基于文件去管理
命名空间 管理作用域 从全局视角去管理
模块化是es6标准,命名空间主要用于组织代码,避免命名冲突,适用于较大的项目。命名空间的成员可以在全局范围内访问,尤其是在 TypeScript 早期版本中广泛使用。
- 装饰器
在 tsconfig.json 文件中,启用装饰器支持:
{
"compilerOptions": {
"experimentalDecorators": true
}
}
类装饰器
类装饰器的执行顺序是在类定义时,所有的类装饰器会在构造函数被创建之前执行。
方法装饰器
方法装饰器在类的构造函数被创建时执行,且在实例方法被调用之前。
属性装饰器
属性装饰器在类的构造函数被创建时执行,且在类的实例化之前。
参数装饰器
参数装饰器在方法装饰器执行之前执行,用于记录参数的元数据。
执行顺序总结
类装饰器:首先执行,负责类的构造函数。
属性装饰器:其次执行,针对类的属性。
方法装饰器:接着执行,针对类的方法。
参数装饰器:最后执行,针对方法的参数。
主要用途
日志记录:可以在方法调用前后记录日志。
权限管理:可以检查用户权限。
验证:可以在方法执行前验证参数。
元数据:可以为类和方法添加元数据,方便后续处理。