Skip to main content

实用工具类型

1. 基础类型转换工具

Partial<Type>

将类型的所有属性变为可选(?)。

type User = {
name: string;
age: number;
};

type PartialUser = Partial<User>;
// 等价于: { name?: string; age?: number }

Required<Type>

将类型的所有可选属性变为必选。

type Options = {
timeout?: number;
retry?: boolean;
};

type RequiredOptions = Required<Options>;
// 等价于: { timeout: number; retry: boolean }

Readonly<Type>

将类型的所有属性变为只读(readonly)。

type Point = {
x: number;
y: number;
};

type ReadonlyPoint = Readonly<Point>;
// 等价于: { readonly x: number; readonly y: number }

2. 对象属性操作工具

Record<Keys, Type>

创建一个包含指定键和值类型的对象类型。

type Weekday = 'Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri';
type DayTemp = Record<Weekday, number>;
// 等价于: { Mon: number; Tue: number; ...; Fri: number }

Pick<Type, Keys>

从类型中选择指定的属性。

type User = {
id: number;
name: string;
age: number;
};

type UserName = Pick<User, 'id' | 'name'>;
// 等价于: { id: number; name: string }

Omit<Type, Keys>

从类型中移除指定的属性。

type User = {
id: number;
name: string;
age: number;
email: string;
};

type UserWithoutEmail = Omit<User, 'email' | 'age'>;
// 等价于: { id: number; name: string }

3. 联合类型操作工具

Exclude<UnionType, ExcludedMembers>

从联合类型中排除某些成员。

type Numbers = 1 | 2 | 3 | 4 | 5;
type EvenNumbers = Exclude<Numbers, 1 | 3 | 5>;
// 结果: 2 | 4

Extract<Type, Union>

从类型中提取符合联合类型的成员。

type Values = string | number | boolean | null;
type PrimitiveValues = Extract<Values, string | number | boolean>;
// 结果: string | number | boolean

NonNullable<Type>

从类型中排除 nullundefined

type Input = string | number | null | undefined;
type CleanedInput = NonNullable<Input>;
// 结果: string | number

4. 函数类型操作工具

Parameters<Type>

获取函数的参数类型组成的元组。

type Func = (a: string, b: number) => void;
type Params = Parameters<Func>;
// 结果: [string, number]

ConstructorParameters<Type>

获取类构造函数的参数类型组成的元组。

class Person {
constructor(name: string, age: number) {}
}

type PersonParams = ConstructorParameters<typeof Person>;
// 结果: [string, number]

ReturnType<Type>

获取函数的返回值类型。

type GetUser = () => { id: number; name: string };
type UserType = ReturnType<GetUser>;
// 结果: { id: number; name: string }

InstanceType<Type>

获取类的实例类型。

class Point {
x: number;
y: number;
}

type PointInstance = InstanceType<typeof Point>;
// 结果: Point

5. 高级类型工具

Awaited<Type>

递归展开 Promise 类型,获取最终的 resolved 值类型。

type A = Awaited<Promise<string>>;
// 结果: string

type B = Awaited<Promise<Promise<number>>>;
// 结果: number

NoInfer<Type>

阻止类型推断,保留泛型参数的精确类型。

type NoInfer<T> = [T][T extends any ? 0 : never];

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

// 不使用 NoInfer,类型会被推断为 number
const result1 = identity(123);

// 使用 NoInfer,类型保持为字面量 123
const result2 = identity<NoInfer<123>>(123);

6. 上下文类型工具

ThisParameterType<Type>

获取函数的 this 参数类型。

type GetThis = (this: { name: string }) => void;
type ThisType = ThisParameterType<GetThis>;
// 结果: { name: string }

OmitThisParameter<Type>

移除函数类型中的 this 参数。

type Func = (this: Window, x: number) => void;
type NewFunc = OmitThisParameter<Func>;
// 结果: (x: number) => void

ThisType<Type>

在对象字面量中指定 this 的类型(需配合 --noImplicitThis 选项)。

type ObjectDescriptor<D, M> = {
data?: D;
methods?: M & ThisType<D & M>; // 方法中的 this 类型为 D & M
};

const obj: ObjectDescriptor<{ x: number }, { printX(): void }> = {
data: { x: 10 },
methods: {
printX() {
console.log(this.x); // this 类型为 { x: number } & { printX(): void }
}
}
};

7. 字符串操作工具

Uppercase<StringType>

将字符串类型转换为大写。

type Greeting = "hello";
type ShoutGreeting = Uppercase<Greeting>;
// 结果: "HELLO"

Lowercase<StringType>

将字符串类型转换为小写。

type Greeting = "HELLO";
type QuietGreeting = Lowercase<Greeting>;
// 结果: "hello"

Capitalize<StringType>

将字符串的首字母转换为大写。

type Name = "john";
type CapitalizedName = Capitalize<Name>;
// 结果: "John"

Uncapitalize<StringType>

将字符串的首字母转换为小写。

type ID = "Id";
type UncapitalizedID = Uncapitalize<ID>;
// 结果: "id"

总结

这些工具类型是 TypeScript 类型系统的强大辅助,可帮助你:

  1. 简化类型定义:如 PartialRequiredReadonly
  2. 操作对象结构:如 PickOmitRecord
  3. 处理联合类型:如 ExcludeExtractNonNullable
  4. 解析函数和类类型:如 ParametersReturnTypeInstanceType
  5. 处理异步类型:如 Awaited
  6. 操作字符串类型:如 UppercaseCapitalize