MST

星途 面试题库

面试题:TypeScript泛型在异步函数链式调用中的应用

假设有两个异步函数`fetchData1`和`fetchData2`,`fetchData1`返回`Promise<T>`,`fetchData2`接收`T`类型参数并返回`Promise<U>`,请使用TypeScript泛型实现这两个函数的链式调用,保证类型安全,并解释这种链式调用中泛型类型推导的原理。
19.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
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);
});

泛型类型推导原理解释

  1. fetchData1的泛型fetchData1函数定义为async function fetchData1<T>(): Promise<T>,这里的泛型T代表fetchData1函数最终返回值的类型。在调用fetchData1<T>()时,<T>处传入的类型就是函数返回的Promise内部的值的类型。
  2. fetchData2的泛型fetchData2函数定义为async function fetchData2<T, U>(data: T): Promise<U>,这里的T代表传入参数的类型,U代表返回值的类型。当调用fetchData2<T, U>(result1)时,T会根据result1的类型(也就是fetchData1返回值的类型)进行推导,保证传入参数类型匹配。而U则由调用chainCalls函数时指定的类型来确定,确保返回值类型的正确性。
  3. chainCalls函数中的类型推导:在chainCalls函数中,首先调用fetchData1<T>()获取结果result1T的类型在调用chainCalls时指定。然后将result1传入fetchData2<T, U>(result1)T会自动推导为result1的类型,保证参数类型安全。U同样在调用chainCalls时指定,从而保证整个链式调用的类型安全。