一.简介

type(类型别名)是一种强大的工具,用于定义和复用复杂类型。它允许开发者为任何类型创建自定义名称,包括基本类型、联合类型、交叉类型等,从而提高代码的可读性和可维护性。

简单来说:type命令用来定义一个类型的别名。

比如下面得场景,就可以使用type

// 指定每一个值得类型
let person: { name: string; age: number };
person = { name: "John", age: 30 };

// 使用type:定义一个类型别名
// 接下来得到的变量p,p2,p3的类型都是Person类型
type Person = { name: string; age: number };
let p: Person = { name: "John", age: 30 };
let p2: Person = { name: "Mary", age: 25 };
let p3: Person = { name: "Tom", age: 40 };

二.用法

1. 基本类型别名
type int = number; // 定义number类型别名为int
function add(a: int, b: int): int { 
  return a + b;
}

2. 对象类型别名
type ID = string | number;
type User = {
  name: string;
  age: number;
  address?: string; // 可选属性
  readonly id: ID; // 只读属性
};
const user: User = {
  name: "Alice",
  age: 25,
  id: "123456",
};
user.address = "Beijing"; // 允许添加新属性
user.id = "789"; // 报错, 不允许修改只读属性

3. 函数类型别名
type fun = (data: any) => void;
type fun_number = (a: number, b: number) => number;

const add: fun_number = (x: number, y: number): number => x + y; // 必须按照类型定义的顺序来定义参数和返回值类型
console.log(add(2, 3)); //  5

4. 数组类型别名
type numbers = number[];
let myNumbers: numbers = [1, 2, 3, 4, 5];
console.log(myNumbers); // [1, 2, 3, 4, 5]

type numbers_array = number[][];
// 关于数组的另一种写法 type numbers_array = Array<Array<number>>;
let myNumbers_array: numbers_array = [
  [1, 2],
  [3, 4],
  [5, 6],
];
console.log(myNumbers_array); // [[1, 2], [3, 4], [5, 6]]

5. 元组类型别名
type Point = [number, number];

let p1: Point = [1, 2];
let p2: Point = [3, 4];

6. 联合类型别名
type status = "success" | "fail" | "pending";
type value = number | string | boolean;

let status_001: status = "success";
let value_001: value = 100;
console.log(status_001, value_001); // success 100

7. 交叉类型别名
type User = {
  name: string;
  age: number;
  address: string;
};

// 继承 User 类型并添加 role 属性
type Admin = User & {
  role: string;
};

const user: Admin = {
  name: "Alice",
  age: 25,
  address: "Beijing",
  role: "admin",
};
console.log(user);

8. 泛型类型别名
type Container<T> = {
  value: T;
  length: number;
};

type Pair<T, U> = [T, U];

type activity<type> = {
  name: string;
  type: type;
};

9. 条件类型别名
type Is_String<T> = T extends string ? true : false; // 判断是否是字符串类型
type Non_Nullable<T> = T extends null | undefined ? never : T; // 排除null和undefined类型

let str: Is_String<string> = true;
let num: Is_String<number> = false;
let strOrNum: Is_String<string | number> = true;
let strOrNull: Non_Nullable<string | null> = "hello";

三.type 的特性

1.别名不允许重名

在同一作用域内,不能定义两个同名的类型别名。

type Color = "red";
type Color = "blue"; // 报错

2.别名的作用域是块级作用域

类型别名的作用域遵循块级作用域规则。

type Color = "red";

if (Math.random() < 0.5) {
  type Color = "blue";
}

3.别名允许嵌套

类型别名可以嵌套使用,构建复杂的类型结构。

type Address = {
  street: string;
  city: string;
};

type Contact = {
  email: string;
  phone: string;
  address: Address; // 嵌套使用 Address 类型
};

4. 与 interface 的差异

特性 type interface
定义方式 使用 type 关键字 使用 interface 关键字
扩展方式 通过交叉类型(& 通过 extends 关键字
重复定义 不允许 允许(自动合并)
实现类 不能被类实现 可以被类实现(implements
适用场景 联合类型、交叉类型、基本类型别名 对象结构定义、类实现契约

四.总结

  • type 是定义类型别名的核心工具,支持基本类型、联合类型、交叉类型、泛型等。
  • 作用域遵循块级规则,同一作用域内不能重名。
  • 灵活嵌套和组合,可构建复杂类型结构。
  • 与 interface 互补,根据场景选择合适的类型定义方式。

下一篇:TypeScript---interface接口

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐