如何区分值和回调参数类型

问题描述 投票:0回答:1

此片段

function problem<T>(callback: T | (() => T)) : T {
    return typeof callback === 'function' ? callback() : callback;
}

产生错误

This expression is not callable.
  Not all constituents of type '(() => T) | (T & Function)' are callable.
    Type 'T & Function' has no call signatures. ts(2349)

花了一段时间我才明白Function本身的意义并不大,因为我需要的是一个[[parameter-less函数。

[在特殊情况下,例如T = number,我可以简单地切换到测试typeof callback === 'number'并完成。但是,我需要一个一般的解决方案。

我想

    都限制T以便不包含函数(如我希望的那样)可以解决问题。
  • 或对无参数函数进行运行时测试
  • 我也愿意接受替代方案(我的主要目的是了解细节)。

    有什么可能性?

    问题说明

    使用function myfun(s: string) {return s;}和通话

    problem(myfun);

    类型T = (s: string) => string被正确推断。不应有类似myfun()的回调调用;而是应返回myfun。但是,由于typeof callback === 'function'成立,它出错了。

    更新

    假设

    检查callback instanceof Function与AFAIK完全相同,我错了。

    playground from the answer不同。但是,添加

    const myfun = (s: string) => s; console.log(problem(myfun));

    说出来

    Argument of type '(s: string) => string' is not assignable to parameter of type 'string | (() => string)'. Type '(s: string) => string' is not assignable to type '() => string'.ts(2345) doAfter.ts(57, 21): Did you mean to call this expression?

    听起来像是这行的错误

    console.log(problem<(s: string) => string>(myfun));

    编译,没有类型歧义。但是,它不起作用,将返回undefined而不是myfun本身。
  • typescript callback overloading
    1个回答
    0
    投票
    通过instanceof检查就足够了:
    © www.soinside.com 2019 - 2024. All rights reserved.