可调用的接口

时间:2018-06-30 07:21:45

标签: typescript typescript-typings tsc

我有一个用例,其中我在上面创建了一个绑定函数,或者只使用一个对象。

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

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 

1 个答案:

答案 0 :(得分: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兼容。因此,不正确的函数将是兼容的,恰恰是因为您将函数设为可选函数,并且 extra 函数重载是允许的(它们将被忽略)。