簡體   English   中英

根據 TypeScript 中的屬性值查找類型別名

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

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