DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on

Typescript: Classes Abstratas

Introdução

Classes abstratas são contratos parcialmente implementados. Você define o que toda subclasse deve ter, mas deixa partes da implementação para elas.

Não podem ser instanciadas diretamente

abstract class TransmissorFiscal {
  constructor(protected tenantId: string) {}

  // método abstrato — subclasse DEVE implementar
  abstract transmitir(payload: unknown): Promise<Protocolo>;
  abstract consultar(protocolo: string): Promise<Status>;

  // método concreto — subclasse HERDA pronto
  protected logar(msg: string): void {
    console.log(`[Tenant: ${this.tenantId}] ${msg}`);
  }

  async executar(payload: unknown): Promise<Protocolo> {
    this.logar("iniciando transmissão");
    const protocolo = await this.transmitir(payload);
    this.logar(`protocolo: ${protocolo.numero}`);
    return protocolo;
  }
}

// ❌ não pode instanciar diretamente
const t = new TransmissorFiscal("tenant1");
Enter fullscreen mode Exit fullscreen mode

Subclasses implementam os métodos abstratos

class TransmissorReinf extends TransmissorFiscal {
  async transmitir(payload: unknown): Promise<Protocolo> {
    // implementação específica do REINF
    const resposta = await api.post("/reinf", payload);
    return resposta.data;
  }

  async consultar(protocolo: string): Promise<Status> {
    const resposta = await api.get(`/reinf/${protocolo}`);
    return resposta.data;
  }
}

class TransmissorEFinanceira extends TransmissorFiscal {
  async transmitir(payload: unknown): Promise<Protocolo> {
    // implementação específica do eFinanceira
    const resposta = await api.post("/efinanceira", payload);
    return resposta.data;
  }

  async consultar(protocolo: string): Promise<Status> {
    const resposta = await api.get(`/efinanceira/${protocolo}`);
    return resposta.data;
  }
}
Enter fullscreen mode Exit fullscreen mode

Se uma subclasse não implementar um método abstrato, o TypeScript acusa erro em compilação.

Top comments (0)