简体   繁体   中英

Assigning Typescript constructor parameters

I have interface:

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

And I have a 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 in my understanding of default Access modifiers in TypeScript?

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) {}
}

For TypeScript 2.X since the interace has the properties as public, you need to change the private to public and also export the classes

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM