簡體   English   中英

如何使用可變通用 arguments 在 TypeScript 中創建映射類型?

[英]How to create a Mapped Type in TypeScript with variable generic arguments?

我有一個 object 包含一個或多個PreparedStatement 我需要概括此類 object 的類型定義。 可以代表嗎?

type PreparedQuery<Input, Result> = {
  input: Input;
  result: Result;
};

type Query = {
  [Key in string]: PreparedQuery<Input, Result>;
};

object Query類型的每個值都是PreparedQuery但具有不同的Input和/或Result 主要目標是編寫一個 function ,它將采用這個 object 並返回一個新的 object 類型( Query - > GeneratedQueries ):

type GeneratedQueries = {
  [Key in string]: <Input, Result>(input: Input) => Promise<Result>;
}

那么,如何定義/表示這個Query類型而不是其通用 arguments 的任何類型?

這樣就夠了嗎?

type Input='x' |'y' | 'z'
type Result ='a' |'b' | 'z'

type PreparedQuery<Input, Result> = {
  input: Input;
  result: Result;
};

type Query<I extends Input, R extends Result> = {
  [Key in string]: PreparedQuery<I, R>;
};

type GeneratedQueries = {
  [Key in string]: <Input, Result>(input: Input) => Promise<Result>;
}

這是一種方法:

type GeneratedQueries<Q extends { [K in keyof Q]: PreparedQuery<any, any> }> =
    { [K in keyof Q]: (input: Q[K]['input']) => Promise<Q[K]['result']> }

我們的想法是,我們允許類型參數Q是具有任何屬性鍵的 object 類型,並且每個屬性值都是PreparedQuery<any, any>類型。 我們真的不想將輸入和 output 類型限制為PreparedQuery ,因此我們使用any類型作為 arguments 類型。

然后我們通過mapQ屬性來產生你想要的功能。 對於keyof Q中的每個鍵K ,我們索引到相應的PreparedQuery屬性Q[K]以獲取'input'result類型。

讓我們測試一下:

interface Foo {
    a: { input: string, result: number },
    b: { input: Date, result: boolean },
    c: { input: HTMLElement, result: string }
}

type GeneratedQueriesForFoo = GeneratedQueries<Foo>
/* type GeneratedQueriesForFoo = {
    a: (input: string) => Promise<number>;
    b: (input: Date) => Promise<boolean>;
    c: (input: HTMLElement) => Promise<string>;
} */

看起來不錯! 請注意,我們也可以使用條件類型推斷

type GeneratedQueries<Q extends { [K in keyof Q]: PreparedQuery<any, any> }> =
    { [K in keyof Q]: Q[K] extends PreparedQuery<infer I, infer R> ?
        (input: I) => Promise<R> : never }

這給出了相同的結果。

Playground 代碼鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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