Javascript Typescript使第二个参数类型取决于第一个参数类型

Javascript Typescript使第二个参数类型取决于第一个参数类型,javascript,typescript,Javascript,Typescript,第一个参数a是枚举(通道)值 如果参数a为github,则b的类型为github 如果参数a是gitlab,则b的类型是gitlab 如何定义函数类型foo?使用。查看下面的示例,或转到联机以进行实际测试(感谢您的帮助) 枚举通道{ github='github', GITLAB='GITLAB', } 接口Github{ _福:号码 } 接口Gitlab{ _酒吧:号码 } 类型ParamType=C扩展Channel.githup?Github:Gitlab; 函数foo(a:C,b:Par

第一个参数a是枚举(通道)值

如果参数a为github,则b的类型为github

如果参数a是gitlab,则b的类型是gitlab

如何定义函数类型foo

使用。查看下面的示例,或转到联机以进行实际测试(感谢您的帮助)

枚举通道{ github='github', GITLAB='GITLAB', } 接口Github{ _福:号码 } 接口Gitlab{ _酒吧:号码 } 类型ParamType=C扩展Channel.githup?Github:Gitlab; 函数foo(a:C,b:ParamType):void{} foo(Channel.GITLAB,{u foo:1});//错误 foo(Channel.GITLAB,{u-bar:1});//成功


请告诉我它是否有效)

使用。查看下面的示例,或转到联机以进行实际测试(感谢您的帮助)

枚举通道{ github='github', GITLAB='GITLAB', } 接口Github{ _福:号码 } 接口Gitlab{ _酒吧:号码 } 类型ParamType=C扩展Channel.githup?Github:Gitlab; 函数foo(a:C,b:ParamType):void{} foo(Channel.GITLAB,{u foo:1});//错误 foo(Channel.GITLAB,{u-bar:1});//成功



请告诉我它是否有效)

这里有一些替代方法:

枚举通道{ GITHUB='GITHUB', GITLAB='GITLAB', } 接口Github{ 类型:“Github” } 接口Gitlab{ 键入:“Gitlab” } /** *第一种方法 */ 类型Params=[Channel.GITHUB,GITHUB]|[Channel.GITLAB,GITLAB] 函数foo(…参数:Params){ if(args[0]==Channel.GITHUB){ const x=args[1]//Github } } 类型重载= &((a:Channel.GITHUB,b:GITHUB)=>void) &((a:Channel.GITLAB,b:GITLAB)=>void) /** *第二种方法 */ const foo2:重载=(a:Channel,b:Github | Gitlab)=>null const result=foo2(Channel.GITHUB,{type:'GITHUB'})//确定 /** *第三种方法 */ 函数foo3(a:Channel.GITLAB,b:GITLAB):void 函数foo3(a:Channel.GITHUB,b:GITHUB):void 函数foo3(a:Channel,b:Github | Gitlab){ } foo3(Channel.GITLAB,{type:'GITLAB'})//确定

这里有一些替代方法:

枚举通道{ GITHUB='GITHUB', GITLAB='GITLAB', } 接口Github{ 类型:“Github” } 接口Gitlab{ 键入:“Gitlab” } /** *第一种方法 */ 类型Params=[Channel.GITHUB,GITHUB]|[Channel.GITLAB,GITLAB] 函数foo(…参数:Params){ if(args[0]==Channel.GITHUB){ const x=args[1]//Github } } 类型重载= &((a:Channel.GITHUB,b:GITHUB)=>void) &((a:Channel.GITLAB,b:GITLAB)=>void) /** *第二种方法 */ const foo2:重载=(a:Channel,b:Github | Gitlab)=>null const result=foo2(Channel.GITHUB,{type:'GITHUB'})//确定 /** *第三种方法 */ 函数foo3(a:Channel.GITLAB,b:GITLAB):void 函数foo3(a:Channel.GITHUB,b:GITHUB):void 函数foo3(a:Channel,b:Github | Gitlab){ } foo3(Channel.GITLAB,{type:'GITLAB'})//确定

?这根本不使用Github和Gitlab接口
ParamType
应该根据第一个参数定义,即@Joonas谢谢帮助。我错过了这一部分)这根本不使用Github和Gitlab接口
ParamType
应该根据第一个参数定义,即@Joonas谢谢帮助。我错过了那部分)
enum Channel {
  GITHUG = 'github',
  GITLAB = 'gitlab',
}

interface Github {}

interface Gitlab {}

function foo (a, b) {}
enum Channel {
  GITHUG = 'github',
  GITLAB = 'gitlab',
}

interface Github {
  _foo: number
}

interface Gitlab {
  _bar: number
}

type ParamType<C> = C extends Channel.GITHUG ? Github : Gitlab;
function foo<C extends Channel>(a: C, b: ParamType<C>): void {}

foo(Channel.GITLAB, { _foo: 1 }); // error
foo(Channel.GITLAB, { _bar: 1 }); // success