Typescript - 12. Utility Types

70 阅读2分钟

TypeScript 提供了一些常用的实用类型(Utility Types),这些类型可以帮助开发者在处理常见的类型转换和操作时更加简洁和高效。以下是一些常见的实用类型及其用途:

1. Partial<T>

Partial<T> 将对象类型的所有属性变为可选。

interface User {
    id: number;
    name: string;
    email: string;
}

let partialUser: Partial<User> = {
    name: "John"
};

2. Required<T>

Required<T> 将对象类型的所有属性变为必需。

interface User {
    id?: number;
    name?: string;
    email?: string;
}

let requiredUser: Required<User> = {
    id: 1,
    name: "John",
    email: "john@example.com"
};

3. Readonly<T>

Readonly<T> 将对象类型的所有属性变为只读。

interface User {
    id: number;
    name: string;
    email: string;
}

let readonlyUser: Readonly<User> = {
    id: 1,
    name: "John",
    email: "john@example.com"
};

// readonlyUser.id = 2; // Error: Cannot assign to 'id' because it is a read-only property.

4. Record<K, T>

Record<K, T> 构造一个对象类型,其属性键由类型 K 的值构成,属性值为类型 T

type Role = "admin" | "user" | "guest";

interface UserInfo {
    id: number;
    name: string;
}

let users: Record<Role, UserInfo> = {
    admin: { id: 1, name: "Admin User" },
    user: { id: 2, name: "Regular User" },
    guest: { id: 3, name: "Guest User" }
};

5. Pick<T, K>

Pick<T, K> 从类型 T 中挑选出一组属性 K 来构造新类型。

interface User {
    id: number;
    name: string;
    email: string;
    age: number;
}

let userContactInfo: Pick<User, "email" | "name"> = {
    name: "John",
    email: "john@example.com"
};

6. Omit<T, K>

Omit<T, K> 从类型 T 中移除一组属性 K 来构造新类型。

interface User {
    id: number;
    name: string;
    email: string;
    age: number;
}

let userWithoutEmail: Omit<User, "email"> = {
    id: 1,
    name: "John",
    age: 30
};

7. Exclude<T, U>

Exclude<T, U> 从类型 T 中排除那些可以赋值给类型 U 的属性。

type T = "a" | "b" | "c";
type U = "a" | "d";

type Excluded = Exclude<T, U>; // "b" | "c"

8. Extract<T, U>

Extract<T, U> 从类型 T 中提取所有可以赋值给类型 U 的属性。

type T = "a" | "b" | "c";
type U = "a" | "d";

type Extracted = Extract<T, U>; // "a"

9. NonNullable<T>

NonNullable<T> 去除类型 T 中的 nullundefined

type MaybeString = string | null | undefined;

type DefinitelyString = NonNullable<MaybeString>; // string

10. ReturnType<T>

ReturnType<T> 获取函数类型 T 的返回类型。

function getUser() {
    return { id: 1, name: "John" };
}

type User = ReturnType<typeof getUser>; // { id: number; name: string; }

11. InstanceType<T>

InstanceType<T> 获取构造函数类型 T 的实例类型。

class User {
    constructor(public id: number, public name: string) {}
}

type UserInstance = InstanceType<typeof User>; // User

12. ThisType<T>

ThisType<T> 用于指定上下文对象的 this 类型。通常与对象字面量类型和 noImplicitThis 一起使用。

interface User {
    id: number;
    name: string;
}

const user = {
    id: 1,
    name: "John",
    log(): void {
        console.log(this.id, this.name);
    }
} as ThisType<User>;

以上是一些常用的 TypeScript 实用类型,它们可以帮助我们更方便地进行类型操作,提高代码的可读性和维护性。通过合理使用这些实用类型,可以使 TypeScript 更加强大和灵活。