根据TypeScript中的属性值查找类型别名

根据TypeScript中的属性值查找类型别名,typescript,Typescript,我正在尝试编写一些用于执行云函数的类型。我有很多这样的类型,每个都在一个单独的文件中 export type TAddRegistration = { name: 'addRegistration' data: TAddRegistrationData result: TAddRegistrationCallResult } 现在,我希望在客户端代码中有一个这样的函数,并且基于传递的函数名,它应该提供正确的数据和结果类型 function useCloudFunction(name

我正在尝试编写一些用于执行云函数的类型。我有很多这样的类型,每个都在一个单独的文件中

export type TAddRegistration = {
  name: 'addRegistration'
  data: TAddRegistrationData
  result: TAddRegistrationCallResult
}
现在,我希望在客户端代码中有一个这样的函数,并且基于传递的函数名,它应该提供正确的数据和结果类型

function useCloudFunction(name: TFunctionName) {
  return (data: TFunctionData): TFunctionResult => {
     ...
  }
}

第一步是声明TFunctionName。这种方法有效,我不知道有更好的方法

export type TFunctions = TAddRegistration | TSignIn
export type TFunctionName = Pick<TFunctions, 'name'>['name']
导出类型t函数=TAddRegistration | TSignIn
导出类型TFunctionName=Pick['name']
第二步是如何根据传递到函数中的
name
参数发现正确的类型别名,这就是我在黑暗中遇到的问题。某种相反的“拾取”,可以在
t函数
别名中查找

如果有更好的方法,我肯定可以用不同的方式构造这些别名

更新:
可能是我能得到的最接近的结果,但不完全是期望的结果…

也许有更好的方法,但类似的方法会奏效:

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 SpecialFunction=T扩展TSignIn['name']?茨格宁
:T扩展TAddRegistration['name']?TAddRegistration
:从不;
函数useFunction(名称:T){
返回(数据:SpecialFunction['data']):SpecialFunction['result']=>{
返回“”
}
}

也许有更好的方法,但像这样的方法会奏效:

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 SpecialFunction=T扩展TSignIn['name']?茨格宁
:T扩展TAddRegistration['name']?TAddRegistration
:从不;
函数useFunction(名称:T){
返回(数据:SpecialFunction['data']):SpecialFunction['result']=>{
返回“”
}
}

我会这样定义您的类型:

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?!
  }
}
我觉得不错。好吧,希望这会有帮助;祝你好运


我会这样定义您的类型:

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?!
  }
}
我觉得不错。好吧,希望这会有帮助;祝你好运


太棒了。如此接近解决方案:)这太神奇了。非常接近解决方案:)也谢谢你的回答,与@jcalz的答案基本相同。事实上,答案不一样。您的方法没有考虑“许多”功能。使用条件类型来解释例如10个函数将是。。。谢谢你的回答,和@jcalz的答案差不多。事实上,这不一样。您的方法没有考虑“许多”功能。使用条件类型来解释例如10个函数将是。。。