Sei que é sobre typescript e usando typescript não há necessidade de fazer essas coisas mas... Existe um método freeze(), que pelo menos impede que novos atributos sejam inclusos
export class Negociacao {
  #data;
  #quantidade;
  #valor;
  constructor(data, quantidade, valor) {
    this.#data = data;
    this.#quantidade = quantidade;
    this.#valor = valor;
    Object.freeze(this);
  }
}Então se:
'use strict';
import { Negociacao } from './models/negociacao.js';
const negociacao = new Negociacao(new Date(), 10, 100);
console.log(negociacao);
console.log(negociacao.quantidade);
console.log(negociacao);app.js

O objeto se mantém intacto.
E se tentanto criar um atributo novo:
negociacao.quantidad = 12;
console.log(negociacao.quantidad);O retorno é:
 
 
object is not extensible
Mas ainda assim, isso só é percebido em tempo de execução
 
            