Readonly<T>
Última atualização: 2026-10-22
Readonly<T> Readonly
Readonly<T> torna todas as propriedades de T somente leitura: reatribuir uma propriedade após a criação é um erro de compilação. Ótimo para configurações, snapshots e constantes compartilhadas — dados que não deveriam mudar depois de construídos. Note que ele trava propriedades, enquanto const trava o vínculo da variável.
| Grupo | Tipos Utilitários |
|---|---|
| Tipo | Tipo |
| Modo strict | Não necessário |
ℹ️ Info O editor transpila TypeScript para JavaScript e o executa (sem verificação de tipos); veja a Saída de cada exemplo para o resultado da verificação.
📝 Sintaxe
type Readonly<T> = {
readonly [K in keyof T]: T[K];
};
// Uso
const config: Readonly<AppConfig> = { appName: "docs", port: 8080, debug: false };
// config.debug = true; // erro de compilação: Cannot assign to 'debug' because it is a read-only property
⚙️ Parâmetros
| T | O tipo de objeto a transformar; o tipo mapeado adiciona o modificador readonly a cada propriedade |
|---|
Retorno:Um novo tipo com as mesmas propriedades de T, mas todas marcadas com readonly.
▶ Exemplo
Edite o código abaixo e clique em Testar para ver o resultado transpilado:
Saída:
docs-site:8080
(Saída de execução após a transpilação; a proteção de somente leitura é imposta estaticamente pelo tsc — descomentar aquela linha produz error TS2540, enquanto o JS puro permitiria a atribuição)
💡 Observações
ℹ️ Info A implementação é um tipo mapeado: [K in keyof T] prefixado com readonly. Ele se apaga por completo na transpilação — não há proteção em tempo de execução como Object.freeze.
⚠️ Atenção Readonly é raso: uma propriedade de objeto aninhado se torna somente leitura como um todo, mas os campos internos permanecem mutáveis; propriedades array se tornam ReadonlyArray, porém elementos objeto internos continuam mutáveis. Escreva DeepReadonly para proteção profunda.
💡 Dica Comparado a as const: Readonly<T> opera sobre um tipo já existente (a inferência literal não muda — mode continua string), enquanto as const opera sobre o próprio literal (mode estreita para "dark"). Use as const para estreitamento literal e Readonly apenas para impedir mutação.
🏷️ Tipos Utilitários Relacionados
💡 Casos relacionados
Mais casos em breve.
📚 Tutoriais relacionados
❓ Perguntas frequentes
P Qual é a diferença entre Readonly e Object.freeze?
R Readonly é proteção apenas em tempo de compilação e desaparece após a transpilação (a mutação em tempo de execução tem sucesso); Object.freeze congela em tempo de execução, bloqueando escritas silenciosamente (ou com erro no modo estrito). É possível combinar os dois: Readonly nos tipos, freeze em tempo de execução.
P Uma propriedade readonly pode ser mutada por meio de uma asserção?
R Sim: (config as { debug: boolean }).debug = true compila. É exatamente por isso que readonly é uma convenção de tempo de compilação, não uma trava em tempo de execução — contorná-la é abandonar a proteção e deveria ser proibido em código de equipe.
P Qual é a relação entre ReadonlyArray e readonly T[]?
R São exatamente equivalentes: readonly T[] é a forma abreviada de ReadonlyArray<T>. Ambos proíbem push/pop/atribuição por índice e, como Readonly<T> sobre propriedades de objetos, oferecem proteção rasa de somente leitura.