TypeScript 语言 进阶技巧 泛型的高级应用

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


TypeScript【1】 泛型【2】的高级应用

TypeScript 作为 JavaScript 的超集,提供了强大的类型系统,其中泛型是 TypeScript 中一个非常有用的特性。泛型允许我们在编写代码时定义可重用【3】的、类型安全【4】的组件。本文将深入探讨 TypeScript 泛型的高级应用,包括高级泛型技巧、泛型与类、泛型与接口以及泛型与工具类型【5】等。

一、高级泛型技巧

1. 泛型约束【6】

在 TypeScript 中,我们可以通过约束来限制泛型参数的类型。这可以通过 `extends` 关键字实现。

typescript
function loggingIdentity(arg: T): T {
console.log(arg.length); // Now we know it has a .length property, so no more error
return arg;
}

// 使用约束
loggingIdentity(100); // 正确
loggingIdentity("hello world"); // 正确
// loggingIdentity({ 123 as any }); // 错误,因为对象没有.length属性

2. 泛型映射类型【7】

泛型映射类型允许我们创建一个新的类型,它基于另一个类型,但对其属性进行修改。

typescript
type mappedType = {
[P in keyof T]: T[P];
};

// 使用映射类型
type mapped = mappedType;
// mapped 的类型是 { a: number; b: string };

3. 泛型条件类型【8】

泛型条件类型允许我们在类型推断时根据条件返回不同的类型。

typescript
type ConditionType = T extends string ? U : T;

// 使用条件类型
type myString = ConditionType; // myString 的类型是 number
type myNumber = ConditionType; // myNumber 的类型是 number

4. 泛型键选择【9】

泛型键选择允许我们从泛型类【10】型中选择特定的键。

typescript
type SelectKeys = Pick;

// 使用键选择
type myStringAndNumber = SelectKeys;
// myStringAndNumber 的类型是 { a: string; b: number };

二、泛型与类

泛型可以与类一起使用,以创建更灵活和可重用的类。

1. 泛型类

泛型类允许我们将类型参数作为类的类型参数。

typescript
class GenericNumber {
zeroValue: T;
add: (x: T, y: T) => T;
}

let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };

2. 泛型约束在类中使用

我们可以在类中使用泛型约束来限制类的行为。

typescript
class Point {
x: T;
y: T;
constructor(x: T, y: T) {
this.x = x;
this.y = y;
}
}

let point = new Point(1, 2);
let point2 = new Point("a", "b");

三、泛型与接口

泛型可以与接口一起使用,以创建更灵活和可重用的接口。

1. 泛型接口【11】

泛型接口允许我们将类型参数作为接口的类型参数。

typescript
interface GenericIdentityFn {
(arg: T): T;
}

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

let myIdentity: GenericIdentityFn = identity;

2. 泛型接口与类

泛型接口可以与类一起使用,以创建具有特定类型参数的类。

typescript
interface GenericIdentityFn {
(arg: T): T;
}

class GenericNumber {
zeroValue: T;
add: (x: T, y: T) => T;
}

// 使用泛型接口和类
let myIdentity: GenericIdentityFn = identity;
let genericNumber = new GenericNumber();

四、泛型与工具类型

TypeScript 提供了一些内置的工具类型,可以帮助我们更方便地使用泛型。

1. keyof【12】

`keyof` 操作符可以用来获取一个类型的所有键。

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

type PersonKeys = keyof Person; // PersonKeys 的类型是 'name' | 'age'

2. typeof【13】

`typeof` 操作符可以用来获取一个变量的类型。

typescript
let age: number = 25;
type AgeType = typeof age; // AgeType 的类型是 number

3. Partial【14】

`Partial` 工具类型可以将一个类型的所有属性转换为可选。

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

type PartialPerson = Partial; // PartialPerson 的类型是 { name?: string; age?: number; }

4. Readonly【15】

`Readonly` 工具类型可以将一个类型的所有属性转换为只读。

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

type ReadonlyPerson = Readonly; // ReadonlyPerson 的类型是 { readonly name: string; readonly age: number; }

结论

泛型是 TypeScript 中一个强大的特性,它允许我们编写更灵活、可重用和类型安全的代码。通过理解并应用高级泛型技巧,我们可以更好地利用 TypeScript 的类型系统,提高代码质量和可维护性。本文介绍了高级泛型技巧、泛型与类、泛型与接口以及泛型与工具类型等内容,希望对您有所帮助。