Javascript typescript中的传递类型推断

Javascript typescript中的传递类型推断,javascript,typescript,Javascript,Typescript,以以下代码段为例: 函数foo(t:“编号”):编号 函数foo(t:“string”):string 函数foo(t:“boolean”):boolean 函数foo(t:“数字”|“字符串”|“布尔”):数字|字符串|布尔{ if(Math.random()

以以下代码段为例:

函数foo(t:“编号”):编号 函数foo(t:“string”):string 函数foo(t:“boolean”):boolean 函数foo(t:“数字”|“字符串”|“布尔”):数字|字符串|布尔{ if(Math.random()<0.5){ 如果(t==“数字”){ 返回1; }else if(t==“布尔”){ 返回true; }否则{ 返回“1”; } }否则{ 返回foo(t); } } 详细错误是:

No overload matches this call.
  Overload 1 of 3, '(t: "number"): number', gave the following error.
    Argument of type '"string" | "number" | "boolean"' is not assignable to parameter of type '"number"'.
      Type '"string"' is not assignable to type '"number"'.
  Overload 2 of 3, '(t: "string"): string', gave the following error.
    Argument of type '"string" | "number" | "boolean"' is not assignable to parameter of type '"string"'.
      Type '"number"' is not assignable to type '"string"'.
  Overload 3 of 3, '(t: "boolean"): boolean', gave the following error.
    Argument of type '"string" | "number" | "boolean"' is not assignable to parameter of type '"boolean"'.
      Type '"string"' is not assignable to type '"boolean"'.(2769)
但是,以下代码通过了typescript检查:

功能条(t:“编号”):编号
功能条(t:“字符串”):字符串
功能条(t:“布尔”):布尔
功能条(t:“数字”|“字符串”|“布尔”):数字|字符串|布尔{
if(Math.random()<0.5){
如果(t==“数字”){
返回1;
}else if(t==“布尔”){
返回true;
}否则{
返回“1”;
}
}否则{
开关(t){
案例“编号”:返回条(t);
案例“字符串”:返回条(t);
案例“布尔”:返回条(t);
}
}
}

我的问题是为什么typescript在第一个代码snnipet中拒绝传递类型推断。
有人能帮我吗?非常感谢。

我不知道“如何”的答案,但这里有:

function bar<T extends "number" | "string" | "boolean">(t: T): T {
功能条(t:t):t{
如果你需要更详细的东西,有一个痛苦的失礼

function bar<T extends "number" | "string" | "boolean">(t: T): T extends "number" ? number : T extends "string" ? string : boolean
功能条(t:t):t扩展“数字”?数字:t扩展“字符串”?字符串:布尔值

这是因为
else
分支中的
t
类型为
number | string | boolean
,并且没有带有此类型参数的
foo
签名。@imk imk imk imk imk 1070;аааГаааа不是你的观点,但不幸的是,它仍然失败。@TTY112358是的,这就是为什么“痛苦的失礼”是的,因为“肯定可以解决这个问题。它可以是一个有效的解决方案,而我仍然想知道是否有更优雅的解决方案。无论如何,谢谢!