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?
The TypeScript docs have a great example of constructor usage: class Greeter { greeting: string; constructor(message: string) { this. greeting = message; } greet() { return "Hello, " + this. greeting; } } let greeter = new Greeter("world");
The TypeScript has an automatic assignment of constructor parameters that is called “Parameter Property”.
Classes in TypeScript do not require you to explicitly write a constructor. However if you are extending a base class you will need to create a constructor to call super() at a minimum.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With