Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Typescript没有';t以正确的方式支持函数重载?_Typescript_Oop_Overloading - Fatal编程技术网

为什么Typescript没有';t以正确的方式支持函数重载?

为什么Typescript没有';t以正确的方式支持函数重载?,typescript,oop,overloading,Typescript,Oop,Overloading,关于函数重载如何在Typescript中工作,有很多问题(例如)。但没有像“为什么它会以这种方式工作”这样的问题 现在函数重载如下所示: function foo(param1: number): void; function foo(param1: number, param2: string): void; function foo(...args: any[]): void { if (args.length === 1 && typeof args[0] ===

关于函数重载如何在Typescript中工作,有很多问题(例如)。但没有像“为什么它会以这种方式工作”这样的问题 现在函数重载如下所示:

function foo(param1: number): void; 
function foo(param1: number, param2: string): void;

function foo(...args: any[]): void {
  if (args.length === 1 && typeof args[0] === 'number') {
    // implementation 1
  } else if (args.length === 2 && typeof args[0] === 'number' && typeof args[1] === 'string') {
    // implementation 2
  } else {
    // error: unknown signature
  }
}
我的意思是,Typescript的创建是为了通过添加一些所谓的“语法糖”使程序员的生活更轻松,这赋予了OOD的优势。那么为什么Typescript不能代替程序员来做这些烦人的事情呢?例如,它可能看起来像:

function foo(param1: number): void { 
  // implementation 1 
}; 
function foo(param1: number, param2: string): void {
  // implementation 2 
};
foo(someNumber); // result 1
foo(someNumber, someString); // result 2
foo(someNumber, someNumber); // ts compiler error
这个类型脚本代码将被转换为以下Javascript代码:

function foo_1(param1) { 
  // implementation 1 
};
function foo_2(param1, param2) { 
  // implementation 2 
}; 
function foo(args) {
  if (args.length === 1 && typeof args[0] === 'number') {
    foo_1(args);
  } else if (args.length === 2 && typeof args[0] === 'number' && typeof args[1] === 'string') {
    foo_2(args);
  } else {
    throw new Error('Invalid signature');
  }
};
我没有找到任何理由,为什么Typescript不能这样工作。有什么想法吗

Typescript的创建是为了通过添加一些所谓的“语法糖”来简化程序员的生活,这种语法糖赋予了OOD的优势


这实际上不是TypeScript的设计目标之一。你可以阅读目标。对函数重载的单独实现的支持不属于“依赖于运行时类型信息”的目标。

如果您想在TypeScript中实现“true”函数重载,那么思考一下如何实现是一个有趣的练习。让编译器获取一组单独的函数并从中生成一个函数是很容易的。但是在运行时,这个函数必须根据参数的数量和类型知道要调用几个底层函数中的哪一个。参数的数量肯定可以在运行时确定,但参数的类型完全不同,因此无法实现这一点,您将陷入困境。“但是没有像‘为什么它会以这种方式工作?’这样的问题。”AFAICS说,这可能是因为“为什么”的问题往往会迅速陷入猜测和观点,除非(有时甚至在之后)有人从语言架构师那里找到一段不连续的引语。(即使排除这一点,我也不知道这样做是否真的是为了“为什么”的问题,但我可能错了。)@underline_d,我没有为这个奇怪的问题找到特别的资源。然而,我终于找到了下面的答案。精彩的答案!他们应该将这个问题和答案添加到FAQ中,现在很明显,meI不理解您关于运行时类型检查的观点。编译器可以在编译时轻松地将每个重载转换为唯一的函数,并根据签名替换代码中的用法。与将
foo(signature_1)
foo(signature_2)
转换为
foo_1
、以及
foo_2
类似,主要区别在于,与OP建议的在运行时进行类型检查不同,您只需在编译时根据签名替换用法,因此,在运行时没有实际使用/重载的中心定义。实际上,我采用了类似的方法,使用了
fooType
函数结构,因为这比函数中的类型保护更简洁、高效、更合理;是的,那将是另一种方式。但这仍然违反了TypeScript关于根据类型系统的结果发出不同代码的规定。所以你只需要弄清楚在运行时使用哪个重载,这可能会涉及到这样一个答案。我真的不认为重载的实现会与传统的多边形填充有任何不同。是的,需要考虑在运行时使用哪个重载,但编译时和运行时函数之间仍然存在逻辑1:1映射。代码已编译,几乎不需要访问。谢谢您的回答!顺便说一句,对于在TypeScript存储库中添加函数重载,有很多明确的建议,例如[link]()