[英]How to create a mapped type for resolved promises in Typescript
我希望能夠有一個已解決承諾值的映射類型。
此映射類型使所有密鑰成為可能:
type PromisifiedKeys<T> = { [K in keyof T]: Promise<T[K]> }
我想要一個取消限制/解決它們的映射類型:
type PromisifiedKeys<T> = { [K in keyof T]: UnPromise<T[K]> }
我不確定該怎么做。
您真的想要映射的條件類型 ,它在TypeScript中當前不存在。
有解決方法。 如果您願意使用幻像屬性污染 Promise<T>
的全局聲明 ,則可以執行以下操作:
declare global {
interface Promise<T> {
"**unPromise**": T
}
}
export type UnPromise<T extends Promise<any>> = T['**unPromise**']
export type UnPromisifiedKeys<T extends { [k: string]: Promise<any> }> =
{[K in keyof T]: UnPromise<T[K]> }
你會得到:
type Promised = {
foo: Promise<string>,
bar: Promise<number>
}
type UnPromised = UnPromisifiedKeys<Promised>;
// {foo: string, bar: number}
這或多或少是您所要求的,但是很老套。
或者,您可以使用來自映射類型的推論來獲得一個函數,該函數采用PromisifiedKeys<T>
類型的對象並返回T
:
declare function unPromisifyKeys<T>(k: PromisifiedKeys<T>): T;
這表示您要對類型進行的功能。 如果您想傳遞給此函數具體的東西,它可能對您有用。 (也就是說,如果您只是在尋找UnpromisifyKeys<T>
作為表示函數輸出的一種方式,那么此解決方案將UnpromisifyKeys<T>
工作)。 如果您確實需要在類型級別沒有具體T
值的情況下找出UnpromisifyKeys<T>
,那么您可以跳過箍以強制編譯器推斷正確的類型,而不會在運行時引起過多的工作:
const unpromised = true as false || unPromisifyKeys(null! as Promised);
type Unpromised = typeof unpromised;
// {foo: string, bar: number}
這有效,但是很丑陋。 在第一種解決方法中,它唯一要做的就是Promise<T>
的全局定義未更改。
這些變通辦法之一也許對您來說足夠好? 希望能有所幫助; 祝好運!
從Typescript 2.8開始,有條件類型。 從手冊中 :
type Unpacked<T> =
T extends (infer U)[] ? U :
T extends (...args: any[]) => infer U ? U :
T extends Promise<infer U> ? U :
T;
用法示例:
const p: Promise<string> = getData();
type ReturnDataType = Unpacked<p>;
我能夠這樣實現:
interface AsyncSupplementalData {
couponCodeData: Promise<string>;
}
interface ApplicationState {
[K in keyof AsyncSupplementalData]: Unpacked< AsyncSupplementalData[K] >
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.