我试图编写的定义文件之一是过滤器。过滤器代码最初从 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/