在TypeScript中使用带有ES6承诺的表接口

在TypeScript中使用带有ES6承诺的表接口,typescript,es6-promise,typescript-typings,ajv,Typescript,Es6 Promise,Typescript Typings,Ajv,一些库提供表格接口键入f.e.. 我对他们有些不了解。给定这个最小代码 const foo: Ajv.Thenable<boolean> = new Promise<boolean>((resolve, reject) => { if ("condition") resolve(true) reject("Nope") }) const-foo:Ajv.Thenable=新承诺((解决,拒绝)=>{ 如果(“条件”) 解析(真) 拒绝(“否”)

一些库提供
表格
接口键入f.e..
我对他们有些不了解。给定这个最小代码

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

  reject("Nope")
})
const-foo:Ajv.Thenable=新承诺((解决,拒绝)=>{
如果(“条件”)
解析(真)
拒绝(“否”)
})
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'.
错误TS2322:类型“Promise”不可分配给类型“Thenable”。
“then”属性的类型不兼容。
类型“(oncompleted:((值:布尔)=>TResult1 | PromiseLike U | Thenable)|未定义,onRejected:((错误:any)=……)。
参数“OnCompleted”和“OnCompleted”的类型不兼容。
类型“((值:布尔)=>U |可定义)|未定义”不可分配给类型“((值:布尔)=>U | PromiseLike)| null |未定义”。
Type'(值:boolean)=>U | Thenable'不可分配给Type'((值:boolean)=>U | PromiseLike)| null |未定义'。
Type'(值:布尔)=>U | Thenable'不可分配给Type'(值:布尔)=>U | PromiseLike'。
类型“U | Thenable”不可分配给类型“U | PromiseLike”。
类型“Thenable”不可分配给类型“U | PromiseLike”。
类型“Thenable”不可分配给类型“PromiseLike”。
“then”属性的类型不兼容。
类型'(onCompleted?:((value:U)=>U|Thenable)|未定义,onRejected?:((error:any)=>U|……'不可分配给类型'(onCompleted?:((value:U)=>TResult1 | PromiseLike)|……'。
参数“OnCompleted”和“OnCompleted”的类型不兼容。
类型“((值:U)=>TResult1 | PromiseLike)| null |未定义”不可分配给类型“((值:U)=>TResult2 | Thenable)|未定义”。
类型“null”不可分配给类型“((值:U)=>TResult2 | Thenable)| undefined”。
编译器认为a将在哪里返回
null
(如果这是实际错误)?

为什么要做一些库(蓝鸟,rsvp,余烬,…)使用
Thenable
而不是
PromiseLike

Ajv的
Thenable
类型声明说明
then
的第二个参数,通常在被调用时被称为
onRejected
,在被调用时,必须返回与第一个
onCompleted
参数相同的类型
。ES6承诺因此,TypeScript的
承诺
/
承诺
没有此类限制

例如,在此代码中:

const p1: PromiseLike<boolean> = /* ... */
const p2 = p1.then(() => true, () => 123)
常量p1:PromiseLike=/**/ 常量p2=p1。然后(()=>true,()=>123)
TypeScript将(正确地)推断p2具有类型
PromiseLike
。使用Ajv的
表格
类型声明,等效代码将无法编译,因为123不可分配给boolean

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

AJV的
Thenable
类型声明说
then
的第二个参数,通常称为
onRejected
,调用时必须返回与第一个
onCompleted
参数相同的类型

例如,在此代码中:

const p1: PromiseLike<boolean> = /* ... */
const p2 = p1.then(() => true, () => 123)
常量p1:PromiseLike=/**/ 常量p2=p1。然后(()=>true,()=>123)
TypeScript将(正确地)推断p2具有类型
PromiseLike
。使用Ajv的
表格
类型声明,等效代码将无法编译,因为123不可分配给boolean

实际的AJVJavaScript代码似乎返回了正常的承诺,所以 它不关心类型。所以在我看来,这似乎是AJV的TypeScript声明中的一个bug…我不知道为什么AJV不使用TypeScript的内置
PromiseLike