使用Typescript设置Knockout Extender(2018)

时间:2018-03-02 18:27:45

标签: visual-studio typescript knockout.js knockout-2.0

我试图按照此处列出的示例: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"

是否有新的语法可以执行此操作,或者我只是遗漏了某些内容?

2 个答案:

答案 0 :(得分:1)

TypeScript文件可以是“ambient”或“modules” - 模块是使用importexport的任何东西 - 你必须进行声明合并的方式取决于它的文件类型是

要合并模块中的声明,您必须使用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;
    }
});