根据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个函数将是。。。