48

TypeScript中的protected等价物是什么?

我需要在基类中添加一些成员变量,以便仅在派生类中使用。

4

3 回答 3

51

更新

2014 年 11 月 12 日。TypeScript 1.3 版可用,包括受保护的关键字。

2014年9月26日,protected关键词落地。它目前处于预发布状态。如果您使用的是非常新版本的 TypeScript,您现在可以使用protected关键字...下面的答案适用于旧版本的 TypeScript。享受。

查看受保护关键字的发行说明

class A {
    protected x: string = 'a';
}

class B extends A {
    method() {
        return this.x;
    }
}

旧答案

TypeScript 只有private- 不受保护,这仅意味着在编译时检查期间是私有的。

如果你想访问super.property它必须是公开的。

class A {
    // Setting this to private will cause class B to have a compile error
    public x: string = 'a';
}

class B extends A {
    method() {
        return super.x;
    }
}
于 2013-03-07T16:44:16.627 回答
4

下面的方法怎么样:

interface MyType {
    doit(): number;
}

class A implements MyType {
    public num: number;

    doit() {
        return this.num; 
    }
}

class B extends A {
    constructor(private times: number) {
        super();
    }

    doit() {
        return super.num * this.times; 
    }
}

由于num变量被定义为公共的,这将起作用:

var b = new B(4);
b.num;

但由于它没有在接口中定义,因此:

var b: MyType = new B(4);
b.num;

将导致The property 'num' does not exist on value of type 'MyType'.
你可以在这个操场上试试。

您也可以将其包装在模块中,同时仅导出接口,然后从其他导出的方法中返回实例(工厂),这样变量的公共范围将“包含”在模块中。

module MyModule {
    export interface MyType {
        doit(): number;
    }

    class A implements MyType {
        public num: number;

        doit() {
            return this.num; 
        }
    }

    class B extends A {
        constructor(private times: number) {
            super();
        }

        doit() {
            return super.num * this.times; 
        }
    }

    export function factory(value?: number): MyType {
        return value != null ? new B(value) : new A();
    }
}

var b: MyModule.MyType = MyModule.factory(4);
b.num; /// The property 'num' does not exist on value of type 'MyType'

这个游乐场的修改版。

我知道这不完全是你要求的,但它非常接近。

于 2013-03-28T20:54:01.637 回答
1

至少目前(0.9版)受保护的规格中没有提到

http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf

于 2013-06-23T19:54:19.613 回答