【问题标题】:Interface that is optionally callable可选择调用的接口
【发布时间】:2018-12-09 07:06:13
【问题描述】:

我有一个用例,我创建了一个带有数据的绑定函数,或者我只使用一个对象。

所以现在我有了这个界面:

export interface LMLockSuccessData  {
  (err: any, v: LMLockSuccessData): void 
  acquired: boolean,
  lockUuid: string,
  id: string
}

在某些情况下我使用:

const fn = foo.bind(this, 'bar');
fn.id = 'bar';
fn.lockUuid = null;
fn.acquired = true;

或者我只是这样做:

{id: 'bar', lockUuid: null, acquired: true}

所以我的问题是,有没有办法让这一行在界面中成为可选的?

export interface LMLockSuccessData  {
  (err: any, v: LMLockSuccessData): void  // make this optional? 
  acquired: boolean,
  lockUuid: string,
  id: string
}

使用问号,不起作用:

  (err: any, v: LMLockSuccessData)?: void 

【问题讨论】:

    标签: typescript typescript-typings tsc


    【解决方案1】:

    您可以按如下方式构造这样的类型。第一部分是包含普通属性的接口:

    interface P {
        acquired: boolean,
        lockUuid: string,
        id: string
    }
    

    然后是函数类型:

    interface F {
        (err: any, v: LMLockSuccessData): void
    }
    

    最后,创建属性类型属性与函数的组合。

    type LMLockSuccessData = P | (P & F);
    

    但是,我不确定现在这些对您的用例有多大用处。请注意,bind 当前不是强类型。它使用anyTypeScript is likely to fix this soon.

    但即便如此,打字也可能毫无帮助。如果您编写的类型旨在使其与(P & F)-兼容,但您的函数声明错误(例如,缺少或额外的参数或错误的返回类型),那么它仍然是P-兼容的。因此,不正确的函数将是兼容的,正是因为您将函数设为可选,并且 额外 函数重载是允许的(它们被忽略)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 2018-10-08
      • 2018-09-05
      • 2011-02-03
      相关资源
      最近更新 更多