【发布时间】:2017-07-04 10:40:26
【问题描述】:
我有一个想要在打字稿文件中使用的淘汰扩展器,但我不知道如何声明它。
扩展器是用 javascript 编写的,我想从 typescript 文件中使用它(因为该项目目前是 javascript 和 typescript 的混合体)。但是,我无法弄清楚如何为扩展器添加定义。从this question 我已经添加到KnockoutExtenders 界面(虽然我不确定我是否错过了这个问题的重点),如下所示:
interface KnockoutExtenders {
trackChange<T>(target: T, track: boolean): ITrackChange<T>;
}
interface ITrackChange<T> extends KnockoutObservable<T> {
setOriginalValue(startingValue: T): void;
resetToConfirmedValue(): void;
setConfirmedValue(): void;
numberChanges(): number;
}
扩展器的用法如下:
class ProductTypeViewModel {
constructor() {
this.name.setOriginalValue('Initial value');
}
name = ko.observable('').extend({
trackChange: true
});
}
我在this.name.setOriginalValue 上收到打字稿构建错误,因为Property 'setOriginalValue' does not exist on type 'KnockoutObservable<string>',这当然是真的。
我应该如何声明扩展器,以便 typescript 可以识别 observable 已被赋予新方法(即它不再是 KnockoutObservable<string> 而现在是 ITrackChange<string>)?
(不确定扩展器的解释是否相关,但无论如何: 扩展器跟踪对可观察对象的更改并允许它们被接受/取消。这允许使用 observable 来显示当前值,并且在编辑模式上,相同的 observable 可用于更改值,但在用户确认模式中的更改之前,底层值实际上不会更改。如果他们取消它们,实际上什么都没有改变。)
【问题讨论】:
标签: typescript knockout.js observable