在 TypeScript 中使用带有 ES6 Promise 的 Thenable 接口
Using Thenable Interfaces with ES6 Promises in TypeScript
一些图书馆提供 Thenable
接口类型 f.e。 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 会 return null
(如果那是实际错误)?
为什么 do 某些库(bluebird、rsvp、ember、...)使用 Thenable
而不是 Promise
/PromiseLike
?
Ajv 的 Thenable
类型声明表示 then
的第二个参数,通常称为 onRejected
,在调用时必须 return 相同的类型 <U>
作为第一个 onFulfilled
参数。 ES6 承诺,因此 TypeScript 的 Promise
/PromiseLike
没有这样的限制。
例如,在这段代码中:
const p1: PromiseLike<boolean> = /* ... */
const p2 = p1.then(() => true, () => 123)
TypeScript 将(正确地)推断 p2 的类型为 PromiseLike<number | boolean>
。使用 Ajv 的 Thenable
类型声明,等效代码将无法编译,因为 123 不可分配给布尔值。
实际的 AJV JavaScript 代码似乎是 returning 正常的 Promise,所以
它不关心类型。所以这对我来说似乎是 AJV 的 TypeScript 声明中的错误...我不知道为什么 AJV 在这里不使用 TypeScript 的 built-in PromiseLike
...
一些图书馆提供 Thenable
接口类型 f.e。 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 会 return null
(如果那是实际错误)?
为什么 do 某些库(bluebird、rsvp、ember、...)使用 Thenable
而不是 Promise
/PromiseLike
?
Ajv 的 Thenable
类型声明表示 then
的第二个参数,通常称为 onRejected
,在调用时必须 return 相同的类型 <U>
作为第一个 onFulfilled
参数。 ES6 承诺,因此 TypeScript 的 Promise
/PromiseLike
没有这样的限制。
例如,在这段代码中:
const p1: PromiseLike<boolean> = /* ... */
const p2 = p1.then(() => true, () => 123)
TypeScript 将(正确地)推断 p2 的类型为 PromiseLike<number | boolean>
。使用 Ajv 的 Thenable
类型声明,等效代码将无法编译,因为 123 不可分配给布尔值。
实际的 AJV JavaScript 代码似乎是 returning 正常的 Promise,所以
它不关心类型。所以这对我来说似乎是 AJV 的 TypeScript 声明中的错误...我不知道为什么 AJV 在这里不使用 TypeScript 的 built-in PromiseLike
...