typescript 定义。什么时候类需要动态化?

标签 typescript

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

export class Filter
{
    do stuff...
}

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

例如,“Marble”滤镜可能具有“频率”值,而“BlurX”滤镜则具有“模糊”值。

所以:

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

遇到这种情况我该如何处理?有 12 种过滤器类型,所以也许我可以用接口(interface)做点什么?但是,我不明白其他人应该如何知道这一点:

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

如果我确实采用上面的示例,是否可以创建一个空的 IFilter?那么 IMarbleFilter 实现了 IFilter,Filter 也实现了?

如果有任何建议,我将不胜感激。我在我的项目中向本地询问,但社区没有回复,所以请各位大师尝试一下。

最佳答案

您无法使用 TypeScript 执行此操作,因为类上的 new 运算符会返回该类的实例。但是您可以通过使用专用签名的接口(interface)来做到这一点:

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

关于 typescript 定义。什么时候类需要动态化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23800698/

相关文章:

typescript - 缩写冗长的 TypeScript 类型

typescript - Typescript、CommonJS 和 Browserify 的循环依赖问题

javascript - ExpressJS 上的空 req.query

mysql - MariaDB node.js 的 pool.getConnection 的 typescript 错误

javascript - typescript :在类型 'string' A 上找不到参数类型为 '{ "的索引签名“:字符串;}

typescript - 使用接口(interface)在 typescript 中键入匿名对象

typescript 错误: would overwrite input file

javascript - Angularjs - 在完成之前删除元素闪烁的指令

javascript - 拦截器 Angular 6 中的刷新 token (JWT)

带有数组或字符串的 Javascript 开关盒