如何将闭包作为构造函数参数传递

时间:2017-08-23 10:25:13

标签: typescript

我正在使用第三方库并尝试注册我自己的控件,不幸的是它要求我将构造函数作为参数传递,这之前没有问题,但现在我正在尝试向控件添加另一个依赖项并且不要我不知道如何将闭包作为参数传递以满足参数类型。

注册方法有以下签名:

class Registrator {
    static Add(controlName: string, component: new (...params: any[]) => Control): void;
}

我之前必须关注代码,但在重构后我导出了一些代码并使我的控​​件依赖于它:

//Old code - working
Registrator.Add("CountdownTimer", Controls.CountdownTimer);
//Trying to add Dependency - can't compile
const countdownTimerFormater = new Objects.Time.TimeFormater();
Registrator.Add("CountdownTimer", (...params: any[]) => return new Controls.CountdownTimer(<HTMLElement>(params[0]), countdownTimerFormater));

编译器错误是: 类型'(... params:any [])=&gt; CountdownTimer'的参数不能与'new(params:any [])=&gt; Control'类型的参数相关联。 输入'(... params:any [])=&gt; CountdownTimer'不提供签名'new(... params:any [])的匹配:Control'。

参数依赖于控件的上下文,在我的情况下,它总是长度为1并传递HTMLElement,它应该作为控件的父级服务器。 考虑到javascript中的所有东西都是函数我觉得应该有一种方法来传递满足参数的闭包,或者某种方式将我的依赖推送到我的代码中的params。

2 个答案:

答案 0 :(得分:0)

请求的参数只询问在它上面new时会返回Control类的内容。

这样做(假设CountdownTimer的类型为Control):

Registrator.Add("CountdownTimer", Controls.CountdownTimer);

如果要在CountdownTime上创建countdownTimerFormater,可以定义内联类,如下所示:

Registrator.Add("CountdownTimer", class CountdownTimer {
    private countdownTimerFormater; 

    constructor(element: HTMLElement) {
        this.countdownTimerFormater = new Objects.Time.TimeFormater();
    }
 }
);

答案 1 :(得分:0)

在不违反依赖关系注入和在应用程序入口点声明整个类的情况下,或者在扩展匿名类的情况下,我更改了参数顺序并使用了绑定函数。

Registrator.Add("CountdownTimer", Controls.CountdownTimer.bind(null, new Objects.Time.TimeFormater()));

另一种可以使用且不更改参数顺序的方法,但看起来很丑陋,就是用匿名类扩展基类,这与gilamran的答案非常相似,只是在应用程序入口点不声明整个类:

Registrator.Add("CountdownTimer", class extends CountdownTimer {
    constructor(element: HTMLElement) {
        super(element, new Objects.Time.TimeFormater());
    }
});