比方說,我有以下的(最新)封裝的打字稿項目:普通函數和異步函數返回的Promise類型是否有區別?
- [email protected]
- [email protected]
- @類型/ Q @ 1.0.5
現在,讓我們在我的項目說我定義它返回一個承諾(以打字稿的原生環境聲明的定義)的函數:
import * as q from "q";
function doSomethingElseAsync(): Promise<number> {
return q.Promise<number>((resolve, reject) => {
setTimeout(() => resolve(1), 5000);
});
}
編譯時,打字稿抱怨,出現以下錯誤:
error TS2322: Type 'Q.Promise<number>' is not assignable to type 'Promise<number>'.
Types of property 'then' are incompatible.
Type '<U>(onFulfill?: ((value: number) => IWhenable<U>) | undefined, onReject?: ((error: any) => IWhena...' is not assignable to type '<TResult1 = number, TResult2 = never>(onfulfilled?: ((value: number) => TResult1 | PromiseLike<TR...'.
Types of parameters 'onFulfill' and 'onfulfilled' are incompatible.
Type '((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined' is not assignable to type '((value: number) => IWhenable<TResult1 | TResult2>) | undefined'.
Type 'null' is not assignable to type '((value: number) => IWhenable<TResult1 | TResult2>) | undefined'.
有一段時間,我認爲這是因爲Q的承諾只是沒有用的打字稿的本地聲明兼容。但是,如果我將async
關鍵字添加到函數定義中,則錯誤完全消失。
我對這種行爲很困惑。這是Typescript,Q還是Q類型的錯誤?或者,這是一些深奧的,但預期的編譯器行爲?
可能相關? https://開頭計算器。com/questions/42689713/es6-promise-typescript-and-the-bluebird-promise基本上......承諾不是本地承諾。就像藍鳥承諾不是本地承諾。 –
只要它適合Typescript期望的界面,無論它是否是本地承諾都沒關係。 Q和Bluebird承諾在實踐中運作良好。 – Craxal
對,但更重要的是,它們是否匹配界面?我不認爲他們這樣做。 –