【问题标题】:Is there a way to infer the return type of a function parameter of a generic function type definition?有没有办法推断泛型函数类型定义的函数参数的返回类型?
【发布时间】:2021-12-12 11:52:35
【问题描述】:

假设我有一个这样的“中间人”函数的类型定义:

type Middleman = (
    callback: () => any
) => any

此函数执行“某些任务”,然后调用“回调”并返回其值。现在,Middleman 和回调都被键入以返回任何内容,但我想强烈键入这个。

我尝试过像这样引入类型参数:

type Middleman<T> = (
    callback: () => T
) => T

但这在尝试创建此函数的实现时会导致问题:

const middlemanImpl: Middleman<T> = cb => cb(); // Error, no way to get T here

正如 Middleman 所期望的“T”,并且似乎无法从每个调用站点推断它。

有没有办法实现我在这里想要实现的目标?即:泛型函数的类型定义,它返回作为参数传递的函数的返回值的类型?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您不希望 Middleman 真正成为引用特定函数的 generic 类型:

    type BadMiddleman<T> = (callback: () => T) => T;
    

    在这个版本中,你不能在不指定类型参数T的情况下提及类型BadMiddleman。一旦你这样做了,对函数的任何调用都必须使用指定的类型T

    const numMiddleman: BadMiddleman<number> = cb => cb();
    numMiddleman(() => 12); // okay
    numMiddleman(() => "abc"); // error
    

    相反,您希望Middleman 成为引用泛型函数的特定类型。区别在于泛型类型参数的范围:

    type Middleman = <T>(callback: () => T) => T;
    const middlemanImpl: Middleman = cb => cb(); // okay
    

    现在是对Middleman 类型函数的调用,它决定T 是什么类型:

    const num = middlemanImpl(() => 12); // okay
    num.toFixed();
    
    const str = middlemanImpl(() => "abc"); // okay
    str.toUpperCase();
    

    Playground link to code

    【讨论】:

      猜你喜欢
      • 2020-10-26
      • 2020-01-23
      • 2019-02-17
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2023-03-08
      相关资源
      最近更新 更多