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.