Obs: todos os erros do javascript citados podem serem contornados usando o typescript
Isso é verdade, ou quase, mesmo com TypeScript, ainda sim podemos ter algo como:
const anyConst = { a: "say A", b: "say B" }
anyConst['a'].toUpperCase() // Sem erro
anyConst['c'].toUpperCase() // TypeError: Cannot read properties of undefined (reading 'toUpperCase')
Ai nesses casos em que pode dar undefined temos que validar.
O TypeScript resolve muita coisa, mas ainda sim podemos ter erros, e os testes unitarios que vão nos ajudar a encontra-los antes de ir para produção.
Na verdade esse tipo de sintaxe está literalmente contornado a verificação do typescript e não seria a forma correta de utilizar, aqui um exemplo onde na ultima linha o typescript acusa de erro:
const anyConst = {a: "say A", b: "say B"};
//jeito errado
anyConst['a'].toUpperCase();
anyConst['c'].toUpperCase(); // não acusa erro na compilação
//jeito certo
anyConst.a.toUpperCase();
anyConst.c.toUpperCase(); // acusa erro na compilação
não imagino uma ocasião onde seria necessario utilizar essa forma anyConst['c'], caso seja necessario ter usar uma estrutura parecida com essa eu optaria por usar um map dessa forma
const anyConst = new Map([
["a","say A"],
["b","say B"]
]);
anyConst.get('a').toUpperCase(); // acusa erro na compilação
anyConst.get('c').toUpperCase(); // acusa erro na compilação
//forma de burla o typescript:
anyConst.get('c')?.toUpperCase(); // não acusa erro na compilação somente na execusão
dessa forma o typescript ira funcionar e proteger o seu codigo de uma forma muito parecida com o Option do rust, ou com o Optional do java
caso você queira burla essas verificação do typescript você precisar usar essa sinxtaxe anyConst.get('c')?.toUpperCase();
oque não é recomendavel, e o programador que fizer isso estara de proposito fazendo algo errado