TypeScript是否根本不检查函数体是否存在函数重载? 以下代码可以编译,尽管它显然没有按照其要求进行:
function a(input: string): string
function a(input: number): number
function a(input: string | number): string | number {
if (typeof input === "string") return 42
return "banana"
}
我的第三个签名有误吗?包罗万象的签名没有出现在结果类型中,而且我不知道没有该方法即可声明该函数的方法,任何尝试都会遇到Overload signature is not compatible with function implementation.
错误。
typeof a = {
(input: string): string;
(input: number): number;
}
我会接受切换到更明确的相交类型:
type C = ((input: number) => number) & ((input: string) => string)
但是我不明白如何在不使用重载语法的情况下实际创建满足该功能的函数,这看起来像是强制转换。我在Overloaded function type in typescript问题中问过这个问题。
编辑:第一个方框是一个极简的示例。您可以使用以下命令对其进行测试:
const number: number = a(0)
console.log("number", typeof number, number)
输出number string banana
const string: string = a("")
console.log("string", typeof string, string)
输出string number 42
编辑2:这不是Overloaded function type in typescript的重复项,我在问有关对所有重载进行函数实现类型检查的问题,这个问题是关于用新函数实现重载类型的问题
答案 0 :(得分:2)
TypeScript根本不检查函数体是否存在函数重载吗?
否,它不会根据超载声明检查主体。
如您所见,它检查实现签名是否与所有重载声明兼容。并检查主体是否符合实现签名;就这样。另外,在调用站点进行重载解析时,也不会考虑实现签名。
使用重载的声明来强制实现实现不是设计目标,至少这是我从FAQ解释此语句的方式:
这里的理由是因为JavaScript没有功能 重载,您将在函数中进行参数检查, 而且您的函数实现可能更宽松 您希望用户如何致电给您。