Você pode descrever o que é a linguagem TypeScript?
O que pode fazer que o JavaScript ou as bibliotecas disponíveis não possam fazer, que me daria razões para considerar isso?
Escrevi esta resposta originalmente quando o Typescript ainda estava hot-off-the-presses. Cinco anos depois, esta é uma boa visão geral, mas veja em resposta de Lodewijk abaixo para mais profundidade
Para ter uma ideia do que quero dizer, veja o vídeo introdutório da Microsoft sobre o idioma.
Para um grande projeto JavaScript, a adoção do TypeScript pode resultar em um software mais robusto, enquanto ainda pode ser implantado onde um aplicativo JavaScript regular seria executado.
É código aberto, mas você só obtém o Intellisense inteligente ao digitar se você usar um IDE suportado. Inicialmente, este era apenas o Visual Studio da Microsoft (também notado no post do blog de Miguel de Icaza). Atualmente, outras IDEs também oferecem suporte a TypeScript.
Como exemplo, aqui está algum TypeScript (pode brincar com isto no TypeScript Playground)
class Greeter {
greeting: string;
constructor (message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
E aqui está o JavaScript que ele produziria
var Greeter = (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
})();
Observe como o TypeScript define o tipo de variáveis de membro e parâmetros do método de classe. Isso é removido ao traduzir para JavaScript, mas utilizado pelo IDE e compilador para detectar erros, como passar um tipo numérico para o construtor.
Ele também é capaz de inferir tipos que não são explicitamente declarados, por exemplo, ele determinaria o método greet()
devolve uma string.
TypeScript é um super conjunto de JavaScript datilografado que se compila em linguagem simples JavaScript - typescriptlang.org. JavaScript é uma linguagem de programação desenvolvida pelo EMCA's Technical Committee 39, que é um grupo de pessoas composto por muitos interessados diferentes. TC39 é um comité alojado por ECMA: uma organização interna de normalização. O JavaScript tem muitas implementações diferentes por muitos fornecedores diferentes (por exemplo, Google, Microsoft, Oracle, etc.). O objetivo do JavaScript é ser a lingua franca da web. O TypeScript é um super conjunto da linguagem JavaScript que tem um único compilador open-source e é desenvolvido principalmente por um único fornecedor: Microsoft. O objetivo do TypeScript é ajudar a detectar erros cedo através de um sistema de tipo e tornar o desenvolvimento do JavaScript mais eficiente. Essencialmente, o TypeScript atinge seus objetivos de três maneiras:
- Apoio a recursos modernos de JavaScript - A linguagem JavaScript (não o tempo de execução) é padronizada através dos padrões ECMAScript. Nem todos os navegadores e runtimes JavaScript suportam todas as funcionalidades de todos os padrões ECMAScript (veja esta visão geral). O TypeScript permite a utilização de muitos dos mais recentes recursos ECMAScript e os traduz para alvos ECMAScript mais antigos à sua escolha (veja a lista de compilar alvos sob a opção de compilador `--target'). Isto significa que você pode utilizar com segurança novas funcionalidades, como módulos, funções lambda, classes, o operador de propagação e desestruturação, enquanto se mantém compatível com navegadores antigos e tempos de execução JavaScript.
- Advanced type system - O suporte ao tipo não faz parte do padrão ECMAScript e provavelmente nunca será devido à natureza interpretada ao invés da natureza compilada do JavaScript. O sistema de tipo de TypeScript é incrivelmente rico e inclui: interfaces, enums, tipos híbridos, genéricos, tipos de união/intersecção, modificadores de acesso e muito mais. O site oficial do TypeScript dá uma visão geral dessas características. O sistema de tipos do Typescript está em par com a maioria das outras linguagens digitadas e, em alguns casos, indiscutivelmente mais poderoso.
- **Suporte a ferramentas de desenvolvimento*** - O compilador do Typescript pode ser executado como um processo de fundo para suportar tanto a compilação incremental quanto a integração do IDE, de forma que você possa navegar mais facilmente, identificar problemas, inspecionar possibilidades e refatorar sua base de códigos.
relação do TypeScript com outras linguagens de direcionamento JavaScript
O TypeScript tem uma filosofia única em comparação com outras linguagens que compilam para JavaScript. O código JavaScript é um código TypeScript válido; o TypeScript é um super conjunto de JavaScript. Você pode quase renomear seus arquivos
.js' para arquivos
.ts' e começar a utilizar TypeScript (veja "Interoperabilidade JavaScript" abaixo). Os arquivos TypeScript são compilados para JavaScript legível, para que a migração de volta seja possível e a compreensão do TypeScript compilado não seja difícil. O TypeScript se baseia no sucesso do JavaScript enquanto melhora os seus pontos fracos. Por um lado, você tem ferramentas à prova de futuro que levam os padrões ECMAScript modernos e o compilam para versões JavaScript mais antigas, sendo Babel a mais popular. Por outro lado, você tem linguagens que podem ser totalmente diferentes do JavaScript, como o CoffeeScript, Clojure, Dart, Elm, Haxe, Scala.js, e um host inteiro mais (veja esta lista). Essas linguagens, embora possam ser melhores do que o futuro do JavaScript, correm um risco maior de não encontrar adoção suficiente para que seu futuro seja garantido. Você também pode ter mais dificuldades em encontrar desenvolvedores experientes para algumas dessas linguagens, embora as que você encontrará muitas vezes possam ser mais entusiastas. O Interop com JavaScript também pode estar um pouco mais envolvido, já que eles estão mais distantes do que o JavaScript realmente é. O TypeScript situa-se entre estes dois extremos, equilibrando assim o risco. O TypeScript não é uma escolha arriscada por nenhum padrão. É preciso muito pouco esforço para se acostumar se você está familiarizado com o JavaScript, uma vez que ele não é uma linguagem completamente diferente, tem excelente suporte à interoperabilidade do JavaScript e tem visto muita adoção recentemente.Opcionalmente digitação estática e inferência de digitação
O JavaScript é datilografado de forma dinâmica. Isto significa que o JavaScript não sabe que tipo é uma variável até que ela seja realmente instanciada em tempo de execução. Isto também significa que pode ser tarde demais. TypeScript adiciona suporte de tipo ao JavaScript. Bugs que são causados por falsas suposições de algum tipo de variável podem ser completamente erradicados se você jogar suas cartas corretamente (o quão rigoroso você digita seu código ou se você digitar seu código é da sua responsabilidade). O TypeScript torna a digitação um pouco mais fácil e muito menos explícita pelo uso da inferência de tipo. Por exemplo:
var x = "olá"
em TypeScript é o mesmo quevar x : string = "olá"
. O tipo é simplesmente inferido a partir do seu uso. Mesmo que você não digite explicitamente os tipos, eles ainda estão lá para salvar você de fazer algo que de outra forma resultaria em um erro de tempo de execução. O TypeScript é opcionalmente digitado por padrão. Por exemplofunction divideByTwo(x) { return x / 2 }
é uma função válida em TypeScript que pode ser chamada com qualquer tipo de parâmetro, mesmo que chamá-la com uma string obviamente resultará em um erro runtime. Assim como você está acostumado no JavaScript. Isto funciona, porque quando nenhum tipo foi explicitamente atribuído e o tipo não pôde ser inferido, como no exemplo divide por dois, o TypeScript irá implicitamente atribuir o tipoany
. Isto significa que a assinatura de tipo da função divideByTwo torna-se automaticamentefunction splitByTwo(x : any) : any
. Há uma bandeira de compilação para desautorizar este comportamento:--noImplicitAny
. Habilitar esta flag lhe dá um maior grau de segurança, mas também significa que você terá que fazer mais digitação. Os tipos têm um custo associado a eles. Primeiro de tudo, há uma curva de aprendizado, e segundo, é claro, vai custar um pouco mais de tempo para você configurar uma base de código usando a digitação rígida adequada também. Na minha experiência, esses custos valem totalmente a pena em qualquer base de código séria que você estiver compartilhando com outros. Um Estudo em Grande Escala de Linguagens de Programação e Qualidade de Código em Github sugere que "as linguagens datilografadas estaticamente, em geral, são menos propensas a defeitos do que os tipos dinâmicos, e que uma digitação forte é melhor do que uma digitação fraca no mesmo sentido". É interessante notar que este mesmo artigo conclui que o TypeScript é menos propenso a erros do que o JavaScript: Para aqueles com coeficientes positivos, podemos esperar que a linguagem está associado a, ceteris paribus, um maior número de correcções de defeitos. Estas linguagens incluem C, C++, JavaScript, Objective-C, Php, e Python. As linguagens Clojure, Haskell, Ruby, Scala, e TypeScript, todos têm coeficientes negativos, o que implica que estes idiomas são menos provável do que a média para resultar em erros de reparação de defeitos.Suporte aprimorado do IDE
A experiência de desenvolvimento com TypeScript é uma grande melhoria em relação ao JavaScript. O IDE é informado em tempo real pelo compilador TypeScript sobre sua rica informação de tipo. Isto dá algumas das principais vantagens. Por exemplo, com o TypeScript, você pode fazer refatorações com segurança, como renomeações em toda a sua base de códigos. Através do completamento de código, você pode obter ajuda em linha sobre quaisquer funções que uma biblioteca possa oferecer. Não é mais necessário lembrá-las ou procurá-las em referências online. Erros de compilação são relatados diretamente no IDE com uma linha vermelha em forma de traço enquanto você está ocupado com a codificação. Em suma, isto permite um ganho significativo em produtividade em comparação com o trabalho com JavaScript. Pode-se gastar mais tempo codificando e menos tempo depurando. Há uma grande variedade de IDEs que têm excelente suporte a TypeScript, como Visual Studio Code, WebStorm, Atom e Sublime.
Cheques nulos rígidos
Erros de tempo de execução do formulário
cannot read property 'x' of undefined' ou
undefined is not a function' são muito comumente causados por bugs no código JavaScript. O TypeScript já reduz a probabilidade de ocorrência desses tipos de erros, já que não se pode utilizar uma variável que não é conhecida pelo compilador TypeScript (com exceção das propriedades deany
typed variables). Ainda assim é possível utilizar erroneamente uma variável que está definida comoundefined'. No entanto, com a versão 2.0 do TypeScript você pode eliminar esses tipos de erros todos juntos através da utilização de tipos não-nuláveis. Isto funciona da seguinte forma: Com verificações estritamente nulas ativadas (
--strictNullChecks' flag do compilador) o compilador TypeScript não permitirá queundefined' seja atribuído a uma variável a menos que você a declare explicitamente como sendo do tipo nulo. Por exemplo,
let x : number = undefinedresultará em um erro de compilação. Isto se encaixa perfeitamente na teoria do tipo, uma vez que
undefinednão é um número. Pode-se definir
xpara ser uma soma do tipo
numbere
undefinedpara corrigir isso:
let x : número | undefined = indefinido. Uma vez que um tipo é conhecido por ser nulo, o que significa que é de um tipo que também pode ser do valor
nuloou
finido, o compilador TypeScript pode determinar através da análise de tipo baseada no fluxo de controle se o seu código pode ou não utilizar com segurança uma variável ou não. Em outras palavras, quando você verifica uma variável é
infinidaatravés, por exemplo, de uma declaração
se` o compilador TypeScript irá inferir que o tipo naquele ramo do fluxo de controle do seu código não é mais nulo e, portanto, pode ser utilizado com segurança. Aqui está um exemplo simples:
let x: number | undefined;
if (x !== undefined) x += 1; // this line will compile, because x is checked.
x += 1; // this line will fail compilation, because x might be undefined.
Durante a construção, o co-designer da conferência de 2016 da TypeScript Anders Hejlsberg deu uma explicação detalhada e uma demonstração desta funcionalidade: vídeo (das 44:30 às 56:30).
Para usar TypeScript você precisa de um processo de compilação para compilar para código JavaScript. O processo de compilação geralmente leva apenas alguns segundos, dependendo do tamanho do seu projeto. O compilador TypeScript suporta compilação incremental (--watch' flag do compilador) para que todas as alterações subsequentes possam ser compiladas com maior velocidade. O compilador TypeScript pode inline informações do mapa fonte nos arquivos .js gerados ou criar arquivos .map separados. As informações do mapa de origem podem ser utilizadas por utilitários de depuração, como o Chrome DevTools e outros IDEs, para relacionar as linhas no JavaScript com as linhas que as geraram no TypeScript. Isso possibilita que você defina pontos de interrupção e inspecione variáveis durante o tempo de execução diretamente no seu código TypeScript. As informações do mapa de origem funcionam muito bem, já existia muito antes do TypeScript, mas o TypeScript de depuração geralmente não é tão bom quanto quando se utiliza diretamente o JavaScript. Pegue a palavra-chave
estapalavra, por exemplo. Devido à mudança na semântica da palavra-chave
this' em torno de fechos desde ES2015, this' pode realmente existir durante o tempo de execução como uma variável chamada
_this' (veja esta resposta). Isso pode confundi-lo durante a depuração, mas geralmente não é um problema se você souber sobre isso ou inspecionar o código JavaScript. Deve-se notar que Babel sofre exatamente o mesmo tipo de problema.
Há alguns outros truques que o compilador TypeScript pode fazer, como gerar código de interceptação baseado em decoradores, gerar código de carregamento de módulos para diferentes sistemas de módulos e analisar JSX. No entanto, você provavelmente precisará de uma ferramenta de compilação além do compilador Typescript. Por exemplo, se você quiser comprimir seu código, você terá que adicionar outras ferramentas ao seu processo de compilação para fazer isso.
Existem plugins de compilação TypeScript disponíveis para Webpack, Gulp, Grunt e praticamente qualquer outra ferramenta de compilação JavaScript por aí. A documentação TypeScript tem uma seção sobre integração com ferramentas de compilação cobrindo todas elas. Um linter também está disponível para o caso de você querer verificar ainda mais o tempo de compilação. Há também um grande número de projetos de sementes por aí que o farão começar com TypeScript em combinação com um monte de outras tecnologias como Angular 2, React, Ember, SystemJS, Webpack, Gulp, etc.
Como o TypeScript está tão intimamente relacionado ao JavaScript, ele tem grandes capacidades de interoperabilidade, mas algum trabalho extra é necessário para trabalhar com bibliotecas JavaScript em TypeScript. Definições de TypeScript são necessárias para que o compilador TypeScript entenda que chamadas de função como _.groupBy' ou
angular.copy' ou $.fadeOut' não são de fato declarações ilegais. As definições para essas funções são colocadas em arquivos
.d.ts'.
A forma mais simples que uma definição pode tomar é permitir que um identificador seja utilizado de qualquer forma. Por exemplo, ao utilizar Lodash, um arquivo de definição de linha única declare var _ : any
permitirá que você chame qualquer função que você queira em _
, mas então, é claro, você ainda é capaz de cometer erros: _.foobar()
seria uma chamada TypeScript legal, mas é, é claro, uma chamada ilegal em tempo de execução. Se você quer suporte a digitação e conclusão de código apropriados, seu arquivo de definição precisa ser mais exato (veja lodash definitions para um exemplo).
módulos Npm que vêm pré-embalados com suas próprias definições de tipo são automaticamente compreendidos pelo compilador TypeScript (veja documentação). Para praticamente qualquer outra biblioteca JavaScript semi-popular que não inclua suas próprias definições, alguém por aí já disponibilizou definições de tipo através de outro módulo npm. Estes módulos são prefixados com "@types/" e vêm de um repositório Github chamado DefinitelyTyped.
Há uma advertência: as definições de tipo devem corresponder à versão da biblioteca que você está usando em tempo de execução. Caso contrário, o TypeScript pode impedir que você chame uma função ou desreferencie uma variável que existe ou permitir que você chame uma função ou desreferencie uma variável que não existe, simplesmente porque os tipos não correspondem ao tempo de execução em tempo de compilação. Portanto, certifique-se de carregar a versão correta das definições de tipo para a versão correta da biblioteca que você está usando.
Para ser honesto, há um pequeno incômodo nisso e pode ser uma das razões pelas quais você não escolhe o TypeScript, mas sim algo como Babel que não sofre com a necessidade de obter definições de tipo. Por outro lado, se você sabe o que está fazendo você pode facilmente superar qualquer tipo de problema causado por arquivos de definição incorretos ou ausentes.
Qualquer arquivo .js' pode ser renomeado para um arquivo
.ts' e executado através do compilador TypeScript para obter sintacticamente o mesmo código JavaScript de uma saída (se estava sintacticamente correto em primeiro lugar). Mesmo quando o compilador TypeScript recebe erros de compilação, ele ainda irá produzir um arquivo .js'. Ele pode até aceitar arquivos
.js' como entrada com a bandeira --allowJs'. Isto permite que você comece com o TypeScript imediatamente. Infelizmente, erros de compilação são prováveis de ocorrer no início. É preciso lembrar que esses erros não são erros de compilação como você pode estar acostumado com outros compiladores. Os erros de compilação que se obtém no início ao converter um projeto JavaScript para um projeto TypeScript são inevitáveis pela natureza do TypeScript. O TypeScript verifica *todo* o código de validade e, portanto, precisa saber sobre todas as funções e variáveis que são utilizadas. Assim, as definições de tipo precisam estar em vigor para todas elas, caso contrário, erros de compilação são inevitáveis. Como mencionado no capítulo acima, para praticamente qualquer estrutura JavaScript existem arquivos
.d.ts' que podem ser facilmente adquiridos com a instalação de DefinitivelyTyped packages. No entanto, pode ser que você tenha utilizado alguma biblioteca obscura para a qual não há definições TypeScript disponíveis ou que você tenha polifilhado algumas primitivas do JavaScript. Nesse caso, você deve fornecer definições de tipo para que esses bits desapareçam para que os erros de compilação desapareçam. Basta criar um arquivo .d.ts' e incluí-lo no array de arquivos tsconfig.json, para que ele seja sempre considerado pelo compilador TypeScript. Nele, declare aqueles bits que o TypeScript não conhece como tipo
any`. Uma vez eliminados todos os erros, você pode gradualmente introduzir a digitação dessas partes de acordo com suas necessidades.
Alguns trabalhos de (re)configuração do seu pipeline de construção também serão necessários para colocar o TypeScript no pipeline de construção. Como mencionado no capítulo sobre compilação há muitos bons recursos por aí e eu encorajo você a procurar por projetos de sementes que utilizam a combinação de ferramentas com as quais você quer trabalhar.
O maior obstáculo é a curva de aprendizagem. Eu o encorajo a brincar com um pequeno projeto no início. Veja como funciona, como constrói, que arquivos usa, como está configurado, como funciona em seu IDE, como está estruturado, que ferramentas usa, etc. Converter uma grande base de códigos JavaScript para TypeScript é possível quando você sabe o que está fazendo. Leia este blog, por exemplo, em convertendo 600k linhas para typescript em 72 horas). Apenas certifique-se de ter um bom domínio da linguagem antes de fazer o salto.
TypeScript é open-source (Apache 2 licenciado, veja GitHub) e apoiado pela Microsoft. Anders Hejlsberg, o arquiteto líder do C# está liderando o projeto. É um projeto muito ativo; a equipe de TypeScript tem lançado muitas novas funcionalidades nos últimos anos e muitas outras ótimas ainda estão planejadas (veja o roadmap). Alguns fatos sobre adoção e popularidade:
"Fundamentos do TypeScript" -- um curso de vídeo Pluralsight por Dan Wahlin e John Papa é realmente bom, atualmente (25 de março de 2016) atualizado para refletir o TypeScript 1.8, introdução ao Typescript.
Para mim as características realmente boas, além das boas possibilidades para o intellisense, são as classes, interfaces, módulos, a facilidade de implementação do AMD, e a possibilidade de usar o depurador Typescript do Visual Studio quando invocado com o IE.
**Para resumir***: Se usado como pretendido, o Typescript pode tornar a programação JavaScript mais confiável e fácil. Ele pode aumentar significativamente a produtividade do programador JavaScript em relação ao SDLC completo.