Classe é a criação de um objeto e com new ClassName
eu instancio uma classe, por ex:
// Aqui eu crio a classe Book
class Book {
id: string,
titulo: string;
precoVenda: number;
custo: number;
// O constructor me permite criar a classe já passando os parâmetros desta class
constructor(id: string, titulo: string, precoVenda: number, custo: number) {
this.id = id;
this.titulo = titulo;
this.precoVenda= precoVenda;
this.custo = custo;
}
}
// Aqui eu crio uma instância da classe Book com os seguintes parâmetros:
const book1 = new Book('0001', 'Sapiens', 50.00, 38.00);
IMPORTANTE
Nas classes na horas de criar variáveis, parâmetros ou funções não é necessário utilizar os nomesconst
efunction
/* Se eu quero que uma classe tenha propriedades privadas,
eu estou dizendo que quero que essas propriedades não possam ser acessadas ou
alteradas livremente sem restrições */
// Para isso eu posso definir como 'private' e dou o nome com underline;
class Book {
private _id: string,
private _titulo: string;
private _precoVenda: number;
private _custo: number;
constructor(id: string, titulo: string, precoVenda: number, custo: number) {
this._id = id;
this._titulo = titulo;
this._precoVenda= precoVenda;
this._custo = custo;
}
// Para acessar um parâmetro privado eu utilizo o metodo 'get'
get id() {
return this._id;
}
get _titulo() {
return this._id;
}
get _precoVenda() {
return this._id;
}
get _custo() {
return this._id;
}
// Para alterar eu utilizo o metodo 'set'
set precoVenda(price: number){
this._precoVenda = price;
}
}
const book1 = new Book('0001', 'Sapiens', 50.00, 38.00);
// Agora eu consigo acessar todas as propriedades e alterar o precoVenda
book1.precoVenda = 52.00;
// Se eu quiser validar o precoVenda posso colocar a seguinte funcao:
set precoVenda(price: number) {
if(price < this._custo) {
console.error('Preço não pode ser menor que custo');
} else {
this._precoVenda = price;
}
}
/* Posso ter uma propriedade que não está associada a um atributo, por ex.
se eu quiser criar uma propriedade lucro posso declará-la com um get ou set */
get lucro(): number {
return this._precoVenda - this._custo;
}
// para acessar posso acessar simplesmente assim:
book1.profit;
IMPORTANTE
O nome dosgetters
esetters
não precisa ser necessariamente o nome dos parâmetros, e o que eles fazem é retornar o que as suas respectivas funções nativas executam.IMPORTANTE
Se tenho um**GET**
e um**SET**
definindo, é uma propriedade, não necessariamente um atributo. Não preciso ter propriedades atreladas à atributos
/* Posso criar métodos dentro das classes, que nada mais são do que funções
dentro da classe com retornos personalizados */
// Por ex. calcular o lucro de um livro
public calculateProfit(): number {
return this._precoVenda - this._custo;
}
// Ou então atualizar o preco de venda com base no lucro desejado
public setPrecoVendaMinimo(margemDeLucro: number): number {
const novoPreco = this._custo * (1 + margemDeLucro/100);
return this._precoVenda = novoPreco;
}
// Por exemplo, se quisermos ter uma venda
book1.setPrecoVendaMinimo(30);
/* Quando quero determinar parâmetros opcionais com Typescript no constructor
eu devo colocar as propriedades opcionais por último no constructor e além disso
devo implementar uma função de checagem para ela */
constructor(id: string, titulo: string, custo: number, precoVenda?: number) {
this._id = id;
this._titulo = titulo;
if(precoVenda) {
this._precoVenda = precoVenda;
} else {
this._precoVenda = custo;
}
this._custo = custo;
}
/* Este método retorna uma representação, em string, da classe que o utiliza.
E podemos usar isso para retornar coisas como */
public toString(): string {
return `Livro: ${this._titulo}, Preço: ${this._precoVenda}`
}
/* Para utilizar esse método da classe, utilizamos chamar a instância com
string literals */
console.log(`${book1}`)