Assigning Typescript constructor parameters

2020-06-10 05:19发布

问题:

I have interface :

export interface IFieldValue {
    name: string;
    value: string;
}

And I have class that implements it :

class Person implements IFieldValue{
    name: string;
    value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

after reading this post I've thinking about refactoring :

class Person implements IFieldValue{
    constructor(public name: string, public value: string) {
    }
}

Question : In first class I have fields which by default should be as private. In second sample I can only set them as public. Is it all correct or my understanding of default Access modifiers in TypeScript?

回答1:

Public by default. TypeScript Documentation

In following definition

class Person implements IFieldValue{
    name: string;
    value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

Attributes <Person>.name and <Person>.value are public by default.

as they are here

class Person implements IFieldValue{
    constructor(public name: string, public value: string) {
        this.name = name;
        this.value = value;
    }
}

Beware: Here is an incorrect way of doing it, since this.name and this.value will be regarded as not defined in the constructor.

class Person implements IFieldValue{
    constructor(name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

To make these attributes private you need to rewrite it as

class Person implements IFieldValue{
    private name: string;
    private value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

or equivalently

class Person implements IFieldValue{
    constructor (private name: string, private value: string) {}
}

which in my opinion is the most preferable way that avoids redundancy.