Typescript 类继承:覆盖 ko.computed 方法

Posted

技术标签:

【中文标题】Typescript 类继承:覆盖 ko.computed 方法【英文标题】:Typescript class inheritance: override ko.computed method 【发布时间】:2014-01-15 10:45:39 【问题描述】:

我有简单的课程:

/// <reference path="..\typings\jquery\jquery.d.ts"/>
/// <reference path="..\typings\knockout\knockout.d.ts"/>

module Some.Namespace 

    export class TestBase 
        public field1: KnockoutObservable<string> = ko.observable("");

        public onFieldChange: KnockoutComputed<string> = ko.computed(() => 
            return this.field1();
        , this);
    

    export class Test extends TestBase 
        public field2: KnockoutObservable<string> = ko.observable("");

        public onFieldChange() 
            super.onFieldChange() + this.field2();
        
    

问题,打字稿不允许在被覆盖的方法中使用关键字 super。它说:

错误 1 ​​类“Some.Namespace.Test”无法扩展类 'Some.Namespace.TestBase':类 'Some.Namespace.Test' 定义 实例成员函数“onFieldChange”,但扩展类 'Some.Namespace.TestBase' 将其定义为实例成员属性。

错误 2 只有基类的公共方法可以通过 “超级”关键字。

我怎样才能覆盖敲除计算方法并且不丢失基本方法?

【问题讨论】:

【参考方案1】:

如果您自己定义了相同的名称,则无法从 TypeScript 中的子类访问父实例成员 property。例如以下:

class TestBase 
    public field1;
    public onFieldChange = () =>  // we need a way to reference this in the child
        return this.field1();
    ;


class Test extends TestBase 

    parentOnFieldChange:any;
    constructor()
        super(); // call super 

        // Implictly initialize local properties

        // copies local version not parent
        this.parentOnFieldChange = this.onFieldChange;
    

    public field2;
    public onFieldChange = () => 
        this.parentOnFieldChange() + this.field2();
    

生成(段):

 function Test() 
        var _this = this;
        _super.call(this); // call super

        // NO WAY to put code here 

        // Implictly initialize local properties
        this.onFieldChange = function () 
            _this.parentOnFieldChange() + _this.field2();
        ;

        // OUR code on only added after

        // copies local version not parent
        this.parentOnFieldChange = this.onFieldChange;
    

解决方案使用实例成员函数:

class TestBase 
    public field1;

    public onFieldChange() 
        return this.baseOnFieldChange();
    

    private baseOnFieldChange = () =>  // we need a way to reference this in the child
        return this.field1();
    ;


class Test extends TestBase 

    parentOnFieldChange:any;
    constructor()
        super(); // call super              
    

    public field2;
    public onFieldChange()
        return super.onFieldChange() + this.childOnFieldChange();
    

    private childOnFieldChange = () => 
        return this.field2();
    

【讨论】:

有想法...适应 ko.computed... 看起来有点乱。谢谢。

以上是关于Typescript 类继承:覆盖 ko.computed 方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥 enumerable: false 不会级联到 TypeScript 中的继承类?

TypeScript:继承类中静态方法的自引用返回类型

从 Tree 类继承 Typescript(访问父元素的属性)

TypeScript,面向对象,类、构造函数、继承、抽象类、接口和封装

跨 CommonJS 模块的 Typescript 继承 - 循环依赖

Typescript 中的私有继承等价物(仅包括或排除特定的类成员或属性)