在 TypeScript 中使用带有 ES6 Promises 的 Thenable 接口

克雷诺

一些库提供Thenable接口类型 fe AJV
关于他们,我有些不明白。鉴于这个最小的代码

const foo: Ajv.Thenable<boolean> = new Promise<boolean>((resolve, reject) => {
  if ("condition")
    resolve(true)

  reject("Nope")
})

TypeScript 编译器抛出一个我无法理解的错误。

error TS2322: Type 'Promise<boolean>' is not assignable to type 'Thenable<boolean>'.
  Types of property 'then' are incompatible.
    Type '<TResult1 = boolean, TResult2 = never>(onfulfilled?: ((value: boolean) => TResult1 | PromiseLike<...' is not assignable to type '<U>(onFulfilled?: ((value: boolean) => U | Thenable<U>) | undefined, onRejected?: ((error: any) =...'.
      Types of parameters 'onfulfilled' and 'onFulfilled' are incompatible.
        Type '((value: boolean) => U | Thenable<U>) | undefined' is not assignable to type '((value: boolean) => U | PromiseLike<U>) | null | undefined'.
          Type '(value: boolean) => U | Thenable<U>' is not assignable to type '((value: boolean) => U | PromiseLike<U>) | null | undefined'.
            Type '(value: boolean) => U | Thenable<U>' is not assignable to type '(value: boolean) => U | PromiseLike<U>'.
              Type 'U | Thenable<U>' is not assignable to type 'U | PromiseLike<U>'.
                Type 'Thenable<U>' is not assignable to type 'U | PromiseLike<U>'.
                  Type 'Thenable<U>' is not assignable to type 'PromiseLike<U>'.
                    Types of property 'then' are incompatible.
                      Type '<U>(onFulfilled?: ((value: U) => U | Thenable<U>) | undefined, onRejected?: ((error: any) => U | ...' is not assignable to type '<TResult1 = U, TResult2 = never>(onfulfilled?: ((value: U) => TResult1 | PromiseLike<TResult1>) |...'.
                        Types of parameters 'onFulfilled' and 'onfulfilled' are incompatible.
                          Type '((value: U) => TResult1 | PromiseLike<TResult1>) | null | undefined' is not assignable to type '((value: U) => TResult2 | Thenable<TResult2>) | undefined'.
                            Type 'null' is not assignable to type '((value: U) => TResult2 | Thenable<TResult2>) | undefined'.

编译器究竟在哪里认为TypeScripts ES6 Promise会返回null(如果那是实际错误)?
为什么一些图书馆(蓝鸟,RSVP,烬,...)的使用Thenable,而不是Promise/ PromiseLike

Ajv 的Thenable类型声明表示 to 的第二个参数then(通常称为onRejected)在调用时必须返回与<U>第一个onFulfilled参数相同的类型ES6 承诺,以及 TypeScript 的Promise/ PromiseLike,没有这样的限制。

例如,在这段代码中:

const p1: PromiseLike<boolean> = /* ... */
const p2 = p1.then(() => true, () => 123)

TypeScript 将(正确)推断 p2 具有 type PromiseLike<number | boolean>使用 Ajv 的Thenable类型声明,等效代码将无法编译,因为 123 不可分配给布尔值。

实际的 AJV JavaScript 代码似乎返回正常的 Promise,因此它不关心类型。所以这对我来说似乎是 AJV 的 TypeScript 声明中的一个错误......我不知道为什么 AJV 没有在PromiseLike这里使用内置的 TypeScript ......

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在猫鼬代码中使用ES6 Promises

来自分类Dev

在猫鼬代码中使用ES6 Promises

来自分类Dev

ES6 Promises /在实现多个Promise后调用函数(不能使用Promises.all)

来自分类Dev

使用TypeScript通用接口

来自分类Dev

Typescript 实现了带有 57 个键的接口:spreadoperator 的使用?

来自分类Dev

es6使用TypeScript破坏函数中的参数

来自分类Dev

使用原生 ES6 Promises 去节点化/压缩标准回调

来自分类Dev

在TypeScript中使用泛型扩展接口

来自分类Dev

ES6 Promises 在 catch 之前返回

来自分类Dev

Javascript ES6 Promises with map

来自分类Dev

如何使用“接口”将数据附加到表中?在 Angular 6 中使用 Typescript

来自分类Dev

ES6/typescript 如何创建一个带有键和值的数组?

来自分类Dev

如何在TypeScript中使用ES6模块语法导入angular.IInjectorService

来自分类Dev

如何在TypeScript中使用es6语法导入.html片段

来自分类Dev

为什么括号内的代码可在Typescript / ES6中使用?

来自分类Dev

编写带有所有可选参数的接口Typescript

来自分类Dev

如何在带有NodeJS目标的TypeScript中正确使用模块和接口?

来自分类Dev

使用带有void的函数接口时出现意外的Typescript编译器行为

来自分类Dev

具有功能的TypeScript接口

来自分类Dev

何时在TypeScript / Angular中使用接口和模型

来自分类Dev

如何防止在TypeScript类型和接口中使用“ any”

来自分类Dev

ES6 Promise.all()对promises数组的奇怪解析

来自分类Dev

从when.js迁移到ES6 Promises

来自分类Dev

Angular 1 $scope 和 ES6 Promises

来自分类Dev

Angular 2.0:Typescript是否支持ES6的所有功能?

来自分类Dev

TypeScript类继承与其等效的ES6具有不同的行为

来自分类Dev

TypeScript + ES6 Map +对象类型的索引签名隐式具有“ any”类型

来自分类Dev

Typescript使用类和接口解析json

来自分类Dev

使用匿名函数实现接口的 Typescript 类

Related 相关文章

  1. 1

    在猫鼬代码中使用ES6 Promises

  2. 2

    在猫鼬代码中使用ES6 Promises

  3. 3

    ES6 Promises /在实现多个Promise后调用函数(不能使用Promises.all)

  4. 4

    使用TypeScript通用接口

  5. 5

    Typescript 实现了带有 57 个键的接口:spreadoperator 的使用?

  6. 6

    es6使用TypeScript破坏函数中的参数

  7. 7

    使用原生 ES6 Promises 去节点化/压缩标准回调

  8. 8

    在TypeScript中使用泛型扩展接口

  9. 9

    ES6 Promises 在 catch 之前返回

  10. 10

    Javascript ES6 Promises with map

  11. 11

    如何使用“接口”将数据附加到表中?在 Angular 6 中使用 Typescript

  12. 12

    ES6/typescript 如何创建一个带有键和值的数组?

  13. 13

    如何在TypeScript中使用ES6模块语法导入angular.IInjectorService

  14. 14

    如何在TypeScript中使用es6语法导入.html片段

  15. 15

    为什么括号内的代码可在Typescript / ES6中使用?

  16. 16

    编写带有所有可选参数的接口Typescript

  17. 17

    如何在带有NodeJS目标的TypeScript中正确使用模块和接口?

  18. 18

    使用带有void的函数接口时出现意外的Typescript编译器行为

  19. 19

    具有功能的TypeScript接口

  20. 20

    何时在TypeScript / Angular中使用接口和模型

  21. 21

    如何防止在TypeScript类型和接口中使用“ any”

  22. 22

    ES6 Promise.all()对promises数组的奇怪解析

  23. 23

    从when.js迁移到ES6 Promises

  24. 24

    Angular 1 $scope 和 ES6 Promises

  25. 25

    Angular 2.0:Typescript是否支持ES6的所有功能?

  26. 26

    TypeScript类继承与其等效的ES6具有不同的行为

  27. 27

    TypeScript + ES6 Map +对象类型的索引签名隐式具有“ any”类型

  28. 28

    Typescript使用类和接口解析json

  29. 29

    使用匿名函数实现接口的 Typescript 类

热门标签

归档