Typescript中的私有参数

时间:2018-02-01 20:58:02

标签: angular typescript

我正在学习Angular2并在classes第一次使用javascript

private参数是什么以及它为什么不能简单heroService: HeroService

constructor(private heroService: HeroService) { }

3 个答案:

答案 0 :(得分:8)

看起来像parameter property(大约在页面的一半)。基本上,向构造函数参数添加访问修饰符(public / private / protected / readonly)会自动将该参数分配给同名字段。

具体来说,来自那些文档:

  

通过为构造函数参数添加前缀来声明参数属性   使用辅助功能修改器或只读或两者。使用私人   参数属性声明并初始化私有成员;   同样,公共,受保护和只读也是如此。

以下是等同的:

class Foo {
    private bar: string;
    constructor(bar: string) {
        this.bar = bar;
    }
}

class Foo {
    constructor(private bar: string) {}
}

答案 1 :(得分:0)

private将为此类(函数)设置此变量的范围。 如果你有这个类的实例,public将允许从外部访问。 protected对于抽象超类中的属性很重要。 当我开始使用Typescript时,TypeScript页面上的游乐场(https://www.typescriptlang.org/play/index.html)帮助我理解了真正发生的事情。请记住,TypeScript是您的JavaScript的糖

答案 2 :(得分:0)

了解私人 当成员标记为私有时,无法从其包含的类外部访问它。例如:

class Animal {
    private name: string;
    constructor(theName: string) { this.name = theName; }
}

new Animal("Cat").name; // Error: 'name' is private;

TypeScript是一种结构类型系统。当我们比较两种不同的类型时,无论它们来自哪里,如果所有成员的类型都兼容,那么我们说类型本身是兼容的。

但是,在比较具有私有成员和受保护成员的类型时,我们会以不同方式处理这些类型。对于两种类型兼容,如果其中一种具有私有成员,则另一种必须具有源自同一声明的私有成员。这同样适用于受保护的成员。

让我们看一个例子,以便更好地了解这在实践中如何发挥作用:

class Animal {
    private name: string;
    constructor(theName: string) { this.name = theName; }
}

class Rhino extends Animal {
    constructor() { super("Rhino"); }
}

class Employee {
    private name: string;
    constructor(theName: string) { this.name = theName; }
}

let animal = new Animal("Goat");
let rhino = new Rhino();
let employee = new Employee("Bob");

animal = rhino;
animal = employee; // Error: 'Animal' and 'Employee' are not compatible

在此示例中,我们有一个Animal和一个Rhino,其中Rhin o是Animal的子类。我们还有一个新的类Employee,在形状方面看起来与Animal相同。我们创建这些类的一些实例,然后尝试将它们分配给彼此以查看将发生的情况。由于AnimalRhinoprivate中的private name: string声明中共享Animal形状的Employee面,因此它们是兼容的。但是,Employee不是这种情况。当我们尝试从Animal分配到Employee时,我们会收到这些类型不兼容的错误。尽管private还有一个名为name的{​​{1}}成员,但它不是我们在Animal中声明的成员。

有关详情,请查看:

https://www.typescriptlang.org/docs/handbook/classes.html