🇧🇷Guia de Estilos 🎨

🔥 Este é um Guia não oficial e você pode opinar através do repositório de GitHub para juntos chegarmos a melhor definição do Ideal! Vamos colaborar? 💪

⭐️​ Variáveis e Funções:

Má nomenclatura 🚫

let FulanoVariavel: string = 'Aqui está errado.. ( ఠ ͟ʖ ఠ )';
function CiclanoFuncao(){}

Boa nomenclatura ✅​

let fulanoVariavel: string = 'Aqui está daora! (✿◠‿◠)';
function ciclanoFuncao(){}

📦 Class

Má nomenclatura 🚫

class fulano {}

Boa nomenclatura ✅​

class Fulano {}

Má nomenclatura 🚫

class fulano {
    DeTal: string; 
    Ciclano( ){ }
} 

Boa nomenclatura ✅​

class Fulano {
    deTal: string; 
    ciclano( ){ }
} 

🔌​ Interfaces:

Má nomenclatura 🚫

interface IFulano { 
    DeTal: string;
} 

Boa nomenclatura ✅​

interface Fulano { 
    deTal: string;
} 

🌟 Tipos

Má nomenclatura 🚫

type fulano = {
    DeTal: string;
}

Boa nomenclatura ✅​

type Fulano = {
    deTal: string;
}

😳 Namespaces

Má nomenclatura 🚫

namespace fulanoDeTal {
}

Boa nomenclatura ✅​

namespace FulanoDeTal {
}

🔢 Enum

Má nomenclatura 🚫

enum jogodoBicho {
    avestruz,
    borboleta,
    cachorro
}
// Não há endosso do Jogo do Bicho. Apenas é algo contextual que todo Brasileiro entenderia.

Boa nomenclatura ✅​

enum JogoDoBicho {
    Avestruz,
    Borboleta,
    Cachorro
}
// Não há endosso do Jogo do Bicho. Apenas é algo contextual que todo Brasileiro entenderia.

😅 Null vs Undefined 👀

Mal caso de uso 🚫

let pontos : {x: number, y: number | null | undefined }  = {x: 1, y: undefined } 

Bom caso de uso ✅​

let pontos: {x: number, y?: number } = { x: 777 } //  

Em suma: Precisa informar que uma propriedade é pode ser "indefinida"? Use o operador "?" antecedendo o seu tipo! 🥰

👉 Retorno de funções? 🤔

Mal caso de uso 🚫

return null;

Bom caso de uso ✅​

return undefined;

Por quê? Sugiro você consultar a página Sobre False, True, Truthy & Falsy. 🥰

- Talvez ela ainda não esteja disponível ainda, foi mal gurizada hahaha! 😅

🤨​ Callbacks?

Mal caso de uso 🚫

callbackDeAlgo(undefined);

Bom caso de uso ✅​

callbackDeAlgo(null);

E como verificar isso aí? 😅

Mal caso de uso 🚫

if (error === null) // e se for undefined? 

Bom caso de uso ✅​

if (error) // é Válido tanto para undefined quanto para o null

👉 Um exemplo um pouco mais completo sobre verificação 🔥

Mal caso de uso 🚫

if (error !== null) // Não garante que seja apenas nullo. Pode ser um valor Falseável.

Bom caso de uso ✅​

if (error != null) // Garante que é um valor de tipo primitivo (ou seja, null ou undefined mas não falsy).

📑 Formatação

O Compilador do TypeScript já fornece um bom serviço de formatação estrutural, o que já é bom o suficiente para diminuir o esforço mental do desenvolvedor (ou do time). Todavia, você também pode usar o tsfmt no terminal (linha de comando para formatar seu código) - e também está disponível como plugin para várias IDES (vscode, etc).

👉 Só um exemplo que eu acho pertinente, ou melhor, uma boa prática:

let fulano: string = 'Ciclano';

💬 Sobre Aspas...

let nomeDoSujeito: string = 'Luís Von Müller';

Todavia, muita vezes em inglês precisamos usar o a single quote para conjugar um verbo: "I'm"

let nomeDoSujeito: string = 'Luís Von Müller';
console.log(`Quem escreveu? ${nomeDoSujeito}`)

(Mas eu uso tabs configuradas como 4 espaços) 🤗

⚙️​ Ponto & Vírgula;

🗂 Sugestão para boa nomeação de arquivos.

Essa aqui é uma baita de uma discussão, depende muito do que ambiente você está e se você está seguindo o padrão de nomeação de um framework, ex: React para Componentes. Mas no geral o que a maioria dos times usa é o seguinte:

🤨​ Tipo ou Interface?

Tipos devem ser usados para definir, adivinha? Tipos. Ou seja, se você tem uma função, ela retorna um valor. E esse valor possui um tipo. Mas essa função, também recebe algo. E esse algo, também são valores, ou seja, também podem ser tipos. Mas a "meta" ideia é que interface forneça uma interface 😅. Eu acho que esse exemplo clarifica...

Aqui em baixo, eu poderia definir a função de outra maneira, optei por essa.

/** Definimos a interface (ou contrato) de uso da função */
interface DizerOi {
    nome: string;
    sobrenome?: string;
}

/**  Definimos que o tipo de retorno da função como uma Array de Strings */
type DisseOi = string[];

/** Vamos dizer oi 10x! e retornar um array! */
const dizerOi = ({nome, sobrenome}: DizerOi): DisseOi => {
    return [...Array(10).keys()].map((key) => {
        return `Olá ${nome} ${sobrenome ?? ''}`;
    })
} 

console.log(dizerOi({nome: 'Luís'}));

👯‍♀️ Anotação do tipo Array 👯‍♂️

Mal caso de uso 🚫

let variosNumeros: Array<number> = [1,2,3,4,5,6,7];

Bom caso de uso ✅​

let variosNumeros: number[] = [1,2,3,4,5,6,7];

⚠️​ Comparadores "===" e "=="

😴​ Relaxa amigo! Você tá usando TypeScript. Pode usar "===" tranquilamente!

🥰 Obrigado por ler até aqui!

Last updated

Was this helpful?