【问题标题】:Can you explain this odd ES6 arrow function in TypeScript?你能解释一下 TypeScript 中这个奇怪的 ES6 箭头函数吗?
【发布时间】:2016-01-21 18:42:44
【问题描述】:

使用 TypeScript:

public subscribe:(subscribeFunction:(state)=>void)=>()=>void;

这是一个订阅方法,它获取函数作为参数,类型为函数,并且给定的函数在调用时将接收状态参数,该参数函数不会返回任何内容(即:void)......我迷路了在最后一个()=>()=>void

我理解对了吗?

【问题讨论】:

  • 顺便说一句,没有人应该编写这样令人困惑的代码。如果很难阅读,请分解它!以type VoidFunction = { (): void; }; subscribe: { (subscribeFunction: (state) => void): VoidFunction; } 为例。

标签: typescript ecmascript-6


【解决方案1】:

它用于名为 subscribe 的公共属性,其类型为 (subscribeFunction: (state) => void) => () => void;

// scope
public
// name
subscribe:
// type (function)
    // parameters
    (
        // parameter name
        subscribeFunction:
        // parameter type (function)
        (state) => void
    ) => 
    // return type (function)
    () => void;

这是一个编译的例子:

class MyClass {
    public subscribe: (subscribeFunction: (state) => void) => () => void;
}

let myInstance = new MyClass();

myInstance.subscribe = (subscribeFunction: (state) => void) => {
    console.log("statements might go here");

    return () => {
        subscribeFunction(1 /* state */);
        console.log("nothing returned by this inner function");
    };
};

// Example use

// outputs "statements might go here"
let innerFunction = myInstance.subscribe((state) => console.log(state));
// outputs 1 and "nothing returned by this inner function"
innerFunction();

【讨论】:

  • 我一直以为你为不返回任何东西的函数做了一个 :void,我猜有多种方法...... tx!!!
  • @born2net 是的,就是这个意思。由于该方法的返回类型为() => void,因此它返回一个不返回任何内容的函数。
  • @born2net 哇,我真的把原来的解释搞砸了。我错过了:... 现在已修复。对此感到抱歉。
  • 我的意思是在我的第一条评论中说“功能”......这不是一种方法。
  • 如果您在某些状态下调用subscribeFunction,您的示例代码可能会变得更好
【解决方案2】:

注意第一个冒号——subscribe 是函数类型的公共属性,而不是方法。展开:

public subscribe: // public property, which is
    ( // of the type of a function, which takes
        subscribeFunction: // 1 parameter, which itself is
        (state) => void // a function of 1 parameter, returning nothing
    ) => // and the upon invocation of a function stored in "subscribe" it
        () => void; // returns a function of no parameter and no return value

因此,您可以将一个函数存储到subscribe 属性中,然后在给它一个函数作为参数的同时调用它,结果您将获得另一个函数,您可以随后调用它:

subscribe = (subscribeFunction: (state) => void) => {
    subscribeFunction('A');
    return () => {console.log('C');};
};
let subscribed = subscribe((state) => {
    console.log(state, 'B');
}); // prints 'A,B'
subscribed(); // prints 'C'

【讨论】:

    【解决方案3】:

    tx 反馈,现在我明白了,我认为最好的解释是:

    公开订阅:(subscribeFunction:(state)=>void)

    // 第一个药水是用于 subscribeFunction 的,它将接受一个不返回任何内容的函数

    =>()=>无效;

    //第二个药水是给订阅本身的,因为它会返回一个不返回任何东西的函数……我同意,这样的代码应该更明确

    【讨论】:

      猜你喜欢
      • 2021-03-16
      • 2011-07-28
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多