为什么不用Promise<undefined>而使用Promise<void>?

88 阅读2分钟

为什么不使用Promise<undefined>而使用Promise<void>

Promise 虽然在语法上是正确的,但从代码可读性和表达意图的角度来看,它并不是一个最佳实践。

原因分析:

  1. 意义不明确:

    • undefined 本身表示一个未定义的值,使用 Promise<undefined> 并没有明确表达异步操作的返回值意图。
    • 容易让人误解这个 Promise 是否真的会返回一个 undefined 值,还是仅仅表示异步操作的完成。
  2. 可读性差:

    • Promise<void> 相比,Promise<undefined> 显得更加冗余,没有明确表达异步操作不返回具体值的意图。
    • 对于其他开发者来说,理解 Promise<undefined> 的含义可能需要额外的思考。
  3. 表达意图不清晰:

    • Promise<void> 更明确地表达了异步操作没有返回值,而 Promise<undefined> 则显得有些含糊。
    • 在团队协作中,使用更明确的类型定义可以减少沟通成本。

为什么使用Promise?

  • 明确表达: void 明确表示函数没有返回值,与 Promise 的结合表示异步操作完成但不返回任何值。
  • 一致性: 在 TypeScript 等类型系统中,void 被广泛用于表示没有返回值的函数或类型,使用 Promise<void> 符合这种约定。
  • 可读性: Promise<void> 更易于理解,有助于提高代码的可维护性。

示例对比:

TypeScript

// 不推荐:
function fetchData(): Promise<undefined> {
  // ...
}

// 推荐:
function fetchData(): Promise<void> {
  // ...
}

总结

虽然 Promise<undefined> 在技术上是可行的,但从代码风格、可读性以及表达意图的角度来看,使用 Promise<void> 是更好的选择。它更明确地表达了异步操作没有返回值,有助于提高代码质量和可维护性。

在实际开发中,建议遵循以下原则:

  • 明确类型: 对于异步操作的返回值类型,尽可能使用明确的类型定义。
  • 提高可读性: 编写易于理解的代码,方便团队协作。
  • 遵循约定: 遵循 TypeScript 或 JavaScript 社区的约定,使用统一的类型定义方式。

总之,Promise<void> 是一个简洁、明确且易于理解的方式来表示没有返回值的异步操作。