TypeScript 语言 进阶技巧 类型缩小的高级方法

TypeScript阿木 发布于 2025-05-28 5 次阅读


TypeScript 类型缩小【1】的高级方法

在 TypeScript 中,类型缩小(Type Narrowing)是一种强大的特性,它允许我们根据某些条件来缩小一个变量的类型。这对于编写健壮的代码、避免运行时错误以及提高代码的可读性至关重要。本文将深入探讨 TypeScript 类型缩小的高级方法,包括一些不常见的技巧和最佳实践。

类型缩小通常发生在几个场景中:类型守卫【2】、类型谓词【3】、类型断言【4】和条件类型【5】。这些方法可以帮助我们根据不同的条件来缩小变量的类型。我们将重点关注一些高级的技巧,这些技巧可以帮助我们更灵活和高效地使用类型缩小。

类型守卫

类型守卫是 TypeScript 中最常用的类型缩小方法之一。它允许我们在运行时检查一个变量的类型,并根据结果缩小其类型。

1. 字面量类型守卫【6】

字面量类型守卫是最简单的类型守卫形式,它通过比较变量的值与特定的字面量值来缩小类型。

typescript
function isString(value: any): value is string {
return typeof value === 'string';
}

const value: string | number = 'Hello';

if (isString(value)) {
console.log(value.toUpperCase()); // 类型缩小为 string
} else {
console.log(value.toFixed(2)); // 类型缩小为 number
}

2. 索引访问类型守卫【7】

索引访问类型守卫允许我们通过访问对象的属性来缩小类型。

typescript
interface Person {
name: string;
age: number;
}

const person: Person | { name: string; age: number } = { name: 'Alice', age: 30 };

if (person.hasOwnProperty('name')) {
console.log(person.name.toUpperCase()); // 类型缩小为 string
}

3. 空值和严格空值类型守卫【8】

空值和严格空值类型守卫可以用来检查变量是否为 `null` 或 `undefined`。

typescript
function isNonNullable(value: T | null | undefined): value is NonNullable {
return value !== null && value !== undefined;
}

const value: string | null = null;

if (isNonNullable(value)) {
console.log(value.toUpperCase()); // 类型缩小为 string
}

类型谓词

类型谓词是 TypeScript 3.7 引入的一个特性,它允许我们在运行时检查一个变量是否满足某个条件,并据此缩小其类型。

typescript
function isEven(number: number): number is number {
return number % 2 === 0;
}

const number: number | string = 4;

if (isEven(number as number)) {
console.log(number); // 类型缩小为 number
}

类型断言

类型断言是一种更直接的方式来指定一个变量的类型,尽管它可能会牺牲一些类型安全。

typescript
const value: any = 'Hello';

const length: number = (value as string).length; // 类型断言为 string

条件类型

条件类型是一种高级的类型缩小方法,它允许我们根据条件来返回不同的类型。

typescript
type StringOrNumber = string | number;

type StringType = StringOrNumber extends string ? string : never;
type NumberType = StringOrNumber extends number ? number : never;

const value: StringOrNumber = 42;

const stringValue: StringType = value; // 类型缩小为 number
const numberValue: NumberType = value; // 类型缩小为 number

高级技巧

1. 使用类型守卫和类型谓词的组合

我们可以将类型守卫和类型谓词结合起来,以实现更复杂的类型缩小逻辑。

typescript
interface Animal {
type: 'dog' | 'cat';
name: string;
}

function isDog(animal: Animal): animal is { type: 'dog'; name: string } {
return animal.type === 'dog';
}

const animal: Animal = { type: 'dog', name: 'Buddy' };

if (isDog(animal)) {
console.log(animal.name); // 类型缩小为 { type: 'dog'; name: string }
}

2. 使用类型守卫来处理可选属性【10】

可选属性是 TypeScript 中常见的特性,我们可以使用类型守卫来处理它们。

typescript
interface Person {
name: string;
age?: number;
}

function getPersonName(person: Person): string {
return person.name;
}

const person: Person = { name: 'Alice' };

console.log(getPersonName(person)); // 类型缩小为 string

3. 使用类型守卫来处理联合类型【11】

联合类型在 TypeScript 中很常见,我们可以使用类型守卫来处理它们。

typescript
type User = { name: string; role: 'admin' } | { name: string; role: 'user' };

function getUserRole(user: User): string {
return user.role;
}

const admin: User = { name: 'Bob', role: 'admin' };

console.log(getUserRole(admin)); // 类型缩小为 'admin'

结论

类型缩小是 TypeScript 中一个强大的特性,它可以帮助我们编写更健壮、更安全的代码。通过使用高级技巧,如类型守卫、类型谓词、类型断言和条件类型,我们可以更灵活地缩小变量的类型。我们探讨了这些高级技巧,并提供了示例代码来展示如何在实际项目中使用它们。希望这些技巧能够帮助你提高 TypeScript 代码的质量和可维护性。