我试图按照此处列出的示例:Knockout typescript extenders
在这些文件的每一个中,我实际上都有一个自定义的KnockoutBindingHandler
,所以我认为将绑定处理程序放在一边是合适的,但没有运气。
我有customKoBindings.d.ts
import * as ko from "knockout"
interface KnockoutExtenders {
logChange: (target: KnockoutObservable<any>) => KnockoutObservable<any>;
}
extensions.ts
/// <reference path="./customKoBindings.d.ts" />
import * as ko from "knockout"
export class KnockoutExtensions {
constructor() {
ko.extenders.logChange = function (target) {
target.subscribe(function (newValue) {
console.log(newValue);
});
return target;
};
}
}
Error TS2339 (TS) Property 'logChange' does not exist on type 'KnockoutExtenders'.
我看到someone像这样引用他们的新扩展程序:ko.extenders["logChange"]
但即便如此,我还是不能这样做:
this.end = ko.observable(end).extend({logChange});
Cannot find name "logChange"
是否有新的语法可以执行此操作,或者我只是遗漏了某些内容?
答案 0 :(得分:1)
TypeScript文件可以是“ambient”或“modules” - 模块是使用import
或export
的任何东西 - 你必须进行声明合并的方式取决于它的文件类型是
要合并模块中的声明,您必须使用declare
关键字。所以,你实际上有两种方法来解决这个问题......
1)从声明文件中删除import * as ko from "knockout"
,以便将其解析为环境。
2)在您的声明文件中declare
之前添加interface
。
答案 1 :(得分:0)
您可以使用jquery extend()函数执行相同的操作(假设您已将jquery导入为&#39; jquery&#39;)
jquery.extend(ko.extenders,
{
logChange: function (target) {
target.subscribe(function (newValue) {
console.log(newValue);
});
return target;
}
});