Typescript: Classes Abstratas

작성자

카테고리:

← 피드로
DEV Community · Yuri Peixinho · 2026-06-14 개발(SW)

Yuri Peixinho

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.

원문에서 계속 ↗

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다