[英]Find type alias based on its property value in TypeScript
我正在嘗試編寫一些用於執行 Cloud Functions 的類型。 我有一堆這樣的類型,每個類型都在一個單獨的文件中。
export type TAddRegistration = {
name: 'addRegistration'
data: TAddRegistrationData
result: TAddRegistrationCallResult
}
export type TSignIn = {
name: 'signIn'
data: TSignInData
result: TSignInCallResult
}
現在最終,我想在這樣的客戶端代碼中有一個 function 並基於傳遞的 function 名稱,它應該提供正確的數據和結果類型。
function useCloudFunction(name: TFunctionName) {
return (data: TFunctionData): TFunctionResult => {
...
}
}
第一步是聲明 TFunctionName。 這種方法有效,我不知道有更好的方法。
export type TFunctions = TAddRegistration | TSignIn
export type TFunctionName = Pick<TFunctions, 'name'>['name']
第二步是如何根據傳遞給 function 的name
參數來發現正確的類型別名,這就是我在黑暗中絆倒的地方。 可以在TFunctions
別名中查找的某種相反的“Pick”。
如果有更好的方法來解決這個問題,我肯定可以以不同的方式構造這些別名。
這個操場可能是我能得到的最接近的,但不是完全想要的結果......
也許有更好的方法,但這樣的事情會起作用:
type SpecialFunction<T> = T extends TSignIn['name'] ? TSignIn
: T extends TAddRegistration['name'] ? TAddRegistration
: never;
function useFunction<T extends TFunctionName>(name: T) {
return (data: SpecialFunction<T>['data']): SpecialFunction<T>['result'] => {
return ""
}
}
我會這樣定義你的類型:
type TFunctions = TSignIn | TAddRegistration
function useFunction<N extends TFunctions["name"]>(name: N) {
type TFunc = Extract<TFunctions, { name: N }>
return (data: TFunc["data"]): TFunc["result"] => {
return ""; // impl?!
}
}
您不需要Pick<TFunctions, "name">["name"]
因為這相當於TFunctions["name"]
。 除此之外,您的原始代碼和我的代碼之間的唯一區別是我的代碼在N
中是通用的,它是name
參數的類型。 這允許編譯器記住哪個值name
,並強類型返回類型:
const signIn = useFunction("signIn");
const signInCallResult = signIn({ email: "okay" }); // TSignInCallResult
signIn({ phone: "oops" }); // error! needs TSignInData
const addReg = useFunction("addRegistration");
const addRegCallResult = addReg({ phone: "okay" }); // TAddRegistrationCallResult
addReg({ email: "oops" }) // error! needs TAddRegistrationData
在我看來很好。 好的,希望有幫助; 祝你好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.