如何在接口上创建一个函数字段,取相应函数接口的参数?

时间:2017-03-21 12:43:08

标签: oop generics inheritance typescript interface

目标

我有一个带有两个参数的私有函数:

export interface XhrHelperFunction extends Function {
    (cb ?: Function, lock ?: boolean) : any;
}

...我有一个公共函数接口,允许用户调用该私有函数:

export interface Actionable {
    run(cb : Function, lock?: boolean) : void;
}

此格式的问题是每次更新XhrHelperFunction的界面时,我都必须相应地更新Actionable界面的格式。因此,我更愿意以类似于Actionable

的方式重写run(/* Parameters of XhrHelperFunction */) : void;

尝试

我尝试过以下格式:

export interface Actionable {
    run(XhrHelperFunction) : void;
}

这在类中编写run方法签名时有效,但在将参数传递给类实例时不起作用,即。 actionable.run(cb, lock)因为显然参数不符合function run(XhrHelperFunction) : void的签名。我也无法将它们括在括号中并将它们转换为XhrHelperFunction

你有什么建议?

1 个答案:

答案 0 :(得分:2)

您可以引入参数类型,例如

interface IArguments {
    cb? : Function;
    lock? : boolean;
}

并使您的接口依赖于此类型:

export interface XhrHelperFunction extends Function {
    (args : IArguments) : any;
}

export interface Actionable {
    run(arguments : IArguments) : void;
}

我想知道,当你将一个非常薄的包装器公开为公共API时,为什么你不首先公开helper函数。这会降低此接口的复杂性。请注意,如果您发布公共接口,则更改函数的参数会变得越来越烦人,因为您需要根据Actionable接口更改所有位置。

如果要将XhrHelperFunction的更改与Actionable接口的使用者隔离,那么无论如何都不能公开相同的参数类型,您应该保留代码。