📅  最后修改于: 2023-12-03 15:32:23.775000             🧑  作者: Mango
在 TypeScript 中,我们可以使用类型注释来表示一个函数是否返回 Promise。但是,在 JavaScript 中,我们应该怎样检查一个函数是否为 Promise 呢?
可以使用 Promise.resolve() 方法来检查一个函数是否为 Promise。如果返回的是 Promise,那么该函数就是 Promise。否则,它就不是 Promise。
function isPromise(fn) {
return typeof fn.then === 'function';
}
const prom = Promise.resolve();
const notProm = () => {};
console.log(isPromise(prom)); // true
console.log(isPromise(notProm)); // false
在上面的代码中,我们定义了一个 isPromise() 函数,该函数接受一个函数作为参数。如果这个函数返回的对象有 then() 方法,则返回 true,否则返回 false。
我们使用 Promise.resolve() 方法创建了一个 Promise 对象,然后再定义了一个名为 notProm 的函数。我们测试这两个函数是否为 Promise,结果 prom 是 Promise,notProm 则不是。
在实际开发中,我们可能需要在多个地方使用这个函数,所以最好将它封装在一个工具函数库中,以便于重用。
function isPromise(fn) {
return typeof fn.then === 'function';
}
export default isPromise;
import isPromise from './isPromise';
function someAsyncFn(): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, 1000));
}
function someSyncFn(): void {
// ...
}
console.log(isPromise(someAsyncFn)); // true
console.log(isPromise(someSyncFn)); // false
在上面的代码中,我们将 isPromise() 函数封装在了一个模块中,以便于在其他文件中使用。我们定义了一个 someAsyncFn() 函数,它返回一个 Promise 对象,以及一个 someSyncFn() 函数,它不返回 Promise。我们在控制台打印了这两个函数是否为 Promise。由于 someAsyncFn() 返回 Promise,所以结果为 true,而 someSyncFn() 则不是 Promise。
总结
在 JavaScript 中,我们可以通过检查一个函数是否有 then() 方法来判断它是否为 Promise。在 TypeScript 中,我们可以使用类型注释来表示一个函数是否返回 Promise。在实际开发中,我们可以封装一个 isPromise() 工具函数来判断一个函数是否为 Promise,以便于重用。