Typescript 如何使用--noImplicitAny编写函数重载?

Typescript 如何使用--noImplicitAny编写函数重载?,typescript,Typescript,如何使用--noImplicitAny进行函数重载 这是我的示例代码: 函数plus(a:string,b:string):string; 函数加(a:数字,b:数字):数字; //错误->参数“a”隐式具有“any”类型。 //错误->参数“b”隐式具有“any”类型。 函数加(a,b):任何{ 返回a+b; } 这是从TypeScript复制的代码: 函数pickCard(x:{suit:string;card:number}[]):number; 函数pickCard(x:number)

如何使用--noImplicitAny进行函数重载

这是我的示例代码:

函数plus(a:string,b:string):string;
函数加(a:数字,b:数字):数字;
//错误->参数“a”隐式具有“any”类型。
//错误->参数“b”隐式具有“any”类型。
函数加(a,b):任何{
返回a+b;
}
这是从TypeScript复制的代码:

函数pickCard(x:{suit:string;card:number}[]):number;
函数pickCard(x:number):{suit:string;card:number};
//错误->参数“x”隐式具有“any”类型。
功能选取卡(x):任意{
if(typeof x==='object'){
const pickedCard=Math.floor(Math.random()*x.length);
回执卡;
}else if(x的类型=='number'){
常数选择套装=数学楼层(x/13);
返回{suit:suits[pickedSuit],card:x%13};
}
}
这两种情况下都会发生隐含的任何错误,甚至在他们自己文档的代码中也是如此

那么,我们应该如何在启用了
noImplicitAny
的情况下正确地编写函数重载呢?

选项1:在实现中不进行类型检查,只需使用
any
您可以通过向实现的参数添加类型来进行类型检查,例如在本例中向参数添加
:any
。这仍然会导致对重载函数的任何用法进行适当的类型检查,但不会对实现进行类型检查,这可能是可取的,也可能是不可取的。这可能会使重载函数的实现更容易编写,但也可能会使其更容易实现错误,并且不使用类型检查的Javascript调用方如果使用错误的参数调用它,将不会得到任何运行时错误

函数plus(a:string,b:string):string;
函数加(a:数字,b:数字):数字;
函数加(a:任意,b:任意):任意{
返回a+b;
}
控制台日志(“编号:+plus(3,4));
log(“字符串:”+plus(“asdf”,“qwer”));
//不编译。
//日志(“混合:+加上(3,“测试”);
选项2:在实现中进行类型检查,这里使用参数和返回类型的
string | number
可以向参数添加更精确的类型。在这种情况下,它使重载函数实现更加麻烦,但它确实启用了实现的类型检查,并且如果Javascript的任何调用程序向重载函数提供错误的输入,它也会给出运行时错误

函数plus(a:string,b:string):string;
函数加(a:数字,b:数字):数字;
函数plus(a:string | number,b:string | number):string | number{
如果(a的类型==“字符串”&&b的类型==“字符串”){
返回a+b;
}
如果(a的类型==“数字”和b的类型==“数字”){
返回a+b;
}
抛出新错误(“需要一对字符串或一对数字,但得到:“+a+”,“+b”);
}
控制台日志(“编号:+plus(3,4));
log(“字符串:”+plus(“asdf”,“qwer”));
//不编译。
//日志(“混合:+加上(3,“测试”);
旁注。
很好的发现,官方文档也不是在
ǹoImplicitAny
下编译的。我已经创建了一个pull请求来修复这里的示例:。

请参见。@MelvinWM链接的问题是关于不同的问题,它有不止一个实现的优点,虽然它确实显示了一个示例,其中您还向实现的参数添加了类型。我的答案是否满足了您的问题?是的,您的答案确实抑制了错误,尽管它确实导致了来自eslint的另一个错误“no explicit any”,但我想对于这个特定问题的范围,这是正确的答案。无论如何,如果您知道任何其他不需要显式设置
any
类型的方法,请进行更新。是否抑制错误?类型检查仍然捕获错误,比如我给出的混合示例。也就是说,我会考虑你的建议。另一种选择。@yqlim作为另一种选择,您可以使实现的参数看起来像
a:string | number,b:string | number
,这是我以前尝试过的,但这意味着您必须使实现更加复杂,例如匹配类型。尽管如此,我想提到这一点会很好,如果从Javascript调用,那么匹配类型可能会很好。我想我会考虑将其添加到答案中作为备选方案,并提及其缺点和优点。@yqlim我已经用您的评论更新了答案,您对更新后的答案有何想法?