TypeScript---type类型
·
一.简介
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 互补,根据场景选择合适的类型定义方式。
更多推荐
所有评论(0)