这个typescript代码是什么意思?

下面这段typescript代码:

function rule(name?: string, options?: IRuleOptions)(func: IRuleFunction): Rule

export type IRuleFunction = (
  parent?: any,
  args?: any,
  context?: any,
  info?: GraphQLResolveInfo,
) => IRuleResult | Promise<IRuleResult>

interface IRuleOptions {
  cache?: ICacheOptions
  fragment?: IFragment
}

问题:
第一行代码如下:

function rule(name?: string, options?: IRuleOptions)(func: IRuleFunction): Rule
              -------------------------------------  -------------------   ----
                                (1)                        (2)          (3)
                                
                            

(1)是函数的参数,可以看懂。
(2)和(3)是什么意思?

请大佬指导一下,谢谢

更新:
代码来源:https://github.com/maticzav/g...

阅读 3.3k
3 个回答

很神奇,graphql-shield 的 README.md 里确实是这么写的,但是我认为可能是 Markdown 解析出错,把 => 给搞没了。翻了下它的源码,是这么定义的:

补充一下:翻了下 README.md 的源码,发现 MD 源码中就不带 =>,所以不明白作者为什么要这么写了,不过看代码中的 rule 定义总是没有错的
export const rule = (
    name?: string | IRuleConstructorOptions,
    options?: IRuleConstructorOptions,
) => (func: IRuleFunction): Rule => {
    // ...
}

从这个关系来看 rule 是一个 (name, options) => X 类型的函数表达式,
这个 X 是 (IRuleFunction) => Rule 类型的函数表达式,其后的 => {...} 是函数体。

所以如果要完整的写 rule 的类型是

let rule: (name?: string, options?: IRuleOptions) => (func: IRuleFunction) => Rule;

或者函数定义形式

function rule(name?: string, options?: IRuleOptions): (func: IRuleFunction) => Rule { ... }

你确定你这代码是正常的?

大白话说就是一个函数里面再返回了一个函数,所以可以继续调用,2就是返回函数继续调用,3是2的返回值类型,定义如下

function rule(name?: string, options?: IRuleOptions){
    return function(func: IRuleFunction): Rule {
         // ...some
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进