首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何接受一个类型参数,该参数只是一个接口,其中的方法返回承诺,拒绝不返回承诺的接口?

在TypeScript中,你可以使用泛型来接受一个类型参数,该参数是一个接口,其中的方法返回Promise,而拒绝不返回Promise的接口。以下是一个示例:

代码语言:txt
复制
interface PromisableFunction {
    <T>(arg: T): Promise<T>;
}

interface NonPromisableFunction {
    <T>(arg: T): T;
}

function handleFunction<T>(fn: PromisableFunction | NonPromisableFunction, arg: T): Promise<T> {
    return new Promise((resolve, reject) => {
        try {
            const result = fn(arg);
            if (result instanceof Promise) {
                result.then(resolve).catch(reject);
            } else {
                resolve(result as unknown as T); // 类型断言,确保返回值类型正确
            }
        } catch (error) {
            reject(error);
        }
    });
}

// 示例函数
const promisableFn: PromisableFunction = (arg) => Promise.resolve(arg);
const nonPromisableFn: NonPromisableFunction = (arg) => arg;

// 使用示例
handleFunction(promisableFn, 'test').then(console.log).catch(console.error); // 输出: test
handleFunction(nonPromisableFn, 'test').then(console.log).catch(console.error); // 输出: test

在这个示例中,我们定义了两个接口PromisableFunctionNonPromisableFunction,分别表示返回Promise和不返回Promise的函数。handleFunction函数接受一个泛型参数T和一个函数fn,这个函数可以是PromisableFunctionNonPromisableFunction类型。

handleFunction函数内部,我们首先尝试执行传入的函数fn,并检查其返回值是否为Promise实例。如果是Promise,我们使用.then().catch()方法处理成功和失败的情况。如果不是Promise,我们直接将其包装在一个Promise中并立即解决(resolve)。

这种方法允许你统一处理返回Promise和不返回Promise的函数,而不需要在调用时区分它们的类型。

参考链接:

  • TypeScript官方文档关于泛型
  • TypeScript官方文档关于Promise
相关搜索:如何实现一个可以接受任何参数的接口方法?如何将接口方法的返回类型定义为另一个接口?扩展和接口具有相同的方法,具有相同的参数,但返回类型不同在Haxe中,您是否可以编写一个泛型接口,其中方法类型参数由类的类型参数约束?在CanFly接口中,必须使用一个CanFly类型的参数声明速度方法如何记录/docstring一个参数/返回类型为动态的函数?如何使用一个函数的返回类型作为另一个函数的参数类型?如何创建一个具有char数组参数和char参数的方法,该方法查找数组中的特定字符并返回索引如何从节点js中的函数返回多个参数,一个作为接口,另一个作为变量如何从Roslyn的另一个方法中作为参数传递的方法中获取返回类型?返回类型,其中一个键是根据TypeScript 4.1中的参数计算得出的如何为返回带有最后一个参数可选新函数的函数设置正确的返回类型如何使用一个方法的返回值作为另一个方法中的参数?如何创建一个c#方法,它将返回与具有不同元素类型的参数相同的集合类型?如何知道具有类型接口的参数是否实际上是一个结构?如何将一个方法的返回值作为另一个方法的参数应用?在Java中,如何根据一个参数返回两种不同的类型?如何在验证框架的assert方法中接收一个方法返回的多个值作为参数?编写一个方法来对任何参数化类型的Set进行排序并返回一个TreeSet如何让一个函数在Javascript中接受不同类型的参数,并返回"dd.mm.yy“格式的日期?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券