我想使用函式的回傳型別在界面上鍵入一個專案,如下所示:
const returnsPromise = async (): Promise<string> => {
return Promise.resolve('I want the string type and not a Promise')
}
interface Myinterface {
message: ReturnType<typeof returnsPromise>
}
但是, message 的型別是Promise而不是string。可以得到承諾應該解決的型別嗎?
uj5u.com熱心網友回復:
TypeScript 4.5 引入了Awaited<T>type,如果你await的值是 type ,它會計算你得到的型別T。所以你可以寫:
interface Myinterface {
message: Awaited<ReturnType<typeof returnsPromise>>;
// (property) Myinterface.message: string
}
如果您還沒有 TypeScript 4.5,您可以隨時Promise使用條件型別推斷自己“取消”型別:
type Unpromise<T> = T extends Promise<infer U> ? U : never;
interface Myinterface {
message: Unpromise<ReturnType<typeof returnsPromise>>;
// (property) Myinterface.message: string
}
string當您傳入時,它們都會產生Promise<string>。對于更復雜的型別,比如嵌套Promises,它們會產生不同的結果:
type APPs = Awaited<Promise<Promise<string>>>; // type APPs = string
type UPPs = Unpromise<Promise<Promise<string>>>; // type UPPs = Promise<string>
因此,這取決于您的用例是否需要遞回計算“承諾解決的內容”。
Playground 鏈接到代碼
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/387156.html
標籤:打字稿
上一篇:為什么打字稿不能正確推斷T[K]與<TextendsPerson,KextendskeyofT>generic?
