Typescript重载可选参数无效



让我们假设一个简化的例子(我知道在这个特定的简化中不需要重载,但它被简化了(

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

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) {
}

在这种情况下,您将如何在实现中限定Return类型。

我让编译器抱怨ts(2394)的第一个定义,我不明白我做错了什么。

提前谢谢Seb

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

由于每个定义重载都可以返回不同的结果,因此实际逻辑需要某种方式来支持这一点。懒惰的方法是只返回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> {
}

相关内容

最新更新