Assigning Typescript constructor parameters

demo picture demo · Jan 29, 2017 · Viewed 20.3k times · Source

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?

Answer

Maciej Caputa picture Maciej Caputa · Jan 29, 2017

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.