【问题标题】:Typescript overloading optional parameters non working?打字稿重载可选参数不起作用?
【发布时间】:2018-12-13 16:12:49
【问题描述】:

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

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

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),但我不明白我做错了什么。

提前谢谢你 赛博

【问题讨论】:

    标签: typescript overloading


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢(不知道)。我遇到的问题是返回类型因定义而异(在一种情况下返回一个函数,另一种情况下返回一个返回函数的函数)。我将更新我的示例
    • 当您只有一种定义的方式来使用函数时,它不是必需的,但是当您有多种方式时,由于它可能返回多种类型而需要它,具体取决于传递给函数的内容。
    • 不确定你的意思——如果可能的话,你能用更新的例子解释一下吗?提前致谢
    • 基本上你所说的,你的类型都返回不同的东西。因此,您需要告诉该函数所有定义返回的所有类型。
    • 我还更新了我的答案,内容应该适合你。
    猜你喜欢
    • 2019-11-06
    • 1970-01-01
    • 2019-09-15
    • 2020-05-22
    • 2021-08-05
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多