TypeScript 泛型参数默认值
在TypeScript中,泛型(Generics)是一种强大的工具,它允许我们创建可重用的组件,同时保持类型安全。泛型参数默认值是TypeScript 2.3引入的一个特性,它允许我们为泛型参数指定默认类型,从而在调用时简化代码。
什么是泛型参数默认值?
泛型参数默认值允许我们在定义泛型时,为泛型参数指定一个默认类型。如果调用时没有显式提供类型参数,TypeScript将使用默认类型。这类似于函数参数的默认值,只不过它应用于类型参数。
基本语法
function identity<T = string>(arg: T): T {
return arg;
}
在这个例子中,T
是一个泛型参数,它的默认类型是 string
。如果调用 identity
函数时没有提供类型参数,TypeScript将使用 string
作为 T
的类型。
逐步讲解
1. 定义泛型参数默认值
让我们从一个简单的例子开始:
function createArray<T = number>(length: number, value: T): T[] {
return Array(length).fill(value);
}
在这个例子中,T
的默认类型是 number
。如果我们调用 createArray(3, 42)
,TypeScript会推断 T
为 number
,因为 42
是一个数字。
2. 调用时显式指定类型
我们也可以在调用时显式指定类型参数:
const stringArray = createArray<string>(3, "hello");
在这个例子中,T
被显式指定为 string
,因此 value
必须是字符串类型。
3. 使用默认类型
如果我们不指定类型参数,TypeScript将使用默认类型:
const numberArray = createArray(3, 42);
这里,T
被推断为 number
,因为 42
是一个数字。
实际案例
案例1:配置对象
假设我们有一个函数,用于创建一个配置对象。我们可以使用泛型参数默认值来指定默认的配置类型:
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请求。我们可以使用泛型参数默认值来指定默认的响应类型:
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中一个非常有用的特性,它允许我们为泛型参数指定默认类型,从而在调用时简化代码。通过使用泛型参数默认值,我们可以创建更加灵活和可重用的组件。
附加资源
练习
- 修改
createArray
函数,使其默认类型为string
,并尝试调用它。 - 创建一个泛型函数
mergeObjects
,它接受两个对象并返回它们的合并结果。为泛型参数指定默认类型为object
。
通过练习,你将更好地理解泛型参数默认值的用法和应用场景。