【问题标题】:What does this TypeScript interface syntax mean?这个 TypeScript 接口语法是什么意思?
【发布时间】:2017-06-22 14:27:18
【问题描述】:

我正在使用 Angular 4 中的 Redux 库与 Epics 合作。我一直在研究该库的 index.d.ts,并且遇到了以下问题:

export declare interface Epic<T, S> {
  (action$: ActionsObservable<T>, store: MiddlewareAPI<S>): Observable<T>;
}

这个语法是什么意思?由于该成员没有名称,我只能猜测整个接口定义了一个函数类型,它接受两个参数——ActionsObservable&lt;T&gt; 和一个MiddlewareAPI&lt;S&gt;——并返回一个Observable&lt;T&gt;

是这样吗?在这种情况下,为什么要定义为接口?

我很高兴按照另一个开发人员的模板使用这个界面,但我很好奇它的含义。其用法摘录如下所示:

getStuff(): Epic<IAction, IAppState> {
  return (action$, store): any => action$
    .ofType(actions.SOME_ACTION)
    .mergeMap((_) => {
      return this.apiService.get(`some/api/call/`)
        .map((result) => {
          return actions.someActionSuccess({data: result});
        });
    });
}

这有点支持我的理解,因为getStuff() 确实返回了一个具有此签名的函数。但是比疯狂的猜测更可靠的东西会很棒!

【问题讨论】:

  • 是的,没错,它被定义为一个接口,所以你可以给它一个类型并获得类型安全,就像任何其他类型的打字一样。
  • my answer有什么不清楚的地方吗?

标签: angular typescript redux


【解决方案1】:

对吗?在这种情况下,为什么要定义为接口?

是的,没错。它是函数类型Epic 的接口。你可以阅读更多关于他们的信息in the documentation

验证回调是否实现了特定签名很有用:

interface MyCB {
  (a: string, b: string): string;
}

// expect a callback of type MyCB that returns a string
function forEach(cb: MyCB) {

}

// TS reports an error since the callback doesn't return a string
forEach(() => {});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 2012-07-25
    • 2011-11-13
    • 2014-03-31
    相关资源
    最近更新 更多