Hi, Devs!
When we are talking about OOP (Oriented Object Programming) one interesting and necessary topic is Interfaces. When to use? That's a design decision. How to manipulate? So, let's observe some cases and uses in Typescript language.
All the things declared in Interface has a public visibility and will be implemented into a class.
First of all, one example of its simple use:
interface IPerson {
id: number,
name: string,
age: number
}
Perhaps, in some cases we can use Generics for typing a specific atribute in the implemented class:
interface IPerson<T> {
id: T,
name: string,
age: number
}
One interface can extends other:
interface IPerson<T> {
id: T,
name: string,
age: number
}
interface IUser extends IPerson<number> {
password: string
}
We can use an Interface to typing an object:
interface IProduct {
id: number,
description: string,
}
let product: IProduct = {
id: 1,
description: "That's a computer"
}
Some attributes you can leave it optionally using "?" before ":", like this (age?:) below.
interface IPerson<T> {
id: T,
name: string,
age?: number
}
It means that the Class will not require it in a mandatory way. We can take methods too:
interface IPerson<T> {
id: T,
name: string,
age: number,
getId(): T
}
And let's implements the above example:
interface IPerson<T> {
id: T,
name: string,
age: number,
getId(): T
}
class Person implements IPerson<number> {
id: number;
name: string;
age: number;
constructor(){
this.id = 0
this.name = ""
this.age = 0
}
getId(): number {
return this.id
}
}
If you need to do private our protected attributes, you need to adjust your syntax code, because the default visibility in interface is public. So, it's necessary to write the "_" before the attribute:
class Person implements Person<number> {
private _id: number;
private _name: string;
private _age: number;
constructor(){
this._id = 0
this._name = ""
this._age = 0
}
set id(id: number){
this._id = id
}
set name(name: string){
this._name = name
}
set age(age: number){
this._age = age
}
getId(): number {
return this._id
}
}
If you don't implement the set methods you get the error:
Class 'Person' incorrectly implements interface 'Person'. Type 'Person' is missing the following properties from type 'Person': id, name, age
One Class can implement multiple interfaces:
interface IPerson<T> {
id: T,
name: string,
age: number,
getId(): T
}
interface IUser {
username: string,
password: string
}
class Person implements IPerson<number>, IUser{
id: number;
name: string;
age: number;
username: string;
password: string;
constructor(){
this.id = 0
this.name = ""
this.age = 0
this.username = ""
this.password = ""
}
getId(): number {
return this.id
}
}
A abstract class can implement multiple interfaces:
interface IPerson<T> {
id: T,
name: string,
age: number,
getId(): T
}
interface IUser {
username: string,
password: string
}
abstract class Person implements IPerson<number>, IUser{
id: number;
name: string;
age: number;
username: string;
password: string;
constructor(){
this.id = 0
this.name = ""
this.age = 0
this.username = ""
this.password = ""
}
getId(): number {
return this.id
}
abstract generatePassword():string
}
class User extends Person {
generatePassword(): string {
return Math.random().toFixed + "!@#$%¨&*()"
}
}
For Type or Interface discussion see here:
https://dev.to/luizcalaca/how-to-use-in-typescript-type-or-interface-47jk
So, That's all folks!
Contacts
Email: luizcalaca@gmail.com
Instagram: https://www.instagram.com/luizcalaca
Linkedin: https://www.linkedin.com/in/luizcalaca/
Twitter: https://twitter.com/luizcalaca
Top comments (0)