Typescript重载可选参数不起作用?

时间:2018-12-13 16:12:50

标签: typescript overloading

让我们假设一个简化的示例(我知道在这种特殊的简化中,不需要重载,但已将其简化了)

编辑:给出的第一个示例不足以理解问题,这是更新的示例:

function fn <T>( // Overload signature is not compatible with function implementation.ts(2394)
  fn: (item: T) => T,
): (idx: number) => (src: T[]) => T[]
function fn <T>(
  fn: (item: T) => T,
  idx: number,
): (src: T[]) => T[]
function fn(fn: (x: any) => any, idx?: number) {

}

您如何在此cas中限定实现中的Return类型。

我让编译器抱怨ts(2394)的第一个定义,但我没有弄错我在做什么。

先谢谢您 塞巴

1 个答案:

答案 0 :(得分:3)

要解决您的问题,您需要在实际的函数逻辑中添加返回类型,而不仅仅是定义。

由于每个定义重载都可以返回不同的结果,因此实际逻辑需要某种方式来支持它。懒惰的方法是仅返回any,但是更好的方法是返回所有由管道|分隔的定义。如果返回类型太长,只需创建一个declare type定义并分别声明每个。

declare type A<T> = (idx: number) => (src: T[]) => T[]
declare type B<T> =  (src: T[]) => T[]

function fn<T>(fn: (item: T) => T): A<T>
function fn<T>(fn: (item: T) => T, idx: number): B<T>
function fn<T>(fn: (x: any) => any, idx?: number): A<T> | B<T> {

}