Interface 中的运算符操作
#typescript
目录
- 1.
交叉类型
运算符 (&) ,需要配合 type 的&
- 2.
联合类型
运算符 (|) - 3. 类型映射运算符
- 4. 条件类型运算符
- 5. 键类型运算符
- 6. 高级运算符组合
- 7.
Record<K, T>
1. 交叉类型
运算符 (&) ,需要配合 type 的 &
交叉类型运算符 &
用于组合多个类型为一个类型,包含了所有类型的特性:
interface BusinessPartner {
name: string;
credit: number;
}
interface Identity {
id: number;
email: string;
}
interface Contact {
phone: string;
address: string;
}
// 使用交叉类型组合接口
type Employee = Identity & BusinessPartner & Contact;
// 使用组合后的类型
const employee: Employee = {
id: 100,
email: "john@example.com",
name: "John Doe",
credit: 1000,
phone: "123-456-7890",
address: "123 Main St"
};
2. 联合类型
运算符 (|)
联合类型运算符 |
表示一个值可以是几种类型之一:
interface Bird {
fly(): void;
layEggs(): void;
}
interface Fish {
swim(): void;
layEggs(): void;
}
// 联合类型
type Pet = Bird | Fish;
function getPet(): Pet {
// 返回的可以是 Bird 或 Fish
return {
swim: () => console.log("Swimming..."),
layEggs: () => console.log("Laying eggs...")
};
}
3. 类型映射运算符
3.1. Partial<T>
,包装过的泛型
使所有属性变为可选:
interface User {
name: string;
age: number;
email: string;
}
// 所有属性都变为可选
type PartialUser = Partial<User>;
// 等价于:
// {
// name?: string;
// age?: number;
// email?: string;
// }
3.2. Required<T>
,包装过的泛型
使所有属性变为必需:
interface Config {
name?: string;
age?: number;
}
// 所有属性都变为必需
type RequiredConfig = Required<Config>;
// 等价于:
// {
// name: string;
// age: number;
// }
3.3. Readonly<T>
,包装过的泛型
使所有属性只读:
interface Mutable {
name: string;
value: number;
}
// 所有属性变为只读
type Immutable = Readonly<Mutable>;
// 等价于:
// {
// readonly name: string;
// readonly value: number;
// }
4. 条件类型运算符
使用 extends
关键字进行条件类型判断:
type ExtractType<T> = T extends string ? string : number;
// 根据条件返回不同的类型
type StringType = ExtractType<string>; // string
type NumberType = ExtractType<number>; // number
5. 键类型运算符
5.1. keyof
获取对象类型的所有键:
interface Person {
name: string;
age: number;
address: string;
}
// 获取所有键
type PersonKeys = keyof Person; // "name" | "age" | "address"
// 实际应用
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
5.2. Pick<T, K>
从类型中选择部分属性:
interface Todo {
title: string;
description: string;
completed: boolean;
}
// 只选择部分属性
type TodoPreview = Pick<Todo, "title" | "completed">;
// 等价于:
// {
// title: string;
// completed: boolean;
// }
5.3. Omit<T, K>
从类型中排除某些属性:
interface User {
id: number;
name: string;
password: string;
}
// 排除敏感信息
type PublicUser = Omit<User, "password">;
// 等价于:
// {
// id: number;
// name: string;
// }
6. 高级运算符组合
可以组合多个运算符来创建复杂的类型:
interface User {
id: number;
name: string;
email: string;
password: string;
}
// 组合多个类型运算符
type PartialPublicUser = Partial<Omit<User, "password">>;
// 等价于:
// {
// id?: number;
// name?: string;
// email?: string;
// }
7. Record<K, T>
创建具有指定键类型和值类型的对象类型:
type PageInfo = {
title: string;
url: string;
}
// 创建字符串索引的对象类型
type Pages = Record<string, PageInfo>;
const pages: Pages = {
home: { title: "Home", url: "/" },
about: { title: "About", url: "/about" }
};