async function fetchData1<T>(): Promise<T> {
// 模拟异步操作,这里简单返回一个固定值
return new Promise(resolve => {
setTimeout(() => {
resolve({} as T);
}, 1000);
});
}
async function fetchData2<T, U>(data: T): Promise<U> {
// 模拟异步操作,这里简单返回一个固定值
return new Promise(resolve => {
setTimeout(() => {
resolve({} as U);
}, 1000);
});
}
// 链式调用
async function chainCalls<T, U>() {
const result1 = await fetchData1<T>();
const result2 = await fetchData2<T, U>(result1);
return result2;
}
// 调用示例
chainCalls<{ name: string }, number>().then((finalResult) => {
console.log(finalResult);
});
泛型类型推导原理解释
fetchData1
的泛型:fetchData1
函数定义为async function fetchData1<T>(): Promise<T>
,这里的泛型T
代表fetchData1
函数最终返回值的类型。在调用fetchData1<T>()
时,<T>
处传入的类型就是函数返回的Promise
内部的值的类型。
fetchData2
的泛型:fetchData2
函数定义为async function fetchData2<T, U>(data: T): Promise<U>
,这里的T
代表传入参数的类型,U
代表返回值的类型。当调用fetchData2<T, U>(result1)
时,T
会根据result1
的类型(也就是fetchData1
返回值的类型)进行推导,保证传入参数类型匹配。而U
则由调用chainCalls
函数时指定的类型来确定,确保返回值类型的正确性。
chainCalls
函数中的类型推导:在chainCalls
函数中,首先调用fetchData1<T>()
获取结果result1
,T
的类型在调用chainCalls
时指定。然后将result1
传入fetchData2<T, U>(result1)
,T
会自动推导为result1
的类型,保证参数类型安全。U
同样在调用chainCalls
时指定,从而保证整个链式调用的类型安全。