跳到主要内容

TypeScript 泛型参数默认值

在TypeScript中,泛型(Generics)是一种强大的工具,它允许我们创建可重用的组件,同时保持类型安全。泛型参数默认值是TypeScript 2.3引入的一个特性,它允许我们为泛型参数指定默认类型,从而在调用时简化代码。

什么是泛型参数默认值?

泛型参数默认值允许我们在定义泛型时,为泛型参数指定一个默认类型。如果调用时没有显式提供类型参数,TypeScript将使用默认类型。这类似于函数参数的默认值,只不过它应用于类型参数。

基本语法

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

在这个例子中,T 是一个泛型参数,它的默认类型是 string。如果调用 identity 函数时没有提供类型参数,TypeScript将使用 string 作为 T 的类型。

逐步讲解

1. 定义泛型参数默认值

让我们从一个简单的例子开始:

typescript
function createArray<T = number>(length: number, value: T): T[] {
return Array(length).fill(value);
}

在这个例子中,T 的默认类型是 number。如果我们调用 createArray(3, 42),TypeScript会推断 Tnumber,因为 42 是一个数字。

2. 调用时显式指定类型

我们也可以在调用时显式指定类型参数:

typescript
const stringArray = createArray<string>(3, "hello");

在这个例子中,T 被显式指定为 string,因此 value 必须是字符串类型。

3. 使用默认类型

如果我们不指定类型参数,TypeScript将使用默认类型:

typescript
const numberArray = createArray(3, 42);

这里,T 被推断为 number,因为 42 是一个数字。

实际案例

案例1:配置对象

假设我们有一个函数,用于创建一个配置对象。我们可以使用泛型参数默认值来指定默认的配置类型:

typescript
interface Config {
timeout: number;
retries: number;
}

function createConfig<T = Config>(config: T): T {
return config;
}

const defaultConfig = createConfig({ timeout: 1000, retries: 3 });

在这个例子中,T 的默认类型是 Config,因此我们可以直接传递一个符合 Config 接口的对象。

案例2:API请求

假设我们有一个函数,用于发送API请求。我们可以使用泛型参数默认值来指定默认的响应类型:

typescript
interface ApiResponse<T = any> {
data: T;
status: number;
}

function fetchData<T = any>(url: string): Promise<ApiResponse<T>> {
return fetch(url).then(response => response.json());
}

fetchData<{ id: number }>("/api/user/1").then(response => {
console.log(response.data.id);
});

在这个例子中,T 的默认类型是 any,但我们可以在调用时显式指定 T 的类型。

总结

泛型参数默认值是TypeScript中一个非常有用的特性,它允许我们为泛型参数指定默认类型,从而在调用时简化代码。通过使用泛型参数默认值,我们可以创建更加灵活和可重用的组件。

附加资源

练习

  1. 修改 createArray 函数,使其默认类型为 string,并尝试调用它。
  2. 创建一个泛型函数 mergeObjects,它接受两个对象并返回它们的合并结果。为泛型参数指定默认类型为 object

通过练习,你将更好地理解泛型参数默认值的用法和应用场景。