在TypeScript中,你可以使用泛型来接受一个类型参数,该参数是一个接口,其中的方法返回Promise,而拒绝不返回Promise的接口。以下是一个示例:
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
在这个示例中,我们定义了两个接口PromisableFunction
和NonPromisableFunction
,分别表示返回Promise和不返回Promise的函数。handleFunction
函数接受一个泛型参数T
和一个函数fn
,这个函数可以是PromisableFunction
或NonPromisableFunction
类型。
在handleFunction
函数内部,我们首先尝试执行传入的函数fn
,并检查其返回值是否为Promise实例。如果是Promise,我们使用.then()
和.catch()
方法处理成功和失败的情况。如果不是Promise,我们直接将其包装在一个Promise中并立即解决(resolve)。
这种方法允许你统一处理返回Promise和不返回Promise的函数,而不需要在调用时区分它们的类型。
参考链接:
领取专属 10元无门槛券
手把手带您无忧上云