根本原因在于, TypeScript 不会对数据的类型进行运行时的检验, TypeScript 的类型基本上只存在于编译时.这是众多BUG 的源头, 想以下以下场景:后端的接口定义里将一个字段声明数组,...我们将异常像数据一样由函数返回, 类似于Golang 中的错误处理方式.但直接通过union type进行抽象有一个弊端: 我们将难以分辨解析器返回的数据是属于成功分支的A呢, 还是失败分支的E呢?...状态时, 不对其进行任何操作, 而是直接返回一个rejected状态的Promise.我们可以脱离Promise, 进而得出then的更加泛用的抽象:对一个上下文中的结果进行进一步计算, 其返回值同样包含于这个上下文中..., 且具有短路(short circuit)的特性.在Promise.then中, 这个上下文既是"有可能成功的异步返回值".得力于这种抽象, 我们可以摆脱call back hell和对状态的手动断言...能够对一系列上下文进行串联并且收集其中的值.Monad在Applicative的基础上, 能够基于一个上下文中的值, 灵活地创建另外一个包裹在上下文中的值. -- stackoverflow上的回答在Promise.all