Type Script Notes For Professionals
Type Script Notes For Professionals
TypeScript
mais de 80 páginas
de dicas e truques profissionais
Conteúdo
Sobre ................................................ ................................................ ................................................ ............................. 1
Capítulo 1: Introdução ao TypeScript ....................................... ................................................ ....... 2
Seção 1.1: Instalação e configuração ....................................... ................................................ ................................... 2 Seção
1.2: Sintaxe básica ......... ................................................ ................................................ ................................ 4
Seção 1.3: Olá, mundo ................................................ ................................................ ................................................ 5
Seção 1.4: Executando TypeScript usando ts-node ................................................ ................................................ ...... 6
Seção 1.5: TypeScript REPL em Node.js .............................. ................................................ ......................................... 6
Capítulo 2: Por que e quando usar o TypeScript ... ................................................ ......................................... 8 Seção 2.1:
Segurança . ................................................ ................................................ ................................................ ... 8 Seção 2.2:
Legibilidade ....................................... ................................................ ................................................ .. 8 Seção 2.3:
Ferramentas .............................. ................................................ ................................................ ........ 8 Capítulo 3: Tipos
principais do TypeScript ............................... ................................................ ................................ 9 Seção 3.1: Tipos Literais de
String ......... ................................................ ................................................ ...................... 9 Seção 3.2:
Tupla ...................... ................................................ ................................................ ............................. 12 Seção 3.3: Booleano
................................................ ................................................ ................................................ 12
Seção 3.4: Tipos de interseção .............................. ................................................ ................................ 13 Seção 3.5: Tipos
em argumentos de função e valor de retorno. Número Seção 3.6: Tipos em ................................................ ................. 13
argumentos de função e valor de retorno. Corda ............................................... ......................... 14 Seção 3.7: const Enum
................................................ ................................................ .......................................... 14
Seção 3.8: Número ................................................ ................................................ ................................................ 15
Seção 3.9: Cadeia .............................................. ................................................ ................................................ ...... 15 16
Seção 3.10: Array ...................................... ................................................ ................................................ .............
Seção 3.11: Enum ................................................ ................................................ ................................................ .. 16
Seção 3.12: Qualquer .............................................. ................................................ ................................................ ........ 16
Seção 3.13: Nulidade................................................ ................................................ ................................................ ... 16
Capítulo 4: Matrizes ....................................... ................................................ ................................................ .....17
Seção 4.1: Encontrando Objetos no Array ....................................... ................................................ ............................. 17
Capítulo 5: Enums ................................................ ................................................ ................................................ .. 18
Seção 5.1: Enums com valores explícitos ................................................ ................................................ .................. 18
Seção 5.2: Como obter todos os enums ................................................ ................................................ .............. 19
values Seção 5.3: Estendendo enums sem implementação de enumeração personalizada ....................................... ..........................
19
Seção 5.4: Implementação de enumeração personalizada: estende-se ................................................ .......................... 19
................................................ ................................................ ................................................
para enums Capítulo 6: Funções 21
Seção 6.1: Parâmetros opcionais e padrão Seção ................................................ ................................................ ..... 21
6.2: Função como um parâmetro ........................... ................................................ ................................ 21 Seção 6.3: Funções
com tipos de união ......... ................................................ ................................................ ...... 23 Seção 6.4: Tipos de Funções
Capítulo 7: Classes ................................................ ................................................ ............................. 23
................................................ ................................................ ................................................ 24
Seção 7.1: Classes abstratas ................................................ ................................................ ................................. 24
Seção 7.2: Classe simples ................................................ ................................................ ......................................... 24
Seção 7.3: Herança básica ................................................ ................................................ ................................ 25
Seção 7.4: Construtores ................................................ ................................................ ......................................... 25
Seção 7.5: Acessores ................................................ ................................................ ................................................ 26
Seção 7.6: Transpilação .............................................. ................................................ ......................................... 27 Seção 7.7:
Patch de macaco a função em uma classe existente ................................................ ................................ 28
Capítulo 8: Decorador de classe ................................................ ................................................ ............................. 29
Machine Translated by Google
Seção 13.1: 1 exemplo básico de herança de classe usando as palavras-chave extends e super ....................... ........ 45 Seção
13.2: 2 exemplo de variável de classe estática - conte quantas vezes o método está sendo invocado ....................... 45
Seção 16.1: Incluir arquivo de definição com biblioteca no npm ....................................... ................................................ 52 Capítulo
17: Usando TypeScript com webpack ....................................... ................................................ ..... 53 Seção 17.1:
webpack.config.js ..................................... ................................................ ......................................... 53
Seção 19.1: Tornar um módulo que exporta um padrão qualquer ....................................... ................................................ 55 Seção
19.2: Declarar um qualquer global ....................................... ................................................ ............................. 55 Seção 19.3: Use
um módulo de ambiente ................................................ ................................................ ................... 56
Capítulo 20: TypeScript instalando o typescript e executando o compilador typescript tsc ........ 57
Machine Translated by Google
Configure o projeto typescript para compilar todos os arquivos no typescript. ................................ 59 Seção 21.1: Configuração do
arquivo de configuração do TypeScript .......... ................................................ ......................................... 59
Capítulo 22: Integração com ferramentas de construção
................................................ ................................................ .... 61
Capítulo 23: Usando TypeScript com RequireJS ....................................... ................................................ 65 Seção 23.1: exemplo de
HTML usando RequireJS CDN para incluir um arquivo TypeScript já compilado Seção 23.2: exemplo de tsconfig.json ................. 65
para compilar para exibir a pasta usando o estilo de importação RequireJS ............... .......... 65 Capítulo 24: TypeScript com
Seção 25.1: Hello World no navegador com SystemJS ....................................... ................................................ 69 Capítulo 26:
Seção 26.1: Componente ReactJS escrito em TypeScript ....................................... ......................................... 72 Seção 26.2 :
TypeScript & react & webpack ....................................... ................................................ ............. 73 Capítulo 27: TSLint - garantindo
Seção 27.1: Configuração para menos erros de programação Seção ................................................ ................................. 75
27.2: Instalação e configuração ....................... ................................................ ......................................... 75
Seção 27.3: Conjuntos de Regras TSLint ................................................ ................................................ .......................... 76
Seção 27.4: Configuração básica do tslint.json ....................................... ................................................ ............................. 76 Seção
27.5: Usando um conjunto de regras predefinido como padrão ................................................ ............................................. 76
Seção 28.1: Criar projeto TypeScript com tsconfig.json ....................................... ................................................ 78 Seção 28.2:
Configuração para menos erros de programação Seção 28.3: ................................................ ................................ 79
compileOnSave ....................................... ................................................ ......................................... 80
Seção 28.4: Comentários ................................................ ................................................ ......................................... 80
Seção 28.5: preserveConstEnums .............................................. ................................................ ....................... 81 Capítulo 29:
Sobre
https://goalkicker.com/TypeScriptBook
Este livro TypeScript Notes for Professionals é compilado de Stack Overflow Documentation,
o conteúdo é escrito pelas pessoas bonitas do Stack Overflow.
O conteúdo do texto é liberado sob Creative Commons BY-SA, veja os créditos no final deste
livro, quem contribuiu para os vários capítulos. As imagens podem ter direitos autorais de seus
respectivos proprietários, a menos que especificado de outra forma
Este é um livro gratuito não oficial criado para fins educacionais e não é afiliado a grupos
ou empresas oficiais do TypeScript nem ao Stack Overflow. Todas as marcas comerciais e
marcas registradas são de propriedade de seus respectivos
proprietários de empresas
As informações apresentadas neste livro não são garantidas como corretas ou precisas,
use por sua conta e risco
2.8 2018-03-28
2,8 CR 16/03/2018
2.7.2 16/02/2018
2.7.1 01/02/2018
2.7 beta 18-01-2018
2.6.1 01/11/2017
2.5.2 01/09/2017
2.4.1 2017-06-28
2.3.2 28/04/2017
2.3.1 2017-04-25
2.3.0 beta 2017-04-04
2.2.2 13-03-2017
2.2 17-02-2017
2.1.6 2017-02-07
2.2 beta 2017-02-02
2.1.5 2017-01-05
2.1.4 05/12/2016
2.0.8 2016-11-08
2.0.7 03/11/2016
2.0.6 23/10/2016
2.0.5 2016-09-22
2.0 Beta 2016-07-08
1.8.10 2016-04-09
1.8.9 16/03/2016
1.8.5 2016-03-02
1.8.2 17/02/2016
1.7.5 14/12/2015
1.7 20/11/2015
1.6 11-09-2015
1.5.4 15-07-2015
1,5 15-07-2015
1.4 13/01/2015
1.3 2014-10-28
1.1.0.1 23/09/2014
TypeScript é um superconjunto digitado de JavaScript que compila diretamente no código JavaScript. Os arquivos TypeScript geralmente
usam a extensão .ts . Muitos IDEs suportam TypeScript sem nenhuma outra configuração necessária, mas TypeScript também pode
ser compilado com o pacote TypeScript Node.JS a partir da linha de comando.
IDEs
Estúdio visual
Código do Visual Studio (vscode) fornece preenchimento automático contextual, bem como ferramentas de refatoração e depuração
para TypeScript. O próprio vscode é implementado no TypeScript. Disponível para Mac OS X, Windows e Linux.
WebStorm
WebStorm 2016.2 vem com TypeScript e um compilador integrado. [WebStorm não é gratuito]
eu entendo a ideia
IDEIA IntelliJ 2016.2 tem suporte para TypeScript e um compilador por meio de um plug-in mantido pela equipe JetBrains.
[IntelliJ não é gratuito]
Texto Sublime
Você pode instalar o TypeScript globalmente para ter acesso a ele de qualquer diretório.
ou
Você pode instalar o TypeScript localmente e salvar em package.json para restringir a um diretório.
O comando de compilação tsc vem com typescript, que pode ser usado para compilar o código.
tsc meu-código.ts
Você também pode fornecer opções de compilação que acompanham seu código por meio de um tsconfig.json arquivo. Para
iniciar um novo projeto TypeScript, entre no diretório raiz do seu projeto em uma janela de terminal e execute tsc --init. Esse comando
gerará um arquivo tsconfig.json com opções de configuração mínimas, semelhantes às abaixo.
{
"compilerOptions":
{ "module": "commonjs",
"target": "es5",
"noImplicitAny": falso,
"sourceMap": falso,
"pretty": verdadeiro
},
"excluir":
[ "node_modules"
]
}
Com um arquivo tsconfig.json colocado na raiz do seu projeto TypeScript, você pode usar o comando tsc para executar a compilação.
O TypeScript torna o JavaScript mais parecido com uma linguagem fortemente tipada e orientada a objetos, semelhante a C# e Java.
Isso significa que o código TypeScript tende a ser mais fácil de usar para grandes projetos e que o código tende a ser mais fácil de
entender e manter. A tipagem forte também significa que a linguagem pode (e é) pré-compilada e que as variáveis não podem
receber valores que estejam fora de seu intervalo declarado. Por exemplo, quando uma variável TypeScript é declarada como um
número, você não pode atribuir um valor de texto a ela.
Essa forte orientação de tipo e objeto torna o TypeScript mais fácil de depurar e manter, e esses eram dois dos pontos mais fracos do
JavaScript padrão.
Declarações de tipo
Você pode adicionar declarações de tipo a variáveis, parâmetros de função e tipos de retorno de função. O tipo é escrito após dois
pontos após o nome da variável, assim: var num: number = 5; O compilador verificará os tipos (quando possível) durante a
compilação e relatará os erros de tipo.
4
Notas TypeScript do GoalKicker.com para profissionais
Machine Translated by Google
any - Permite qualquer tipo. As expressões que envolvem qualquer não são verificadas
quanto ao tipo. void - representa "nada", pode ser usado como valor de retorno de uma função. Apenas null e undefined fazem parte
do tipo void .
nunca
deixe foo: nunca; -Como o tipo de variáveis em guardas de tipo que nunca são verdadeiras.
função error(mensagem: string): nunca { lançar novo Error(mensagem); } - Como o tipo de retorno de funções que nunca
retornam.
nulo - digite para o valor nulo. null faz parte implicitamente de cada tipo, a menos que verificações nulas estritas estejam habilitadas.
Fundição
Você pode executar a conversão explícita por meio de colchetes angulares, por exemplo:
Este exemplo mostra uma classe derivada que é tratada pelo compilador como uma MyInterface. Sem a conversão na segunda linha, o compilador
lançaria uma exceção, pois não entende someSpecificMethod(), mas a conversão por meio de <ImplementingClass>derived sugere ao
compilador o que fazer.
Desde o TypeScript 1.6, o padrão é usar a palavra-chave as , porque usar <> é ambíguo em arquivos .jsx . Isso é mencionado na
documentação oficial do TypeScript.
Aulas
As classes podem ser definidas e usadas no código TypeScript. Para saber mais sobre classes, consulte a documentação de classes
página.
class Greeter
{ saudação: string;
Aqui temos uma classe, Greeter, que possui um construtor e um método de saudação . Podemos construir uma instância da classe usando a palavra-
chave new e passar uma string que queremos que o método greet envie para o console. A instância de nossa classe Greeter é armazenada na variável
greeter , que então chamamos de método greet .
ts-node não empacota o compilador typescript, então você pode precisar instalá-lo.
Executando script
ts-node main.ts
// main.ts
console.log("Olá mundo");
Exemplo de uso
$ ts-node main.ts
Olá Mundo
Executando REPL
Exemplo de uso
$ ts-node >
soma const = (a, b): número => a + b; indefinido
> soma(2,
2) 4
> .exit
Para sair do REPL, use o comando .exit ou pressione CTRL+C duas vezes.
Exemplo de uso:
$ tsun
TSUN : Tipo de nó atualizado para
TypeScript na expressão TypeScript para avaliar o
tipo :ajuda para comandos em repl $
function multiple(x, y) { ..return x *
y; ..} indefinido $
multiplicar(3,
4)
12
Ele traz muitas das vantagens do sistema de tipos (segurança, legibilidade, ferramentas aprimoradas) para o ecossistema JavaScript.
Ele também sofre de algumas das desvantagens dos sistemas de tipos (aumento de complexidade e incompletude).
} duplo('2');
~~~ O argumento do tipo '"2"' não pode ser atribuído ao parâmetro do tipo 'número'. //
Você nunca esquecerá se String.prototype.slice leva (start, stop) ou (start, length) novamente!
Aqui, por exemplo, o Visual Studio Code é capaz de renomear as referências ao foo interno sem alterar o foo externo.
Isso seria difícil de fazer com um simples localizar/substituir.
// Erro: O tipo '"rock"' não pode ser atribuído ao tipo '"dog"'. // myFavoritePet
= "rock";
Juntamente com Type Aliases e Union Types, você obtém um comportamento semelhante a enum.
// Erro: Argumento do tipo '"rock"' não pode ser atribuído ao parâmetro do tipo "'gato' | "cachorro" | "pássaro".
O tipo '"rock"' não pode ser atribuído ao tipo '"bird"'. //
buyPet("rock", "Rocky");
Tipos literais de cadeia de caracteres podem ser usados para distinguir sobrecargas.
let dog = buyPet(myFavoritePet /* "dog" conforme definido acima */, "Rocky"); // cachorro é
do tipo Cachorro (cachorro: Cachorro)
interface Animal de
estimação { espécie:
Espécie;
comer(); dormir();
}
}
}
// Erro: O tipo '"rock"' não pode ser atribuído ao tipo '"dog"'. // myFavoritePet
= "rock";
interface Animal de
estimação { espécie:
Espécie; nome:
string;
comer();
andar(); dormir();
}
// Erro: Interface 'Rock' estende incorretamente a interface 'Pet'. Tipos de 'espécies' de propriedade são incompatíveis. O
tipo '"rock"' não pode ser atribuído ao tipo '"cat" | "cachorro" | "pássaro"'. O tipo '"rock"' não pode ser atribuído ao tipo '"bird"'. //
interface Rock extends Pet { // type:
"rock"; // }
return
{ espécie: "gato",
nome: nome,
come: function ()
{ console.log(`${this.name} come.`); }, walk:
function () { console.log(`$
{this.name} walks.`); }, sleep: function ()
{ console.log(`${this.name}
sleeps.`);
} } como
Gato; } else if(pet === "cachorro")
{ return
{ espécie: "cachorro",
nome: nome,
come: function ()
{ console.log(`${this.name} come.`); }, walk:
function () { console.log(`$
{this.name} walks.`); }, sleep: function ()
{ console.log(`${this.name}
sleeps.`);
} } como
Cachorro; } else if(pet ===
"pássaro")
{ return { espécie:
"pássaro",
nome: nome, comer:
função () { console.log(`${este.nome}
come.`); }, walk: function ()
{ console.log(`${this.name} walks.`); }, sleep:
function () { console.log(`$
{this.name} sleeps.`); }, sing: function ()
{ console.log(`${this.name}
canta.`);
} } como
Pássaro; }
else { throw `Desculpe, não temos um ${pet}. Gostaria de comprar um cachorro?`;
}
}
if(petIsCat(pet)) { // pet
agora é do tipo Cat (pet: Cat)
pet.comer();
pet.sleep();
// Erro: O tipo '"bird"' não pode ser atribuído ao tipo '"cat"'. // pet.type =
"pássaro";
pet.comer();
pet.walk();
pet.sleep();
pet.comer();
pet.sing();
pet.sleep(); }
else
{ throw "Um animal de estimação desconhecido. Você comprou uma pedra?";
}
}
let dog = buyPet(myFavoritePet /* "dog" conforme definido acima */, "Rocky"); // cachorro
é do tipo Cachorro (cachorro: Cachorro)
// Erro: Argumento do tipo '"rock"' não pode ser atribuído ao parâmetro do tipo "'gato' | "cachorro" | "pássaro".
O tipo '"rock"' não pode ser atribuído ao tipo '"bird"'. //
buyPet("rock", "Rocky");
playWithPet(cachorro); //
Saída: Ei Rocky, vamos jogar. // Rocky
come.
Caminhadas rochosas.
// // Rocky dorme.
Um booleano representa o tipo de dados mais básico em TypeScript, com o objetivo de atribuir valores verdadeiro/falso.
interface Chave de
fenda{ turnScrew();
}
tool.cut();
ferramenta.openBottle();
ferramenta.turnScrew();
}
Exemplo:
Aqui a sintaxe x: número, y: número significa que a função pode aceitar dois argumentos x e y e eles podem ser apenas números e
(...): número { significa que o valor de retorno pode ser apenas um número
Uso:
Observação:
ou
erro TS2322: o tipo 'string' não pode ser atribuído ao tipo 'number' e o erro TS2322: o tipo 'number' não pode ser atribuído ao
tipo 'string' , respectivamente
Aqui a sintaxe nome: string significa que a função pode aceitar um argumento de nome e este argumento só pode ser string e (...):
string { significa que o valor de retorno pode ser apenas uma string
Uso:
Um Enum const é o mesmo que um Enum normal. Exceto que nenhum objeto é gerado em tempo de compilação. Em vez disso, os
valores literais são substituídos onde o const Enum é usado.
// TypeScript: Um Enum const pode ser definido como um Enum normal (com valor inicial, valores específicos, etc.) const
enum
NinjaActivity { Espionage,
Sabotage,
Assassination
enum Dia { Segunda, Terça, Quarta, Quinta, Sexta, Sábado, Domingo }; let bestDay: Day =
Day.Saturday;
ou atribuir valores:
Se você não tiver nenhum tipo, comumente usado para funções que não retornam nada:
Capítulo 4: Matrizes
Seção 4.1: Encontrando Objetos no Array
Usando
find() inventário const =
[ {nome: 'maçãs', quantidade: 2},
{nome: 'bananas', quantidade: 0}, {nome:
'cerejas', quantidade: 5}
];
função encontrarCerejas(fruta) {
return fruta.nome === 'cerejas';
}
/ * OU */
Capítulo 5: Enums
Seção 5.1: Enums com valores explícitos
Por padrão, todos os valores de enumeração são resolvidos para números. Digamos que se você tiver algo como
enum MimeType {
JPEG,
PNG,
PDF
}
Mas algumas vezes é importante que o enum resolva para um tipo diferente. Por exemplo, você recebe o valor do backend/frontend/outro sistema que é
definitivamente uma string. Isso pode ser uma dor, mas felizmente existe este método:
enum MimeType {
JPEG = <qualquer>'imagem/jpeg',
PNG = <qualquer>'imagem/png',
PDF = <qualquer>'aplicativo/pdf'
}
enum MimeType {
JPEG = 'imagem/jpeg',
PNG = 'imagem/png',
PDF = 'aplicativo/pdf',
}
enum MyType {
Valor = 3,
ValorEx = 30,
ValorEx2 = 300
}
Tipos mais sofisticados também funcionam, pois enums não const são objetos reais em tempo de execução, por exemplo
enum FancyType {
OneArr = <qualquer>[1],
TwoArr = <qualquer>[2, 2],
TrêsArr = <qualquer>[3, 3, 3]
}
torna-se
var FancyType;
(função (FancyType) {
FancyType[FancyType["OneArr"] = [1]] = "OneArr";
FancyType[FancyType["TwoArr"] = [2, 2]] = "TwoArr";
enum SomeEnum { A, B }
enumValues.forEach(v=> console.log(v))
//
A // B
enum SourceEnum
{ valor1 = <qualquer>'valor1',
valor2 = <qualquer>'valor2'
}
enum AdditionToSourceEnum
{ valor3 = <qualquer>'valor3',
valor4 = <qualquer>'valor4'
}
console.log(TestEnum.value1);
console.log(TestEnum.value2 === <qualquer>'value2');
console.log(check(TestEnum.value2));
console.log(check(TestEnum.value3));
Às vezes, é necessário implementar o Enum por conta própria. Por exemplo, não há uma maneira clara de estender outras enumerações.
A implementação personalizada permite isso:
classe Enum
{ construtor( valor protegido: string) {}
console.log(value1 + 'olá');
console.log(value1.toString() === 'value1');
console.log(value1.is('value1')); console.log(!
TestEnum.value3.is(TestEnum.value3));
console.log(check(TestEnum.value2)); // isso
funciona, mas talvez seu TSLint reclamasse // atenção! não
funciona com === // use .is() em vez disso
console.log(TestEnum.value1
== <any>'value1');
Capítulo 6: Funções
Seção 6.1: Parâmetros opcionais e padrão
Parâmetros Opcionais
No TypeScript, supõe-se que cada parâmetro seja exigido pela função. Você pode adicionar um ? no final de um nome de parâmetro
para defini-lo como opcional.
Parâmetros padrão
Se o usuário passar indefinido ou não especificar um argumento, o valor padrão será atribuído. Esses são chamados de parâmetros
inicializados por padrão .
Ou com parâmetros:
interface INumberConstructor
{ new(num: number);
}
Se queremos receber uma função simples e não um construtor é quase a mesma coisa:
Ou com parâmetros:
whatTime(1,30)
whatTime('1',30)
whatTime(1,'30')
whatTime('1','30') //'1:30' //'1:30' //'1:30' //'1:30'
O TypeScript trata esses parâmetros como um único tipo que é uma união dos outros tipos, portanto, sua função deve ser capaz de lidar com
parâmetros de qualquer tipo que esteja na união.
função multiplicar(a, b) {
retornar a * b;
}
funções anônimas
Capítulo 7: Aulas
O TypeScript, como o ECMAScript 6, oferece suporte à programação orientada a objetos usando classes. Isso contrasta com as versões
mais antigas do JavaScript, que suportavam apenas a cadeia de herança baseada em protótipo.
O suporte de classe no TypeScript é semelhante ao de linguagens como Java e C#, pois as classes podem herdar de outras classes,
enquanto os objetos são instanciados como instâncias de classe.
Também semelhantes a essas linguagens, as classes TypeScript podem implementar interfaces ou fazer uso de genéricos.
move()
{ this.position += this.speed;
}
moreInfo()
{ return `Este é um carro localizado em ${esta.posição} e indo a ${esta.velocidade}mph!`;
}
}
Classes abstratas são classes base a partir das quais outras classes podem se estender. Eles não podem ser instanciados (ou seja, você não
pode fazer new Machine("Konda")).
Por esse motivo, as classes abstratas podem ser consideradas conceitualmente como uma combinação de uma interface e uma classe.
move()
{ this.position += this.speed;
}
}
Neste exemplo, declaramos uma classe simples Car. A classe tem três membros: uma velocidade de propriedade privada, uma posição
de propriedade pública e um movimento de método público. Observe que cada membro é público por padrão. É por isso que move() é
public, mesmo que não tenhamos usado a palavra-chave public .
classe Carro
{ cargo público: número = 0;
velocidade protegida: número = 42;
move()
{ this.position += this.speed;
}
}
move() { //
começa a se mover :-)
super.move();
super.move();
}
}
Este exemplo mostra como criar uma subclasse muito simples da classe Car usando a palavra-chave extends . A classe
SelfDrivingCar substitui o método move() e usa a implementação da classe base usando super.
Neste exemplo, usamos o construtor para declarar uma posição de propriedade pública e uma velocidade de propriedade protegida na
classe base. Essas propriedades são chamadas de propriedades de parâmetro. Eles nos permitem declarar um parâmetro de construtor e um
membro em um só lugar.
Uma das melhores coisas no TypeScript é a atribuição automática de parâmetros do construtor à propriedade relevante.
classe Carro
{ cargo público: número;
velocidade protegida: número;
move()
{ this.position += this.speed;
}
}
carro de classe {
construtor(posição pública : número, velocidade protegida: número) {}
move()
{ this.position += this.speed;
}
}
E ambos serão transpilados do TypeScript (tempo de design e tempo de compilação) para JavaScript com o mesmo resultado, mas
escrevendo significativamente menos código:
}
Car.prototype.move = function ()
{ this.position += this.speed;
};
devolver
Carro; }());
Os construtores de classes derivadas precisam chamar o construtor da classe base com super().
}
}
}
Neste exemplo, modificamos o exemplo "Classe simples" para permitir o acesso à propriedade de velocidade . Os acessadores TypeScript
nos permitem adicionar código adicional em getters ou setters.
classe Carro
{ cargo público: número = 0;
_velocidade privada: número = 42;
privado _MAX_SPEED = 100
move()
{ this.position += this._speed;
}
Origem do TypeScript
classe AlgumaClasse {
construtor ()
{ SomeClass.SomeStaticValue = SomeClass.getGoodbye();
this.someMemberValue = this.getFortyTwo();
this.somePrivateValue = this.getTrue();
}
Fonte JavaScript
return AlgumaClasse; }
());
SomeClass.SomeStaticValue = "olá";
Observações
As propriedades estáticas são adicionadas diretamente ao objeto de classe, enquanto as propriedades de instância são adicionadas
ao protótipo.
interface String
{ toCamelCase(): string;
}
Se esta extensão de String for carregada, ela pode ser usada assim:
@addMetadata
classe Pessoa
{ private _name: string;
construtor público (nome: string) { this._name
= nome;
console.log(getMetadataFromClass(Pessoa));
O decorador é aplicado quando a classe é declarada e não quando criamos instâncias da classe. Isso significa que os metadados são
compartilhados por todas as instâncias de uma classe:
console.log(getMetadataFromInstance(pessoa1));
console.log(getMetadataFromInstance(pessoa2));
// Adicionar
metadados target.__customMetadata = metadata;
// Alvo de retorno
alvo de retorno ;
}
}
O addMetadata recebe alguns argumentos usados como configuração e retorna uma função sem nome que é o decorador real. No decorador
podemos acessar os argumentos porque existe um fechamento no lugar.
} public greet()
{ return this._name;
}
}
console.log(getMetadataFromInstance(Pessoa));
{ guid: "417c6ec7-ec05-4954-a3c6-73a0d7f9f5bf" }
Um decorador de classe é apenas uma função que recebe a classe como seu único argumento e a retorna após fazer algo com ela:
função log<T>(alvo: T) {
// Alvo de retorno
alvo de retorno ;
@log
class Person
{ private _name: string;
construtor público (nome: string)
{ this._name = nome;
} public greet()
{ return this._name;
}
}
Capítulo 9: Interfaces
Uma interface especifica uma lista de campos e funções que podem ser esperadas em qualquer classe implementando a interface.
Por outro lado, uma classe não pode implementar uma interface a menos que tenha todos os campos e funções especificados na interface.
O principal benefício do uso de interfaces é que permite usar objetos de diferentes tipos de maneira polimórfica.
Isso ocorre porque qualquer classe que implementa a interface tem pelo menos esses campos e funções.
interface IPpessoa
{ nome: string;
idade: número;
respiração(): vazio;
}
E queremos criar uma interface mais específica que tenha as mesmas propriedades da pessoa, podemos fazer isso usando a palavra-
chave extends :
Declare o tipo público de variáveis e métodos na interface para definir como outro código datilografado pode interagir com ele.
interface ISampleClassInterface
{ sampleVariable: string;
sampleMethod(): void;
Variávelopcional?: string;
}
constructor()
{ this.sampleVariable = 'string value';
this.answerToLifeTheUniverseAndEverything = 42;
}
O exemplo mostra como criar uma interface ISampleClassInterface e uma classe SampleClass que implementa a interface.
interface
Conector{ doConnect(): booleano;
}
Esta é a interface do conector. Agora vamos implementar isso para comunicação Wi-Fi.
public doConnect():
boolean{ console.log("Conectando via wi-fi");
console.log("Obter senha");
console.log("Alocar um IP por 24 horas");
console.log("Conectado");
retornar verdadeiro
Aqui desenvolvemos nossa classe concreta chamada WifiConnector que possui sua própria implementação. Agora é o tipo
Connector.
Agora estamos criando nosso Sistema que possui um componente Conector. Isso é chamado de injeção de dependência.
classe de exportação
Sistema { constructor( conector privado: Conector){ #inject Tipo de conector
conector.doConectar()
}
}
constructor( conector privado: Conector) esta linha é muito importante aqui. Connector é uma interface e deve ter doConnect().
Como Connector é uma interface, esta classe System tem muito mais flexibilidade. Podemos passar qualquer Type que tenha
implementado a interface Connector . No futuro, o desenvolvedor obtém mais flexibilidade. Por exemplo, agora o
desenvolvedor deseja adicionar o módulo de conexão Bluetooth:
public doConnect():
boolean{ console.log("Conectando via Bluetooth");
console.log("Emparelhar com PIN");
console.log("Conectado");
retornar verdadeiro
Veja que Wifi e Bluetooth possuem sua própria implementação. Sua própria maneira diferente de se conectar. No entanto, ambos
implementaram Type Connector e agora são Type Connector. Para que possamos passar qualquer um deles para a classe System
como parâmetro do construtor. Isso é chamado de polimorfismo. A classe System agora não sabe se é Bluetooth / Wifi,
mesmo que possamos adicionar outro módulo de comunicação como infravermelho, Bluetooth5 e qualquer outro, apenas
implementando a interface do conector .
Isso é chamado de digitação de pato. O tipo de conector agora é dinâmico, pois doConnect() é apenas um espaço reservado e o
desenvolvedor o implementa como seu.
se no construtor ( conector privado: WifiConnector) onde WifiConnector é uma classe concreta, o que acontecerá? Então,
a classe do sistema será fortemente acoplada apenas ao WifiConnector, nada mais. Aqui a interface resolveu nosso
problema por polimorfismo.
Assim como as classes, as interfaces também podem receber parâmetros polimórficos (também conhecidos como Generics).
Aqui, você pode ver que nossas duas interfaces recebem alguns parâmetros genéricos, T e U.
lista: T[];
construtor() { this.list
= [];
}
Em nosso exemplo, a classe State manipulará um status genérico usando IStatus<T>. Desta forma, a interface
Nossa classe State é digitada como IStatus<Code>. Dessa forma, podemos passar um tipo mais complexo para nosso método emit.
Como você pode ver, as interfaces genéricas podem ser uma ferramenta muito útil para o código estaticamente tipado.
que não possui uma definição de tipo oficial. Podemos estendê-lo facilmente declarando as funções adicionadas pelo plug-in em uma declaração de interface
interface JQuery {
pluginFunctionThatDoesNothing(): void;
O compilador mesclará todas as declarações com o mesmo nome em uma - veja mesclagem de declaração para mais detalhes.
compilação. É por isso que a verificação de tipo em interfaces depende da forma do objeto - ou seja, se o objeto suporta os campos e funções na
interface IKickable
{ kick(distância: número): void;
} class Bola
{ kick(distance: number): void
{ console.log("Kicked", distance, "meters!");
}
Portanto, mesmo que Ball não implemente explicitamente IKickable, uma ocorrência de Ball pode ser atribuída a (e manipulada como) um
IKickable, mesmo quando o tipo é especificado.
Digamos que você esteja fazendo um aplicativo de namoro para animais de estimação.
Você tem esta função simples que verifica se dois animais de estimação são compatíveis entre si...
checkCompatible(petOne, petTwo) { if
(petOne.species === petTwo.species &&
Math.abs(petOne.age - petTwo.age) <= 5) { return
true;
}
}
Este é um código completamente funcional, mas seria muito fácil para alguém, especialmente outras pessoas trabalhando
neste aplicativo que não escreveram esta função, não saber que eles deveriam passar objetos com 'espécie' e 'idade' propriedades.
Eles podem tentar erroneamente checkCompatible(petOne.species, petTwo.species) e, em seguida, ser deixados para
descobrir os erros gerados quando a função tenta acessar petOne.species.species ou petOne.species.age!
Uma maneira de evitar que isso aconteça é especificar as propriedades que queremos nos parâmetros do animal de estimação:
checkCompatible(petOne: {espécie: string, idade: número}, petTwo: {espécie: string, idade: número}) {
//...
}
Nesse caso, o TypeScript garantirá que tudo passado para a função tenha as propriedades 'species' e 'age' (tudo bem se tiverem propriedades
adicionais), mas essa é uma solução um tanto complicada, mesmo com apenas duas propriedades especificadas.
Com interfaces, existe uma maneira melhor!
espécies: barbante;
idade: número; //
Podemos adicionar mais propriedades se quisermos.
}
Agora tudo o que temos a fazer é especificar o tipo de nossos parâmetros como nossa nova interface, assim...
... e o TypeScript garantirá que os parâmetros passados para nossa função contenham as propriedades especificadas no
Interface de animal de estimação!
clone(): IResult<T>;
}
classe Resultado<T> {
let r1 = new Result(false, 'error: 42'); // Compilador infere T para string let r2 = new Result(false,
42); // O compilador infere T para o número
let r3 = new Result<string>(true, null); // Definir explicitamente T como string let r4 = new
Result<string>(true, 4); // Erro de compilação porque 4 não é uma string
} retornar destino;
}
seja x = { a: 1, b: 2, c: 3, d: 4 }; atribuir(x, { b:
10, d: 20 }); atribuir(x, { e: 0 }); // Erro
Restrição simples:
interface IRunnble<V> {
run(parâmetro: U): V;
}
Nas interfaces:
interface IRunner
{ runSafe<T extends IRunnable>(runnable: T): void;
}
Nas aulas:
Funções simples:
O TypeScript 2.0 adiciona suporte para verificações nulas estritas. Se você definir --strictNullChecks ao executar tsc (ou definir esse sinalizador
em seu tsconfig.json), os tipos não permitirão mais nulo:
} getId(nulo); // erro: O argumento do tipo 'nulo' não pode ser atribuído ao parâmetro do tipo 'Elemento'.
} getId(nulo);
} getId(nulo);
O operador de asserção não nula, !, permite afirmar que uma expressão não é nula ou indefinida quando o compilador TypeScript não
pode inferir isso automaticamente:
// Mesmo sabendo que `node.next` está definido porque acabamos de chamar `addNext`, // o
TypeScript não é capaz de inferir isso na linha de código abaixo: // node.next.data
= value;
Você pode declarar funções que servem como guardas de tipo usando qualquer lógica que desejar.
Se a função retornar true, o TypeScript restringirá o tipo a DesiredType em qualquer bloco protegido por uma chamada para a função.
exemplo("olá mundo"); // imprime "é uma string: hello world" example({ something:
"else" }); // imprime "não sei o que é isso! [[object Object]]"
O predicado do tipo de função de um guarda (o foo é Bar na posição do tipo de retorno da função) é usado em tempo de compilação para
restringir os tipos, o corpo da função é usado em tempo de execução. O predicado de tipo e a função devem concordar, ou seu código não
trabalhar.
As funções de proteção de tipo não precisam usar typeof ou instanceof, elas podem usar uma lógica mais complicada.
Por exemplo, este código determina se você tem um objeto jQuery verificando sua string de versão.
function example(foo) { if
(isJQuery(foo)) { // foo é
digitado JQuery aqui foo.eq(0);
}
}
class Pet { }
class Dog extends Pet
{ bark()
{ console.log("woof");
}
}
}
exemplo(novo
Cachorro()); exemplo(novo Gato());
estampas
au
Miau
para o console.
Ao contrário de instanceof, typeof funcionará com uma variável de qualquer tipo. No exemplo abaixo, foo pode ser digitado como
número | string sem problemas.
exemplo(23);
exemplo("foo");
estampas
123
não é um número: foo
classe
Car{ nome:string;
engineCapacity:string;
constructor(name:string,engineCapacity:string){ this.name =
name;
this.engineCapacity = engineCapacity;
}
describeCar()
{ console.log(`${this.name} carro vem com ${this.engineCapacity} deslocamento`);
}
}
constructor(nome:string,engineCapacity:string,seatingCapacity:number)
{ super(nome,engineCapacity);
this.seatingCapacity=capacidade de assentos;
}
descreveCarroHonda()
{ super.descreveCarro();
console.log(`estes carros vêm com capacidade de ${this.seatingCapacity}`);
}
{ StaticTest.countInstance++;
}
}
mas caso você queira usar tipos de outros repositórios, pode ser usado da maneira antiga:
digitação é um pacote npm que pode instalar automaticamente arquivos de definição de tipo em um projeto local. Eu recomendo que você leia o início
rápido.
lodash
ATUALIZADO dt http://lodash.com/ 2
2016-07-20T00:13:09.000Z
lodash global 1
2016-07-01T20:51:07.000Z
lodash https://www.npmjs.com/package/lodash npm 2016-07-01T20:51:07.000Z 1
2. Em seguida, decida de qual fonte você deve instalar. Eu uso dt, que significa "DefinitivamenteTyped" um repositório GitHub
onde a comunidade pode editar digitações, também é normalmente a atualização mais recente.
Vamos detalhar o último comando. Estamos instalando a versão do lodash com um tipo definido como um arquivo de digitação global em nosso projeto e
salvando-o como uma dependência em Typings.json . Agora, sempre que importarmos o lodash, o typescript carregará o arquivo de digitação do lodash.
4. Se quisermos instalar tipificações que serão usadas apenas para ambiente de desenvolvimento, podemos fornecer o --save
sinalizador de desenvolvedor :
import _ = require('lodash');
Se você não tiver um arquivo de definição para o módulo, o TypeScript lançará um erro na compilação porque não pode encontrar o módulo
que você está tentando importar.
Nesse caso, você pode importar o módulo com a função de requisição de tempo de execução normal . No entanto, isso o retorna como
qualquer tipo.
// O _ variável é do tipo any, portanto, o TypeScript não executará nenhuma verificação de tipo.
const _: any = require('lodash');
A partir do TypeScript 2.0, você também pode usar uma declaração abreviada de módulo de ambiente para informar ao TypeScript que
existe um módulo quando você não tem um arquivo de definição de tipo para o módulo. O TypeScript não será capaz de fornecer nenhuma
verificação de tipo significativa neste caso.
A partir do TypeScript 2.1, as regras foram ainda mais relaxadas. Agora, desde que exista um módulo em seu diretório
node_modules , o TypeScript permitirá que você o importe, mesmo sem nenhuma declaração de módulo em nenhum lugar. (Observe que,
se estiver usando a opção do compilador --noImplicitAny , o seguinte ainda gerará um aviso.)
Para instalar uma definição de tipo, basta instalá-la como uma dependência dev em seu pacote de projetos.json
por exemplo
npm i -S lodash
npm i -D @tipos/ lodash
// hello.ts
export function hello(name: string)
{ console.log(`Hello ${name}!`);
Se o diretório contiver um arquivo denominado index.ts , ele poderá ser carregado usando apenas o nome do diretório (para index.ts, o nome do arquivo
é opcional).
// welcome/ index.ts
export function welcome(name: string)
{ console.log(`Welcome ${name}!`);
}
// Operator.ts
interface Operator { eval(a:
número, b: número): número;
// Add.ts
import Operator from "./Operator"; classe de
exportação Adicionar implementa Operador {
eval(a: número, b: número): número {
retornar a + b;
}
// Mul.ts
import Operator from "./Operator"; classe
de exportação Mul implementa Operador {
eval(a: número, b: número): número {
retornar a * b;
}
}
// Operators.ts
importa {Add} de "./Add"; importar
{Mul} de "./Mul";
// NamedOperators.ts
exportam {Add} de "./Add";
exportar {Mul} de "./Mul";
As exportações padrão também podem ser exportadas, mas nenhuma sintaxe curta está disponível. Lembre-se, apenas uma exportação padrão por
módulo é possível.
// Calculator.ts
export {Add} de "./Add"; exportar
{Mul} de "./Mul"; importar
Operador de "./Operator";
// RepackedCalculator.ts
exporta * de "./Operators";
// FixedCalculator.ts
export * from "./Calculator" import
Operator from "./Calculator"; classe de
exportação Adicionar implementa Operador {
eval(a: número, b: número): número { return
42;
}
}
Exemplo de uso
// run.ts
importa {Add, Mul} de "./FixedCalculator";
console.log(add.eval(1, 1)); // 42
console.log(mul.eval(3, 4)); // 12
exportação nomeada
// adams.ts
export function hello(name: string)
{ console.log(`Hello ${name}!`);
Ao importar exportações nomeadas, você pode especificar quais elementos deseja importar.
exportação padrão
// dent.ts
const defaultValue = 54;
exportar valor padrão padrão ;
Importação agregada
// adams.ts
export function hello(name: string)
{ console.log(`Hello ${name}!`);
{
...
"typings": "caminho/arquivo.d.ts"
...
}
Agora, sempre que essa biblioteca for importada, o typescript carregará o arquivo de digitação
tsconfig.json
{
"compilerOptions":
{ "sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es5", "jsx":
"react" // se você quiser usar react jsx
}
}
module.exports =
{ entrada: "./src/index.ts",
saída:
{ nome do arquivo: "./dist/bundle.js",
},
resolver: {
// Adicionar '.ts' e '.tsx' como extensões resolvíveis. extensões:
["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
},
module:
{ loaders: [ //
Todos os arquivos com extensão '.ts' ou '.tsx' serão gerenciados por 'ts-loader'. {teste: /\.tsx?$/,
carregador: "ts-loader"}
],
preLoaders: [ //
Todos os arquivos '.js' de saída terão quaisquer mapas de origem reprocessados pelo 'source-map-loader'.
{teste: /\.js$/, carregador: "source-map-loader"}
]
}, /*****************************
*Caso queira use react*
****************************/
class Climbs
{ escalar ()
{ alert ('Meu sentido de aranha está formigando.');
}
}
// coloque em jquery.d.ts
declare let $: any;
padrão de exportação $;
E então, em qualquer arquivo do seu projeto, você pode importar esta definição com:
Se a biblioteca tiver várias variáveis de nível superior, exporte e importe por nome:
// coloque em jquery.d.ts
declare módulo "jquery" { let $:
any; deixe
jQuery: qualquer;
exportar { $ };
exportar { jQuery };
}
$.fazerCoisa();
jQuery.doOutraCoisa();
Se você deseja apenas indicar a intenção de uma importação (para não declarar um global), mas não deseja se preocupar
com definições explícitas, pode importar um módulo de ambiente.
Qualquer coisa importada do módulo declarado (como $ e jQuery) acima será do tipo any
Como instalar o TypeScript e executar o compilador TypeScript em um arquivo .ts da linha de comando.
tsc -v
Obrigado.
Antes disso, precisamos compilar o arquivo ts com o comando "tsc app.ts" agora está tudo definido no arquivo de configuração abaixo
automaticamente.
Agora, você pode compilar todos os textos datilografados pelo comando "tsc". ele criará automaticamente o arquivo ".js" do seu arquivo
typescript.
Se você criar outro typescript e pressionar o comando "tsc" no prompt de comando ou o arquivo javascript do terminal será
criado automaticamente para o arquivo typescript.
Obrigado,
Usando a
API var browserify = require("browserify"); var tsify
= require("tsify");
Webpack básico
webpack.config.js 2.x, 3.x
module.exports =
{ resolver: {
extensões: ['.ts', '.tsx', '.js']
},
módulo:
{ regras:
[{
// Configure ts-loader para arquivos .ts/.tsx e exclua qualquer importação de node_modules. teste: /\.tsx?
$/, carregadores: ['ts-
loader'], exclua: /node_modules/
}
]
},
entry: [ //
Definir index.tsx como ponto de entrada do aplicativo. './
index.tsx'
],
saída:
{ nome do arquivo: "bundle.js"
}
};
webpack 1.x
module.exports =
{ entrada: "./src/index.tsx", saída:
{ nome do
arquivo: "bundle.js"
},
resolva: {
// Adicionar '.ts' e '.tsx' como uma extensão resolvível.
extensões: ["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
},
module:
{ loaders: [ //
todos os arquivos com extensão '.ts' ou '.tsx' serão manipulados por 'ts-loader' { test: / \.ts(x)?$/,
loader: " ts-loader", exclua: /node_modules/ }
]
}
}
Alternativas:
incrível-typescript-loader
{ default : {
src: ["**/*.ts", "!node_modules/**/*.ts"]
}
}
});
grunt.loadNpmTasks("grunt-ts");
grunt.registerTask("padrão", ["ts"]);
};
Basic gulpfile.js
var gulp = require("gulp"); var ts =
require("gulp-typescript");
gulp.task("padrão", função () {
var tsResult = gulp.src("src/*.ts") .pipe(ts({
var ts = require("gulp-typescript");
tsResult.js.pipe(gulp.dest('release'));
});
Atualize o arquivo de projeto para incluir os arquivos Microsoft.TypeScript.Default.props (na parte superior) e Microsoft.TypeScript.targets (na parte
Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Micr osoft.TypeScript.Default.props"
Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeS
cript\Microsoft.TypeScript.Default.props')" / >
Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Micr osoft.TypeScript.targets"
Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeS cript\Microsoft.TypeScript.targets')" /
> </Project>
Mais detalhes sobre como definir as opções do compilador do MSBuild: Configurando opções do compilador em projetos do MSBuild
Mais detalhes podem ser encontrados na caixa de diálogo Gerenciador de pacotes e usando compilações noturnas com NuGet
webpack.config.js
module.exports =
{ entrada:
{ app: ['./src/'], },
saída:
{ path: __dirname,
filename: './dist/[name].js', }, resolver:
{ extensions:
[ '', '.js', '.ts'], }, módulo: { carregadores:
[{ teste: /
\.ts(x)$/,
carregadores: ['ts-loader'], exclua: /node_modules/ }],
} };
O uso de TypeScript com RequireJS requer a configuração de tsconfig.json e a inclusão de um snippet em qualquer arquivo HTML.
O compilador traduzirá as importações da sintaxe do TypeScript para o formato RequireJS.
{ require(["view/index.js" ]);
} </script>
</body>
...
}
$injetar Injeção de Dependência, ela é resolvida por angular e passando como argumento para funções
construtoras.
/*
* Injeções externas, para controle executado uma vez.
* Por exemplo, temos todos os modelos em um valor e queremos usá-lo. */
},
substituir:
verdadeiro, exigir:
"ngModel",
restringir: "A", templateUrl: templatesUrl.myDirective,
};
}
myDirective.$inject =
[ Templates.prototype.slug,
];
// Você pode colocar isso em algum arquivo bootstrap, ou tê-los no mesmo arquivo
angular.module("myApp").
diretiva(minhaDiretiva.prototype.slug, minhaDiretiva);
},
substituir:
verdadeiro, exigir:
"ngModel",
restringir: "A", templateUrl: templatesUrl.myDirective,
};
}
// Você pode colocar isso em algum arquivo bootstrap, ou tê-los no mesmo arquivo
angular.module("myApp").
diretiva(minhaDiretiva.prototype.slug,
[ Templates.prototype.slug,
minhaDiretiva
]);
myModule.ts
angular .module("myModule",
[]) .component("myModuleComponent", new
MyModuleComponent()) .service("myModuleService", MyModuleService);
componentes/meuModuleComponent.ts
templates/myModuleComponent.html
<div class="my-module-component">
{{$ctrl.someContent}} </
div>
controller/MyModuleController.ts
services/MyModuleService.ts
construtor() { }
em algum lugar.html
<my-module-component></my-module-component>
NOTA: isso instalará o compilador typescript 2.0.0 que ainda não foi lançado.
<!doctype html>
<html>
<head>
<title>Olá mundo em TypeScript</title> <script
src="node_modules/systemjs/dist/system.src.js"></script>
<script src="config.js"></script>
<script>
window.addEventListener('load', function() {
System.import('./hello.ts').then(function(hello) {
document.body.innerHTML = hello.greeter('Mundo');
});
});
</script>
</head>
<body>
</body>
</html>
System.config({ pacotes: {
"plugin-typescript": { "main":
"plugin.js"
},
"typescript":
{ "main": "lib/typescript.js", "meta":
{ "lib/
typescript.js": { "exports":
"ts"
}
}
}
},
map:
{ "plugin-typescript": "node_modules/plugin-typescript/lib/",
/* NOTA: isto é para npm 3 (nó 6) */ /* para npm
2, o caminho do typescript será */ /* node_modules/
plugin-typescript/node_modules/typescript */ "typescript": "node_modules/
typescript/"
},
transpiler: "plugin-typescript", meta: { "./
hello.ts":
{ format: "esm",
loader: "plugin-
typescript"
}
},
typescriptOptions:
{ typeCheck: 'estrito'
}
});
NOTA: se você não quiser verificar o tipo, remova o carregador: "plugin-typescript" e typescriptOptions de config.js. Observe
também que ele nunca verificará o código javascript, em particular o código na tag <script> no exemplo html.
Teste-o
node build.js
Use na produção
Basta carregar hello.js com uma tag de script antes do primeiro uso
arquivo hello-produção.html :
<!doctype html>
<html>
<head>
<title>Olá mundo em TypeScript</title> <script
src="node_modules/systemjs/dist/system.src.js"></script>
<script>
window.addEventListener('load', function() {
System.import('./hello.ts').then(function(hello) {
document.body.innerHTML = hello.greeter('Mundo');
});
});
</script>
</head>
<body>
</body>
</html>
// helloMessage.tsx: var
HelloMessage = React.createClass({
renderizar: function() {
return <div>Olá {this.props.name}</div>;
} });
Mas, para fazer uso total do recurso principal do TypeScript (verificação estática de tipo), você deve fazer algumas coisas:
// helloMessage.tsx:
class HelloMessage extends React.Component { render()
{ return
<div>Hello {this.props.name}</div>;
}
}
interface Props
{ nome: string;
opcionalParam?:número;
}
estado da interface {
// vazio no nosso caso
}
Agora o TypeScript exibirá um erro se o programador esquecer de passar props. Ou se tentar passar props que não estão definidos na interface.
A vinculação do TypeScript permite que o ts-loader use sua instalação global do TypeScript em vez de precisar de um
documento typescript de cópia local separado
{
"compilerOptions":
{ "sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es5", "jsx":
"react"
}
}
module.exports =
{ entry: "<path to entry point>",// por exemplo ./ src/ helloMessage.tsx output: { filename:
"<path to
bundle file>", // por exemplo ./ dist/ bundle .js
},
resolver: {
// Adicionar '.ts' e '.tsx' como extensões resolvíveis. extensões:
["", ".webpack.js", ".web.js", ".ts", ".tsx", ".js"]
},
module:
{ loaders: [ //
Todos os arquivos com extensão '.ts' ou '.tsx' serão gerenciados por 'ts-loader'. {teste: /\.tsx?$/,
carregador: "ts-loader"}
],
pré-carregadores: [
// Todos os arquivos '.js' de saída terão quaisquer mapas de origem reprocessados pelo 'source-map-loader'.
{teste: /\.js$/, carregador: "source-map-loader"}
]
},
propensas a produzir bugs e seguir mais as Diretrizes de Codificação para Colaboradores TypeScript.
Para impor essas regras, inclua tslint em seu processo de compilação e verifique seu código antes de compilá-lo com tsc.
{
"rules": { //
TypeScript Specific "member-
access": true, // Requer declarações de visibilidade explícitas para membros de classe. "no-any": true, //
Proíbe o uso de qualquer como uma declaração de tipo.
// Funcionalidade
"label-position": true, // Só permite etiquetas em locais sensatos. "no-bitwise": true, //
Não permite operadores bit a bit. "no-eval": true, // Não permite
chamadas de função eval. "no-null-keyword": true, // Não permite o uso
da palavra-chave null literal. "no-unsafe-finally": true, // Não permite instruções de fluxo
de controle, como return, continue,
break e joga blocos de finalização.
"no-var-keyword": true, // Não permite o uso da palavra-chave var. "radix":
true, // Requer que o parâmetro radix seja especificado ao chamar parseInt. "triple-equals": true, // Requer
=== e !== no lugar de == e !=. "use-isnan": true, // Impõe o uso da função isNaN() para
verificar referências NaN
de uma comparação com a constante NaN.
// Estilo
"class-name": true, // Aplica nomes de classe e interface PascalCased. "interface-name":
[ true, "never-prefix" ], // Requer que nomes de interface comecem com maiúscula
'EU'
"no-angle-bracket-type-assertion": true, // Requer o uso de as Type para declarações de tipo em vez de <Type>.
"one-variable-per-declaration": true, // Não permite várias definições de variáveis na mesma instrução de declaração.
"quotemark": [ true, "double",
"avoid-escape" ], // Requer aspas duplas para strings literais. "ponto e vírgula": [ true, "always" ], // Impõe o uso consistente
de ponto e vírgula no final de cada
declaração.
}
}
O Tslint é configurado por meio do arquivo tslint.json. Para inicializar a configuração padrão, execute o comando
tslint -- calor
tslint-microsoft-contrib
tslint-eslint-regras
codelyzer
O gerador Yeoman suporta todas essas predefinições e também pode ser estendido:
gerador-tslint
impede o uso de
qualquer requer chaves para instruções if/else/for/do/while requer
aspas duplas (") para serem usadas para strings
{
"rules": { "no-
any": verdadeiro,
"curly": verdadeiro,
"aspas": [verdadeiro, "duplo"]
}
}
tslint:recommended é um conjunto de regras estável e um tanto obstinado que encorajamos para a programação geral do
TypeScript. Essa configuração segue semver, portanto, não haverá alterações importantes em versões secundárias ou de patch.
tslint:latest estende tslint:recommended e é continuamente atualizado para incluir a configuração das regras mais recentes em cada
versão do TSLint. O uso dessa configuração pode introduzir alterações importantes em versões secundárias, pois novas
regras são habilitadas, o que causa falhas de lint em seu código. Quando TSLint atingir um aumento de versão principal,
tslint:recommended será atualizado para ser idêntico a tslint:latest.
{
"estende": "tslint:recomendado"
}
Pode-se então sobrescrever as regras dessa predefinição por meio de regras, por exemplo, para desenvolvedores de nós, fazia sentido definir no-console
para falso:
{
"extends": "tslint:recommended", "rules":
{ "no-
console": false
}
}
A inicialização de um projeto TypeScript, ou melhor colocar o arquivo tsconfig.json, pode ser feita através do seguinte comando:
tsc --init
A partir do TypeScript v2.3.0 e superior, isso criará o seguinte tsconfig.json por padrão:
{
"opções do compilador": {
/ * Opções básicas */
"target": "es5", / * Especifique a versão de destino do ECMAScript: 'ES3' (padrão),
'ES5', 'ES2015', 'ES2016', 'ES2017' ou 'ESNEXT'. */
"module": "commonjs", 'system', / * Especifique a geração do código do módulo: 'commonjs', 'amd',
'umd' ou 'es2015'. */ // "lib": [], compilação:
*/ // "allowJs": / * Especifica os arquivos de biblioteca a serem incluídos no
true, // "checkJs": true, //
"jsx": "preservar", / * Permite que arquivos javascript sejam compilados. */ / * Relatar
erros em arquivos .js. */ / * Especifique a geração
de código JSX: 'preservar', 'reagir
nativo', ou 'reagir'. */
// "declaration": true, // / * Gera o arquivo '.d.ts' correspondente. */ / * Gera o arquivo
"sourceMap": true, // "outFile": '.map' correspondente. */ / * Concatena e emite a saída para
"./", // "outDir": "./", // um único arquivo. */ / * Redireciona a estrutura de saída para o diretório.
"rootDir": "./", controle a */ / * Especifique o diretório raiz dos arquivos de entrada. Use para
estrutura do diretório de
saída com --outDir. */ / * Não emite comentários para a saída. */ / * Não emite
// "removeComments": true, // saídas. */ / * Importar auxiliares de emissão de 'tslib'.
"noEmit": true, // */ / * Forneça suporte completo para
"importHelpers": true, // iteráveis em 'for-of', spread e destructuring ao direcionar
"downlevelIteration": true, 'ES5' ou 'ES3'. */ // "isolatedModules": true, / * Transpila cada arquivo
como um módulo separado (semelhante a 'ts.transpileModule'). */
/ * Verificações Adicionais */ //
"noUnusedLocals": true, // / * Relatar erros em locais não utilizados. */ / * Relata
"noUnusedParameters": true, // erros em parâmetros não utilizados. */ / * Relatar erro quando
"noImplicitReturns": true, retorna um valor. nem todos os caminhos de código na função
*/ //
"noFallthroughCasesInSwitch": true, declaração. */ / * Reportar erros para casos de fallthrough no switch
/ * Opções experimentais */ //
"experimentalDecorators": true, // / * Habilita suporte experimental para decoradores ES7. */ / * Habilita suporte
"emitDecoratorMetadata": true, metadados para experimental para emissão de tipo
decoradores. */
}
}
A maioria, se não todas, as opções são geradas automaticamente com apenas as necessidades básicas deixadas sem comentários.
Versões mais antigas do TypeScript, como por exemplo v2.0.xe inferior, gerariam um tsconfig.json como este:
{
"compilerOptions": { "module":
"commonjs", "target": "es5",
"noImplicitAny": falso,
"sourceMap": falso
}
}
{
"opções do compilador": {
"alwaysStrict": true, // Analisa em modo estrito e emite "usar estrito" para cada arquivo de origem.
// Se você tiver maiúsculas e minúsculas incorretas em arquivos referenciados, por exemplo, o nome do arquivo é Global.ts e você tem um ///
<reference path="global.ts" / > para fazer referência a este arquivo, isso pode causar erros inesperados.
Visite: http:// stackoverflow.com/ questions/ 36628612/ typescript-transpiler-casing-issue
"forceConsistentCasingInFileNames": true, // Não permite referências inconsistentes ao mesmo arquivo.
// "allowUnreachableCode": false, // Não relatar erros em código inacessível. (Padrão: False) // "allowUnusedLabels": false, // Não relatar
erros em rótulos não utilizados. (Padrão: Falso)
"noFallthroughCasesInSwitch": true, // Relata erros para casos de falha na instrução switch. "noImplicitReturns": true, //
Relata erro quando nem todos os caminhos de código na função retornam um valor.
"noImplicitAny": true, // Gera erro em expressões e declarações com um tipo "qualquer" implícito. "noImplicitThis":
"strictNullChecks": true, // Os valores null e undefined não estão no domínio de cada tipo
e são apenas atribuíveis a si mesmos e a qualquer um.
Insuficiente? Se você é um hard coder e deseja mais, pode estar interessado em verificar seus arquivos TypeScript com tslint antes de compilá-
los com tsc. Verifique como configurar o tslint para um código ainda mais rígido.
{
"compileOnSave":
verdadeiro, "compilerOptions": {
...
},
"excluir": [
...
]
}
Esse recurso está disponível desde o TypeScript 1.8.4 em diante, mas precisa ser suportado diretamente pelos IDEs. Atualmente, exemplos
de IDEs suportados são:
Um arquivo tsconfig.json pode conter comentários de linha e de bloco, usando as mesmas regras do ECMAScript.
// Comentário inicial {
"compilerOptions": { //este
é um comentário de linha
"module": "commonjs", //comentário de linha eol
"target" /*bloco inline*/ : "es5",
/ * Este é um
bloco
Comente */
}
}
/ * comentário final */
Isso geralmente é apenas um açúcar de sintaxe, pois as enumerações constantes são embutidas no JavaScript compilado.
Falso,
Desconhecido
compila para
var algo = 0;
Embora o desempenho se beneficie do inlining, você pode preferir manter os enums mesmo que constantes (ou seja: você pode desejar legibilidade no
código de desenvolvimento), para fazer isso, você deve definir em tsconfig.json a cláusula preserveConstEnums nas opções do compilador como true .
{
"opções do compilador": {
"preserveConstEnums" = verdadeiro,
...
},
"excluir": [
...
]
}
Dessa forma, o exemplo anterior seria compilado como qualquer outra enumeração, conforme mostrado no trecho a seguir.
var Tristate;
(função (Tristate) {
Tristate[Tristate["Verdadeiro"] = 0] = "Verdadeiro";
Tristate[Tristate["False"] = 1] = "Falso";
Tristate[Tristate["Desconhecido"] = 2] = "Desconhecido";
})(Tristate || (Tristate = {}));
Transpile para JavaScript, execute no nó e use mapeamentos para vincular de volta aos arquivos de origem do TypeScript
ou
Este artigo descreve as duas maneiras de usar o Visual Studio Code e WebStorm. Todos os exemplos presumem que seu arquivo principal seja
index.ts.
Clique com o botão direito no script e selecione Create 'test:idea'... e confirme com 'OK' para criar a configuração de depuração:
npm i ts-node
O launch.json precisa ser configurado para usar o tipo node2 e iniciar o npm executando o script start:debug :
{
"versão": "0.2.0",
"configurações": [ {
"type": "node2",
"request": "launch",
"name": "Launch Program",
"runtimeExecutable": "npm",
"windows":
{ "runtimeExecutable": "npm.cmd"
},
"runtimeArgs": [ "run-
script",
"start:debug"
],
"cwd": "${workspaceRoot}/server",
"outFiles": [],
"porta": 5858,
"sourceMaps": verdadeiro
}
]
}
"sourceMap": verdadeiro,
para gerar mapeamentos juntamente com arquivos js das fontes TypeScript usando o comando tsc .
o launch.json arquivo:
{
"versão": "0.2.0",
"configurações": [ {
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceRoot}\\index.js", "cwd": "$
{workspaceRoot} ", "outFiles": [],
"sourceMaps":
verdadeiro
}
]
}
Isso inicia o nó com o arquivo index.js gerado (se seu arquivo principal for index.ts) e o depurador no Visual Studio Code, que para em
pontos de interrupção e resolve valores de variáveis em seu código TypeScript.
Para usar fita com TypeScript, você precisa instalar ts-node como pacote global, para fazer isso execute o comando
// math.test.ts
importa * como teste de "fita";
tratar();
});
TAP versão 13
# Teste de
matemática ok 1 deve ser
igual ok 2 deve ser verdadeiro
1..2
# testes 2 #
passa 2
# OK
Você pode executar vários arquivos de teste de uma só vez usando curingas de caminho. Para executar todos os testes TypeScript no comando de execução do
diretório de testes
npm install -g é
Para fazer o jest funcionar com o TypeScript, você precisa adicionar a configuração ao package.json
// pacote.json {
...
"é":
{ "transformar": {
".(ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js" }, "testRegex": "(/
}
}
Agora jest está pronto. Suponha que temos amostra fizz buz para testar
// fizzBuzz.ts
função de exportação fizzBuzz(n: número): string { let
output = ""; for (let i
= 1; i <= n; i++) { if (i % 5 && i % 3)
{ output += i + ' ';
} if (i % 3 === 0) { output
+= 'Fizz ';
} if (i % 5 === 0) { output
+= 'Buzz ';
}
} retorna a saída;
}
// FizzBuzz.test.ts ///
<tipos de referência="é" / >
PASS ./fizzBuzz.test.ts
ÿ Teste FizzBuzz (3ms)
Cobertura de código
Para usar a cobertura de código com TypeScript, você precisa adicionar outra linha de configuração a package.json.
{
...
"é": {
...
"testResultsProcessor": "<rootDir>/node_modules/ts-jest/coverageprocessor.js"
}
}
é --cobertura
PASS ./fizzBuzz.test.ts
ÿ Teste FizzBuzz (3ms)
jest também criou a pasta coverage que contém o relatório de cobertura em vários formatos, incluindo um relatório
html amigável em coverage/lcov-report/index.html
alsaciano é uma estrutura de teste de unidade escrita em TypeScript. Ele permite o uso de casos de teste e produz resultados compatíveis com TAP marcação.
export SomeModuleTests {
@Test()
public statusShouldBeTrueByDefault() { let
instance = new SomeModule();
Expect(instance.status).toBe(true);
}
Expect(instance.name).toBe(null);
}
@TestCase("primeiro nome")
@TestCase("maçãs")
public shouldSetNameCorrectly(nome: string) { let instance
= new SomeModule();
instância.setName(nome);
Expect(instância.nome).toBe(nome);
}
chai.use(chaiImmutable);
expect(Set.of(1,2,3)).to.include(2);
expect(Set.of(1,2,3)).to.include(5); }) })
4. Execute-o no console:
Créditos
Muito obrigado a todas as pessoas da Stack Overflow Documentation que ajudaram a fornecer este conteúdo, mais alterações
podem ser enviadas para [email protected] para novos conteúdos a serem publicados ou atualizados
2426021684 Capítulos 1, 14 e 16
Os Babins Capítulo 9
Alec Hansen Capítulo 1
Alex Filatov Capítulos 22 e 27
Amêndoa Capítulo 14
Aminadav Capítulo 9
para Capítulo 9
artem Capítulos 9, 14 e 25
Blackus Capítulo 14
bnieland Capítulo 28
br4d Capítulo 6
BrunoLM Capítulos 1, 17 e 22
brutus Capítulo 14
ChanceM Capítulo 1
Cobus Kruger Capítulo 9
danvk Capítulos 1, 2 e 11
dimitrisli capítulo 5
duplicador Capítulo 14
Equiman Capítulo 7
Fenton Capítulos 3 e 18
Florian Haemmerle capítulo 5
Fylax Capítulos 1, 3 e 28
indo Capítulo 28
hansmaad Capítulos 7 e 10
Harry Capítulo 14
irakli khitarishvili Capítulos 17 e 26
islandman93 Capítulos 1, 6, 9, 14 e 26
James Monger Capítulos 7, 27 e 30
JKillian Capítulos 11 e 14
Joel dia Capítulo 14
John Ruddell Capítulo 22
Joshua Breeden Capítulos 1 e 9
Julien Capítulos 3 e 28
Justin Niles Capítulo 7
k0pernikus Capítulos 1 e 27
Kevin Montrose Capítulos 5, 12 e 19
Kewin Dousse Capítulo 22
KnottytOmo Capítulos 1, 10 e 14
Cordeiro cubano Capítulo 1
lekhnath Capítulo 1
leonidv Capítulo 30
lilezek Capítulo 23
Crescendo Capítulos 3, 27 e 28
Matt Lishman Capítulo 1
Matthew Harwood Capítulo 30
Mikhail Capítulos 1 e 3
mleko Capítulos 1, 15, 22, 27 e 30