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:ParamType):void{} foo(Channel.GITLAB,{u foo:1});//错误 foo(Channel.GITLAB,{u-bar:1});//成功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
请告诉我它是否有效)使用。查看下面的示例,或转到联机以进行实际测试(感谢您的帮助) 枚举通道{ 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