Aprendendo TypeScript (e JavaScript) com o GitHub Copilot
O GitHub Copilot tem sido um grande aliado no meu processo de aprofundamento em TypeScript.
Além de acelerar muito o processo de escrita de código boilerplate1, muitas vezes ele me permite evitar ter que pesquisar como fazer algo que ainda não sei.
E se dou “dicas” durante a escrita do código, ele traz resultados ainda melhores.
Por exemplo, precisava detectar se um objeto tinha uma propriedade opts
e, se
tivesse, extrair essa propriedade e o restante do objeto.
Inicialmente eu não tinha ideia de como fazer isso. Comecei a escrever e o Copilot já me deu a linha completa do condicional. Em seguida, queria fazer um cast2 para o tipo correto. Escrevi o tipo em outra parte do arquivo e quando voltei, ele já me sugeriu o cast. Em seguida, queria tipar3 o restante do objeto… ele também me disse como. Chegamos nisso, que é um resultado inicial bem satisfatório:
if (typeof first === "object" && first !== null && "opts" in first) {
const { opts, ...restFirst } = first as {
opts: Opts;
[key: string]: unknown;
};
if (opts.group) {
console.groupCollapsed();
console.log(restFirst);
return;
}
}
Ainda dá pra melhorar, mas já ajudou demais. Pontos positivos:
- Relembrei o
in
- Descobri que é possível fazer destructuring4 de um objeto e extrair o restante dele
- Descobri como declarar um tipo que tem uma propriedade específica e o restante do objeto, tudo inline5
Footnotes
-
Código “boilerplate” é aquele que é necessário para o funcionamento das coisas, mas não é o foco do que se está fazendo. Por exemplo, importar módulos, criar interfaces, etc. ↩
-
“Cast” é a conversão de um tipo para outro. No caso, eu queria que o TypeScript entendesse que o objeto que eu estava manipulando tinha uma propriedade específica. ↩
-
“Tipar” é dizer ao TypeScript qual é o tipo de uma variável, parâmetro, etc. ↩
-
“Destructuring” é a técnica de extrair valores de um objeto ou array e atribuí-los a variáveis, tudo em uma única linha. Por exemplo:
↩const { name, age } = person;
-
“Inline” é algo que é feito no mesmo lugar onde é usado, sem precisar de uma declaração separada. Por exemplo:
const person: { name: string } = { name: "Marcelo" };
Aqui estamos dizendo qual é o tipo de
person
no mesmo lugar onde ele é criado. ↩