Saltar al contenido
Tips de Sintaxis | Buenas prácticas | Auto-Doc AI

Refatoração em JavaScript ES2024+: Campos Privados, Blocos Estáticos e JSDoc Estruturado

Refatore código legado em JavaScript ES2024+ com campos privados, blocos estáticos e JSDoc estruturado integrado ao ESLint e Prettier.

2026-11-15 · Tips de Sintaxis | Buenas prácticas | Auto-Doc AI · JAVASCRIPT

Modernizando Código Legado em JavaScript ES2024+

O desenvolvimento em JavaScript evoluiu drasticamente desde os dias de funções construtoras e simulação de privacidade com sublinhados (_propriedadePrivada). Na era do ES2024+, a combinação de campos privados reais (com o prefixo #), blocos de inicialização estática (static {}) e tipagem sintática com JSDoc permite manter códigos limpos, seguros e documentados em projetos de JavaScript puro.

O Problema: Padrões Legados e Encapsulamento Fraco

Em sistemas legados escritos em ES5 ou ES6 inicial, o encapsulamento dependia de convenção. Isso abria espaço para alterações indevidas de estado e oferecia pouco suporte em ferramentas de análise como ESLint.

// Código Legado (Antes)
function UserManager(initialUsers) {
  this._users = initialUsers || [];
  this._accessCount = 0;
}

UserManager.prototype.addUser = function(user) {
  if (user && user.id) {
    this._users.push(user);
    this._accessCount++;
    return true;
  }
  return false;
};

Este padrão deixa _users exposto a mutações externas não intencionais e não fornece informações sobre os tipos de parâmetros ou retornos.

A Solução Modernizada: ES2024+ e JSDoc Avançado

A sintaxe moderna do ES2024 protege o estado diretamente no motor de execução (V8 ou JavaScriptCore) utilizando #. Os blocos estáticos concentram a configuração da classe de forma limpa.

/**
 * @typedef {Object} User
 * @property {string} id - Identificador único.
 * @property {string} name - Nome completo.
 */

/**
 * Gerenciador principal de usuários.
 * @template {User} T
 */
class UserManager {
  #users = new Map();
  #accessCount = 0;
  static #MAX_CAPACITY;

  static {
    // Inicialização estática imutável
    UserManager.#MAX_CAPACITY = 1000;
  }

  /**
   * @param {T[]} [initialUsers=[]] - Coleção inicial de usuários.
   */
  constructor(initialUsers = []) {
    for (const user of initialUsers) {
      this.addUser(user);
    }
  }

  /**
   * Adiciona um novo usuário ao sistema.
   * @param {T} user - Objeto de usuário.
   * @returns {boolean} Retorna verdadeiro em caso de sucesso.
   */
  addUser(user) {
    if (!user?.id || this.#users.size >= UserManager.#MAX_CAPACITY) {
      return false;
    }
    this.#users.set(user.id, Object.freeze({ ...user }));
    this.#accessCount++;
    return true;
  }
}

Padrões de Formatação e Ferramentas

Para garantir consistência em equipes, combine Prettier e ESLint com suporte a regras modernas. Utilize o prettier-plugin-jsdoc para formatar anotações JSDoc automaticamente e ative o plugin eslint-plugin-jsdoc para validar a documentação.

Checklist para Refatoração ES2024

  • Substitua atributos _ por campos privados reais #.
  • Mova a lógica estática de inicialização para blocos static {}.
  • Documente métodos e tipos com anotações JSDoc @param, @returns e @typedef.
  • Execute o Prettier e o ESLint antes de submeter alterações.

Perguntas frequentes

Os campos privados `#` funcionam em todos os ambientes modernos?

Sim, campos privados `#` possuem suporte nativo em navegadores modernos e no Node.js a partir da versão 14.6.0.

O JSDoc substitui o TypeScript em projetos JavaScript?

O JSDoc oferece validação de tipos e autocompletar no VS Code sem a necessidade de uma etapa de compilação explícita.

Testar trecho no formatador

Ver guia de correção de erros: Como corrigir SyntaxError: Unexpected token em Node.js 22

Dicas relacionadas