TS梳理

强类型语言,需要做数据类型的校验(JavaScript不做数据类型的校验,执行不下去会报错)

  1. 静态类型(本质是主动声明变量的数据类型)
let age: number = 30;
let name: string = "Alice";
  1. 类型推断(不显示声明变量数据类型,也会进行推断,过于智能补充一下案例)
    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; } 类型
  1. 接口(可以理解为用户可以自行定义数据类型,可选属性用?标识,只读属性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
  1. 类和继承

  2. 泛型(用户用自己的数据类型来使用组件)
    TS强类型语言,做数据类型校验,在这个思路下,统一方法多数据类型,用户每一个数据类型都需要写一个方法。
    泛型就是优雅的解决这一个问题。

  3. 枚举(定义一组相关的常量,枚举值默认数字0并递增,支持字符串,支持字符串数字混用)
    第一个枚举值为数字会自动递增,
    第一个枚举值为字符串则必须生命

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

console.log(Direction.Up);    // 输出: 0
console.log(Direction.Down);  // 输出: 1

// 支持反向映射  你也可以根据值访问名称
  1. 联合类型和交叉类型(联合类型即多类型中的一种使用竖线 | 来定义,交叉类型同时使用多类型特性使用 & 来定义)
    type 声明数据类型 并相关类型对属性进行 运算
    联合类型 即为仅为多种类型中的一种
    交叉类型 即为同时存在
  2. 可选属性和只读属性(可选属性用?标识,只读属性readonly)
interface Product {
    readonly id: number;    // 只读属性
    name: string;
    description?: string;   // 可选属性
}

const product: Product = {
    id: 1,
    name: "Laptop",
    // description 属性可以省略
};

// product.id = 2; // 错误: 不能修改只读属性
  1. 模块和命名空间
    模块机制 组织代码(导出,导入,默认导出) 基于文件去管理
    命名空间 管理作用域 从全局视角去管理

模块化是es6标准,命名空间主要用于组织代码,避免命名冲突,适用于较大的项目。命名空间的成员可以在全局范围内访问,尤其是在 TypeScript 早期版本中广泛使用。

  1. 装饰器
    在 tsconfig.json 文件中,启用装饰器支持:
    {
    "compilerOptions": {
    "experimentalDecorators": true
    }
    }
    类装饰器
    类装饰器的执行顺序是在类定义时,所有的类装饰器会在构造函数被创建之前执行。

方法装饰器
方法装饰器在类的构造函数被创建时执行,且在实例方法被调用之前。

属性装饰器
属性装饰器在类的构造函数被创建时执行,且在类的实例化之前。

参数装饰器
参数装饰器在方法装饰器执行之前执行,用于记录参数的元数据。

执行顺序总结
类装饰器:首先执行,负责类的构造函数。
属性装饰器:其次执行,针对类的属性。
方法装饰器:接着执行,针对类的方法。
参数装饰器:最后执行,针对方法的参数。
主要用途
日志记录:可以在方法调用前后记录日志。
权限管理:可以检查用户权限。
验证:可以在方法执行前验证参数。
元数据:可以为类和方法添加元数据,方便后续处理。

posted @ 2025-03-19 02:13  张正1998  阅读(11)  评论(0)    收藏  举报