在 Vue 项目中,如何进行 TypeScript 的最佳实践,包括类型定义、接口、泛型和类型断言?

各位靓仔靓女,今天咱们来唠唠 Vue 项目里 TypeScript 的那些事儿,保证让你的代码像加了Buff一样,既安全又高效!

开场白:TypeScript,Vue 的“贴身保镖”

TypeScript (简称 TS) 这玩意儿,简直是 Vue 的“贴身保镖”,有了它,就能在开发阶段提前发现 Bug,避免运行时出现各种“幺蛾子”。当然,要用好这个保镖,还得掌握一些“武功秘籍”。

第一式:类型定义(Types):你的变量要“户口本”

在 JavaScript 里,变量就像个“黑户”,想装啥就装啥,一会儿是字符串,一会儿又是数字,搞得人晕头转向。TypeScript 就不一样了,它要求每个变量都要有个“户口本”,也就是明确的类型定义。

1. 基础类型

  • 字符串 (string)const name: string = '张三';
  • 数字 (number)const age: number = 18;
  • 布尔值 (boolean)const isStudent: boolean = true;
  • 数组 (array)const numbers: number[] = [1, 2, 3]; 或者 const names: Array<string> = ['李四', '王五'];
  • 元组 (tuple)const person: [string, number] = ['赵六', 20]; (固定长度和类型的数组)
  • 枚举 (enum)
enum Color {
  Red,
  Green,
  Blue,
}
const myColor: Color = Color.Green; // myColor 的值为 1
  • Any (any):相当于放弃类型检查,慎用!let something: any = '随便装啥都行';
  • Void (void):表示没有返回值,常用于函数。function sayHello(): void { console.log('Hello!'); }
  • Null 和 Undefined (null, undefined)const nothing: null = null; const notDefined: undefined = undefined;
  • Never (never):表示永远不会到达的类型,比如抛出异常的函数。
function throwError(message: string): never {
  throw new Error(message);
}

2. 对象类型

对象类型可以使用接口(interface)或者类型别名(type alias)来定义。

示例代码:

// 使用接口
interface Person {
  name: string;
  age: number;
  address?: string; // 可选属性
}

const student: Person = {
  name: '小明',
  age: 16,
};

// 使用类型别名
type Point = {
  x: number;
  y: number;
};

const origin: Point = {
  x: 0,
  y: 0,
};

类型定义总结:

| 类型 | 描述 |
| ——– | ———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————— 2024-02-29 15:41:29
| 类型推断 | TypeScript 有时候很聪明,可以自己推断出变量的类型,不需要你显式声明。比如:const message = 'Hello'; (message 会被自动推断为 string 类型)。

第二式:接口(Interfaces):规范你的对象

接口就像一份“合同”,规定了对象应该有哪些属性,以及这些属性的类型。它能帮助你确保对象的结构符合预期。

示例代码:

interface User {
  id: number;
  name: string;
  email: string;
  isAdmin?: boolean; // 可选属性
  createdAt: Date; //日期类型
  updateInfo():void;
}

const adminUser: User = {
  id: 1,
  name: '管理员',
  email: '[email protected]',
  isAdmin: true,
  createdAt: new Date(),
  updateInfo: () => {
      console.log('update admin info');
  }
};

const normalUser: User = {
  id: 2,
  name: '普通用户',
  email: '[email protected]',
  createdAt: new Date(),
  updateInfo: () => {
      console.log('update user info');
  }
};

接口的优势:

  • 代码可读性:接口清晰地描述了对象的结构,方便阅读和理解。
  • 代码可维护性:修改接口后,TypeScript 会检查所有使用该接口的地方,确保代码的一致性。
  • 代码重用性:接口可以被多个对象实现,提高代码的重用性。

接口和类型别名的区别:

  • 接口主要用于定义对象类型,而类型别名可以用于定义各种类型,包括联合类型、交叉类型等。
  • 接口可以被 implements 实现,类型别名不行。
  • 在定义联合类型或者交叉类型时,通常使用类型别名。

第三式:泛型(Generics):让你的函数更灵活

泛型就像“万金油”,可以让你编写出适用于多种类型的函数或组件。它可以避免代码重复,提高代码的灵活性。

1. 泛型函数

function identity<T>(arg: T): T {
  return arg;
}

const myString: string = identity<string>('hello');
const myNumber: number = identity<number>(123);

2. 泛型接口

interface Result<T> {
  data: T;
  message: string;
  code: number;
}

const successResult: Result<string> = {
  data: '操作成功',
  message: 'success',
  code: 200,
};

const errorResult: Result<null> = {
  data: null,
  message: '操作失败',
  code: 500,
};

3. 泛型类

class DataHolder<T> {
  data: T;

  constructor(data: T) {
    this.data = data;
  }

  getData(): T {
    return this.data;
  }
}

const stringHolder = new DataHolder<string>('Hello');
const numberHolder = new DataHolder<number>(42);

**泛型的优势:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注