簡體   English   中英

如何在Typescript中為已解決的Promise創建映射類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM