請看一下這個打字稿代碼:
type params1 = {p:number} ;
type params2 = {p:boolean};
type params3 = {p:string};
type res = {r:string};
const fObject = {
a:(a:params1):res=>{return {r:`${a.p}`}},
b:(a:params2):res=>{return {r:`${a.p?1:0}`}},
c:(a:params3):res=>{return {r:a.p}}
}
我們如何創建一個看起來像這樣的型別:
型別引數 = params1 | 引數2 | 引數3
我正在創建一個新物件,它將是所有函式,fObject但將對每個函式的結果運行一個記錄器函式
像這樣:
const loggingObject: typeof fObject = Object.keys(fObject).reduce(
(result: any, key: string) => {
result[key] = (args: any/*reason for Q*/) => logger.report(fObject
[key as loggingObject](args /*If i put something like 2 it says it has no properties in common with params1 & param2 & param3, thats why I know its possible*/));
return result;
},
{},
);
我不想要任何型別,需要一個動態型別,它可以接受一個帶有函式的物件,并給出物件中所有函式的所有引數型別的聯合
uj5u.com熱心網友回復:
好問題。這是可能的——以多種方式!在此解決方案中,我們將使用以下技術:
- 映射型別
- 條件型別
如果您想深入了解并且我的解釋不夠連貫,這些鏈接可能會有所幫助。最后,我們將有一個像這樣作業的型別:
// your code here...
type MyParams = ParamForKeys<typeof fObject>;
// => `type MyParams = param1 | param2 | param3`
所以我們要做的是映射 的鍵fObject,并將每個鍵替換為其函式的引數型別。映射鍵如下所示:
type MyParams<T> = { [key in keyof T]: ... }
現在我們要提取引數型別。這將使用條件型別。條件型別允許我們做條件,以及通過使用推理來提取引數,infer關鍵是:
type UnwrapPromise<T> = T extends Promise<infer Inner> ? Inner : never;
type A = UnwrapPromise<Promise<number>> // => number
type B = UnwrapPromise<number> // => never
這就是我們要使用的確切方法:
type GetFirstParam<T> = T extends ((param: infer Param) => any) ? Param : never
現在,如果我們一起構建它,我們將得到:
type GetFirstParam<T> = T extends ((param: infer Param) => any) ? Param : never
type ParamForKeys<T> = { [key in keyof T]: GetFirstParam<T[key]> }
但這給了我們以下型別:
type MyParams = ParamForKeys<typeof fObject>;
// { a: param1, b: param2, c: param3 }
要以聯合格式 ( ) 取回值,param1 | param2 | param3我們可以像這樣訪問它們:
type GetFirstParam<T> = T extends ((param: infer Param) => any) ? Param : never
type ParamForKeys<T> = { [key in keyof T]: GetFirstParam<T[key]> }[keyof T]
And that's the solution.
Keep in mind that I'm not sure that this solution is what you're looking for: having the {a: param1, b:param2} makes more sense to me in terms of your logging situation, but that's the solution for you question!
Hope that it was clear. You can see it live in this TypeScript playground.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/448357.html
標籤:javascript 打字稿 目的 箭头函数
