📌  相关文章
📜  js 检查函数是否为 promise - TypeScript (1)

📅  最后修改于: 2023-12-03 15:32:23.775000             🧑  作者: Mango

JS 检查函数是否为 Promise - TypeScript

在 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,以便于重用。