网站搜索

Typescript 定义。当一个类需要动态时?


我正在尝试编写的定义文件之一是一个过滤器。过滤器代码最初是从一个 JS 文件加载的,然后使用该过滤器的字符串名称。

export class Filter
{
    do stuff...
}

问题是每个过滤器都有它自己的属性。

例如,“大理石”滤镜可能有一个“频率”数值,而“BlurX”滤镜则有一个“模糊”数值。

于是:

//loaded MarbleFilter.js as a script previously
var filter: Filter = new Filter("Marble");
filter.frequency = 10   //error

我该如何处理这种情况?有12种过滤器类型,所以也许我可以用接口做点什么?但是,我不明白别人应该怎么知道这个 :

var filter: IMarbleFilter = <IMarbleFilter>new Filter("Marble");

如果我采用上面的例子,那么创建一个空的 IFilter 是否恰当?所以 IMarbleFilter 实现了 IFilter,Filter 也实现了 IFilter 吗?

我会很感激任何建议。我在我的项目中向本地社区询问过,但没有收到回应,所以来向你们这些专家请教。

答案#1

你不能用 TypeScript 类 来做这件事,因为对类使用 new 操作符会返回类的一个实例。但你可以使用带有特化签名的 接口 来做到这一点:

interface Filter{}
interface MarbleFilter extends Filter{ frequency: number; }
interface BlurFilter extends Filter{}

interface FilterCreator{
    new (arg:"Marble"): MarbleFilter;
    new (arg:"Blur"): BlurFilter;
    new (arg:string):Filter;
}

var Filter:FilterCreator; 
// TODO: create a javascript variable that satisfies
// the specified interface

// usage: 
var filter = new Filter("Marble");
filter.frequency = 10; // okay

答案#2

我建议考虑一下实现命令设计模式,或者类似的东西。

http://www.dofactory.com/javascript-command-pattern.aspx

这将允许你编写如下代码:

SearchFilter sf = new SearchFilter();
sf.Execute( new MarbleFilter( 10 ));
sf.Execute( new OtherFilter("test"));