[英]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 類型。
然后我們通過map的Q
屬性來產生你想要的功能。 對於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 }
這給出了相同的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.