在KnockoutJS中,您可以向observableArrays添加其他属性,例如:
class Table {
items: KnockoutObservableArray<SomeType>;
constructor() {
this.items = ko.observableArray<SomeType>();
this.items.someMethod = ko.pureComputed([...]);
}
}
也就是说,TypeScript会将someMethod
属性标记为错误,并且不会编译。
看来上面适用于KnockoutObservable<T>
,但不适用于KnockoutObservableArray<T>
(使用DefinitelyTyped的Knockout定义文件)。
有没有办法允许这些额外的属性,而不必为每一个属性求助于以下?
/// Inside a custom definition file
interface KnockoutObservableArray<T> {
someMethod: any; // Works, but is tedious and pollutes the definitions
[x: string]: any; // Indexers don't work...
}
我也不热衷于使用any
作为父属性的定义。
好吧,似乎为了使这个工作,需要使用索引器选项,然后将动态属性引用为this.items['someMethod']()
而不是this.items.someMethod()
。看起来TypeScript规范根本不允许类定义中的动态或任意属性。
如果您要将任意属性附加到类型化对象,我发现这样做的最简单方法是在想要读取和写入这些属性时将对象强制转换为any
。所以在你的情况下你会这样做:
(self.items as any).someMethod = ko.pureComputed();
var value = (self.items as any).someMethod();
此语法相当简洁,允许您访问任意属性,而不会丢失其他地方的常规类型保护。
话虽这么说,我肯定会建议不要这样做。向像这样的库对象添加任意属性只会使代码更难以阅读和推理,并没有真正提供任何好处。假设someMethod
是某种特定于items
的逻辑,我会将someMethod
逻辑附加到父视图模型本身,或者如果有足够的逻辑与items
相关,则将该逻辑拉入其自己的视图模型中,该视图模型包含项目列表和相关逻辑。