关于 JavaScript 非单子 Promise 的更多陷阱

关于 JavaScript 非单子 Promise 的更多陷阱

💡 原文英文,约400词,阅读约需2分钟。
📝

内容提要

JavaScript的Promise不是一个单子。它会将Promise<Promise<T>>当作Promise<T>处理。这可能会导致意想不到的问题。解决方法是改变pop()的签名,使用Maybe<T>来代替Promise<T | undefined>。这样可以避免T包含Promise<undefined>的问题。

🎯

关键要点

  • JavaScript的Promise不是一个单子,Promise<Promise<T>>会被当作Promise<T>处理。
  • 这可能导致意想不到的问题,特别是在使用Channel<T>类时。
  • Channel<T>的pop()方法返回Promise<T | undefined>,但如果T包含undefined会出现问题。
  • 更隐蔽的问题是T也不能包含Promise<undefined>,否则会导致类型混淆。
  • TypeScript不会警告这种情况,可能导致开发者不易察觉。
  • 解决方法是将pop()的签名改为Promise<Maybe<T>>,使用Maybe<T>代替Promise<T | undefined>。
  • 这样可以避免Channel<undefined>和Channel<Promise<undefined>>的问题,保持结构的完整性。
🏷️

标签

➡️

继续阅读