Escolar Documentos
Profissional Documentos
Cultura Documentos
Site oficial da
linguagem.
Frameworks como
Angular, Ionic e o
NodeJS trabalham
com Typescript
Introdução ao Typescript
Vantagens
Inferência de
tipo, aonde o
compilador
define o tipo da
variável.
Classe com propriedades automáticas
Como instalar o Typescript
Node.js e NPM
Gerenciador de pacotes
Javascrip. Ou seja,
acessamos um repositório
de bibliotecas para
projetos Javascript
BF1
2) Podemos testar a
instalação requisitando a
versão do programa.
Como instalar o Typescript
Testando o VSCode e o compilador
https://www.youtube.com/watch?v=Hs6XWwQUs_A
https://code.visualstudio.com/docs/typescript/typescript-compiling
Como instalar o Typescript
Testando o VSCode e o compilador
"version": "0.2.0",
"configurations": [
{
"type": "node", 2) Informe o
"request": "launch", nome do arquivo
"name": "Typescript debug", principal da
"program": "${workspaceFolder}/app.ts", aplicação.
"outFiles": [
"${workspaceFolder}/**/*.js"
]
},
{
"type": "node",
"request": "attach",
1) Agora temos que
informar as configurações
"name": "Attach to process",
do projeto para Debug, "address": "localhost",
para isso crie um arquivo "port": 5858,
chamado laungh.json na "outFiles": [
pasta “.vscode”. "${workspaceFolder}/**/*.js"
]
}
]
}
laungh.json
https://code.visualstudio.com/docs/typescript/typescript-compiling
Como instalar o Typescript
Testando o VSCode e o compilador
2) Logo em
seguinda
executar com ou
sem o DEBUG
CRTL+F5
1) Depois de configurado,
temos que compilar o
script com os comandos
CRLT+SHIT+B.
https://code.visualstudio.com/docs/typescript/typescript-compiling
Como instalar o Typescript
Testando o VSCode e o compilador
if (i === 10){
let valor = 20;
}
else {
let valor = 30;
}
console.log(valor);
Error: runtime – uncaught reference error
}
Tipos básicos
Boolean
• Os tipos básicos introduzido pelo Typescrip são semelhantes aos que podem ser usados
em Javascript. O tipo boolean recebe os valaores true ou false.
isNew = true;
Number
• Todos os números são do tipo number, não existe subtipos como integer ou float.
nome = "Luis";
Template strings
• Valor literal delimitados por caractere de acento de crase (`) e permitem criar strings
multilinha ou expressões com placeholders utilizando ${xxx} .
let nome = "Luis";
let expressao = ` Olá, ${nome}
tudo bem com você?`;
console.log(expressao);
Tipos básicos
Array
• Existem também um tipo que armazena um conjunto de valores do mesmo tipo, matriz
unidimensional, a qual pode ser declarado de duas formas diferentes:
var list1: number[] = [1, 2, 3];
let i:any;
for(i in list1) {
Compilador
console.log(list1[i])
exige que a
variável seja }
Acessando
do tipo any um
ou string. var list2: Array<number> = [8,12,33]; elemento
console.log(`Primeiro elemento da lista2 => ${list2[0]}`); específico
• Existem vários métodos para trabalhamos com arrays, pois eles são tratados como
objetos pela linguagem:
https://www.tutorialspoint.com/typescript/typescript_arrays.htm
Tipos básicos
Array
• Exemplos:
//-----------------------------------
//--------------------------------------- function usaInformacao(value: number) {
var marks:number[] = [58, 68, 74, 88, 64, 90] console.log(value+100);
}
function isPassed(element: number, index: number, array: number[]) { var marks1:number[] = [58, 68, 74, 88, 64, 90]
return (element >= 35) var passA: boolean[];
} marks1.forEach( n => usaInformacao(n));
// ou
var passed = marks.every(isPassed) // marks1.forEach(usaInformacao);
if(passed) //------------------------------------------
console.log("The student has passed.") var numbers = [1, 4, 9];
else var roots = numbers.map(n => Math.sqrt(n));
console.log("The student has failed") console.log("roots is : " + roots );
// ou
//----------------------------------- //var roots = numbers.map(Math.sqrt);
//console.log("roots is : " + roots );
https://www.tutorialspoint.com/typescript/typescript_arrays.htm
Tipos básicos
Array
• Exercício:
1) Crie um array com notas de um aluno;
2) Filtre esse array para retornar somente as notas maiores que 60;
3) Nesse mesmo array, informe em qual posição aparece a nota 70.
https://www.tutorialspoint.com/typescript/typescript_arrays.htm
Tipos básicos
Array
• Exercício - Solução:
https://www.tutorialspoint.com/typescript/typescript_arrays.htm
Tipos básicos
Exemplos com HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> let input = document.createElement('input');
Introdução ao typescritp input.setAttribute("id", "texto");
</title> input.setAttribute("value", "Entre com o nome");
</head> document.body.appendChild(input);
<body>
<script type="module" src="app.js"></script> var campo: HTMLElement = document.getElementById('texto');
</body>
</html> let button = document.createElement('button');
button.textContent = "Say Hello";
index.htm
button.onclick = function() {
alert(‘Olá’);
if (campo !== null)
alert(campo.getAttribute("value"));
}
document.body.appendChild(button);
https://www.tutorialspoint.com/typescript/typescript_arrays.htm
Tipos básicos
Tupla
• Existe uma especialização do tipo array que se chama tuple, esse tipo permite definir
tipos de dados diferentes para diferentes posições do vetor:
A primeira e a
segunda
posição do
array terão
respectivamen
te esses tipos.
• Esse tipo de dado permite atribuir nomes amigáveis a valores numéricos constantes,
assim temos uma lista com valores predefinidos, o uso desse tipo ajuda a melhorar a
legibilidade do código.
Como não atribuímos
Podemos calcular o valor,
explicitamente nenhum número
Fazendo a em relação aos outros
aos elementos, o primeiro valor
atribuição membros, nesse caso
terá o numero zero, o segundo
enum SinalSemaforo { enum SinalSemaforo { explícita de enum SinalSemaforo { fazemos uma operação
um, e assim por diante
Verde, Verde = 1, valor. Verde = 1, lógica “ou” bit a bit.
Amarelo, Amarelo = 2, Amarelo = 2,
Vermelho Vermelho= = 6 Vermelho = Verde | Amarelo
} } }
console.log(SinalSemaforo[sinalAtual]);
Tipos básicos
Any
• Esse tipo é utilizado para significar a ausência de tipo. Tipicamente este termo é apenas
usado na declaração de funções que não devolvem qualquer valor. O uso em variáveis
não é útil porque apenas permite a atribuição dos valores undefined ou null
Função sem
retorno
function warnUser(): void {
console.log("This is my warning message");
}
warnUser();
Tipos básicos
Null, Undefined
• São considerados subtipos de todos os outros tipos e podem ser utilizados na declaração
de variáveis. Na prática, isto significa que estes valores podem ser atribuídos a qualquer
tipo de variável , não sendo seu uso isolado muito importante.
• O valor undefined significa que a variável não teve valor associado a ela, enquanto null,
as variáveis, funções, propriedades e métodos nativos dos quais se espera um objeto
como valor ou retorno não foram entregues/atribuídos;
Podemos declarar let indefinido: undefined;
uma variável do tipo indefinido = undefined;
indefinido, mas não
faz sentido, pois ele só var a;
receberá esse valor.
console.log(typeof a); //resultado> "undefined"
console.log(typeof a === "object"); //resultado> false
Exemplo de
Variáveis não console.log(typeof a === "undefined"); //resultado> true function func(a: number){ uso.
atribuídas são console.log(typeof a == "undefined"); //resultado> true
undefined if (a === undefined)
var b = null; console.log('variável não definida.’);
console.log(typeof b); //resultado> "object" }
Objetos não
console.log(typeof b === "undefined"); //resultado> false
atribuídos são console.log(typeof b === null); //resultado> true var x: number;
null console.log(typeof b == null); //resultado> true func(x);
Tipos básicos
Never
• Esse tipo representa um valor que nunca acontece. Por exemplo, pode ser usado para
dizer que uma função não devolve um valor, assim não precisamos do termo return.
Assim como, null e undefined, ele é considerado como um subtipo de qualquer outro
tipo.
Função sem
retorno
• Usamos o tipo never para indicar funções sem retorno de execução ou para indicar que
a função retorna uma exceção.
Função sem
retorno
• Existem alguns cenários nos quais o programador está em melhor posição de saber que
tipo específico é referenciado por uma variável. Um exemplo é uma hierarquia de classe.
Essas conversões explicitas (cast ou assertions) são feitas de duas formas:
let someValue1: any = "this is a string"; let someValue3: Object = "this is a string";
let strLength1: number = (<string>someValue1).length; let strLength3: number = (<string>someValue1).length;
let someValue2: any = "this is a string"; let someValue4: Object = "this is a string";
let strLength2: number = (someValue2 as string).length; let strLength4: number = (someValue2 as string).length;
Funções
Funções nomeadas e anônimas
Função nomeada
em que espera um
valor string e
retorna também um
string.
function dizOla(nome: string){
return `Olá, ${nome}`; A linguagem aceita
} funções anônimas,
para sua execução
temos que associa-
let imprimeMsg = function (msg: string) : void { la a alguma variável.
console.log(msg);
}
imprimeMsg(”teste!!”);
• Funções podem ser usadas para definir novos tipos que, por sua vez, são utilizadas para
tipificar outras variáveis ou parâmetros..
Aqui temos a
Definindo um tipo: Impressora é uma referencia para o
variável que espera uma referencia tipo de retorno.
para uma função que recebe uma
string e não retorna valor. let impressora : (nome: string) => void;
Executa a função
anônima sobre a
variável impressora
Outro exemplo de
função anônima.
var res = function (a: number, b: number)
{
return a * b;
};
console.log(res(12, 2));
Funções
Parâmetros opcionais
Marcamos o
parâmetro como
opcional.
opcionais("Tião",22);
opcionais("Maria"); Chamada com
dois e com um
parâmetro.
Funções
Parâmetros com valores predefinidos
• Se for necessário, podemos atribuir um valor padrão para um parâmetro, Nesses casos,
esse valor é utilizado no interior da função quando não atribuímos explicitamente um
valor para parâmetro.
Definindo valor
padrão para os dois
parâmetros.
Atenção: uma função pode definir function predefinidos (nome: string = "Raul", idade = 20){
vários parâmetros com valores console.log(`Nome: ${nome}, idade ${idade}`);
padrões, devendo estes serem sempre }
colocados depois dos parâmetros sem
valor padrão. predefinidos();
Funções
Parâmetros REST
• Esse tipo de função é utilizado para facilitar a escrita de funções anônimas, ela é
composta pela seção de parâmetros, o operador lambda (=>) e seu bloco de código
(estrutura).
Exemplo de criação e uso
de funções arrow. Logo
abaixo, vemos a criação do Agora utilizamos o método filter do
mesmo código sem o uso array passando uma função como
var foo1 = (x: number) => 10 + x de funções lambdas. parâmetro. O primeiro exemplo
console.log(foo1(100)) mostra a forma convencional e o
segundo usando funções arrow.
var foo2 = function (x: number) { return 10 + x; }; let numeros = [1,2,3,4,5];
console.log(foo2(100));
var display = x => { let aux2 = numeros.filter( (valor, index, arr) => valor % 2 === 0);
console.log("The function got "+x) console.log(aux1.join(' '));
}
display(12);
Tipos básicos
Funções
• Exercício:
1) Crie uma função que recebe uma string e retorne a string com os caracteres separados
por hífen. Exemplo: “Jose” => “J-o-s-e”;
2) Crie uma função que recebe uma string e retorna se ela é palindromo;
3) Crie uma função que recebe um array de string, retorne um array indicando se cada
palavra é palindromo.
https://www.tutorialspoint.com/typescript/typescript_arrays.htm
Tipos básicos
Funções
• Exercício - Respostas:
let soletrar = function (x: string): string{
x = x.replace("-","");
1) x = x.replace(" ","");
return x.toUpperCase().split("").join("-");
}
console.log(soletrar("Bruno Ferreira"));
console.log(soletrar("guarda-chuva"));
function isPalindromo(l) {
2) let x = l.split("").reverse().join("");
return (x == l) ? true : false;
}
console.log(isPalindromo('casa'));
console.log(isPalindromo('oborobo')); Primeiro com a função split(), transformei um
console.log(isPalindromo('asa')); string em uma array, tendo uma array eu posso
console.log(isPalindromo('babab')); utilizar a função reverse(), que inverte a ordem dos
console.log(isPalindromo('Frango')); elementos de uma array e por último utilizei a
função join(), que junta os elementos de uma array
em uma string.
Operadores
Aritméticos
• Operadores aritméticos tomam valores numéricos (sejam literais ou variáveis) como seus
operandos e retornam um único valor numérico.
Operador Descrição
+ Operador binário. Retorna a soma de dois números.
- Operador binário. Retorna a subtração de dois números.
* Operador binário. Retorna a multiplicação de dois números.
/ Operador binário. Retorna a divisão de dois números.
++ Operador unário. Adiciona um ao seu operando. Se usado como operador
prefixado (++x), retorna o valor de seu operando após a adição. Se usado como
operador pós fixado (x++), retorna o valor de seu operando antes da adição.
-- Operador unário. Subtrai um de seu operando. O valor de retorno é análogo
àquele do operador de incremento.
% Operador binário. Retorna o inteiro restante da divisão dos dois operandos.
Operadores
Lógico
• Operadores lógicos são utilizados tipicamente com valores booleanos (lógicos); neste
caso, retornam um valor booleano.
Operador Descrição
&& Operador retorna verdadeiro somente se toda a expressão for verdade.
|| Operador retorna verdadeiro somente se pelo menos uma expressão for
verdade.
! Operador retorna o inverso do valor inicial de uma expressão.
& Operador que executa uma operação bolleana do tipo (and) em cada bit dos
operandos informados.
| Operador que executa uma operação bolleana do tipo (or) em cada bit dos
operandos informados.
^ Operador que executa uma operação bolleana do tipo (Xor – ou excluisvo) em
cada bit dos operandos informados.
~ Operador que executa uma operação bolleana do tipo (not) em cada bit dos
operandos informados.
Operadores
Associação
• Alguns exemplos...
Interface
Introdução
• Interfaces permitem definir tipos que podem ser utilizados pelo compilador Typescript na
validação do código, esse conceito define a estrutura do objeto;
• Interface pode ser vista como um contrato, ou seja, o formato de um novo tipo, caso
uma declaração não esteja de acordo com a interface, um erro é lançado pelo
compilador.
• Como Javascript não tem suporte a esse recurso a definição da interface é ignorado
quando o código é transcrito.
• Uma interface define uma coleção de propriedades e métodos, sem especificar os
detalhes de implementação associados a cada um desses membros. Esses detalhes são
obrigação de um objeto ou uma classe que venha implementar a interface em questão.
• Se um objeto ou classe que possuem os mesmos nomes, lista de parâmetros e tipos de
retorno que uma interface, então dizemos que são compatíveis.
Interface
Sintaxe
• Para criar uma estrutura desse tipo, utilizamos a palavra reservada interface. Seguido
pelo nome, sendo os seus membros definidos no interior de um bloco delimitado por
chaves.
Qualquer variável
que tem a estrutura
da interface poderá
function imprime(p: Pessoa){ ser passada como
if (!p.nome){ parâmetro nessa
p.nome = 'Sem nome'; função.
}
p.imprime();
}
Interface Uma alternativa ao uso
de interface é declarar o
parâmetro como um
Sintaxe objeto, nesse caso, todo
objeto que tenha a
propriedade label do tipo
• Evitando erros
interface SquareConfig {
color?: string;
width?: number;
}
Qualquer objeto
que apresente uma interface OutraPessoa {
propriedade
designada por nome: String;
“nome” é imprime?: () => void;
considerada }
compatível.
if (!p.nome){
Membros opcionais p.nome = 'Sem nome';
obriga-nos a ter
}
algum cuidado na
if (p.imprime){
interação com
objetos
p.imprime();
compatíveis. } else {
console.log (`Sem membro imprime: ${p.nome}`);
}
}
Interface
Membros somente leitura
Podemos atribuir o
valor ao membro
“nome” somente
uma vez, a linha de
Informando que interface AlunoInterno{ baixo resultaria em
o campo é readonly nome: string; erro.
somente }
leitura.
let aluno: AlunoInterno = {nome: 'Jimy'};
aluno.nome = 'Jhon’; // Erro de compilação
Interface
Herança de interfaces
• A linguagem suporta que uma interface estenda outra. Para isso tem-se que recorrer a
palavra reservada extends.
Uma interface
pode herdar
interface Pessoa { membros de várias
outras interfaces
nome: String; usando a virgula (,)
imprime: () => void; para declará-la.
Uma variável que }
pertence ao tipo Aluno
terá as propriedades interface Aluno extends Pessoa{
nome e turma, além do turma: string;
método opcional }
“imprime”
Interface
Compatibilidade de interfaces com objetos literais
• Primeiro vamos entender o que são objetos literais. Literais são maneiras menores para
var carro = { definir objetos. Basta inserir entre
marca: "Ford", chaves as propriedades e métodos de
modelo: "Ka", um objeto. Nesse caso o objeto já é
getDetalhes: function () { instanciado e referenciado pelo nome
da variável que ele foi atribuído.
return this.marca + ' - ' + this.modelo;
}
}
interface Existe{
(nome:string): boolean;
}
class Pessoa{
nome: String;
2) Definimos um construtor.
constructor(nome: string){ 3) A classe tem uma
this.nome = nome; propriedade e um método.
}
• Por padrão todos os membros de uma classe são públicos. Mas ao contrário do
Javascript, o Typescript suporta o uso de outros níveis de visibilidade.
class Pessoa2{
class Pessoa{
2) Esse membro só private nome: String;
public nome: String;
pode ser acessado
dentro da classe. constructor(nome: string){
public constructor(nome: string){
this.nome = nome; this.nome = nome;
} }
1) Podemos
explicitar a
visibilidade, mesmo
que o padrão é let m3: Pessoa = new Pessoa2('Robert'); 3) Dois objetos são compatíveis quando
public. os tipos, nomes e visibilidade das
propriedades são os mesmo. Nesse caso, o
compilador acusaria um erro.
Classes
Parâmetros como propriedades
• Existe um atalho que reduz o código necessário para declarar propriedades. Quando os
parâmetros de um construtor tem anotados também os qualificadores, o compilador
Typescrip injeta campos na classe com os mesmos nomes e qualificadores desses
parâmetros.
imprimirNome(){
console.log(`Olá ${this.nome}`)
};
}
• As propriedades podem ser vistas como campos onde o acesso de leitura ou escrita é
feito através do uso de métodos especiais.
class Aves{
private _nome: string;
• Assim como as interfaces, os membros de uma classe podem ser opcionais, para isso
usamos o caractere “?”.
if (mOp.imprimeIdade)
2) Os membros opcionais console.log(mOp.imprimeIdade)
podem retornar o tipo
undefined, sendo assim, temos
que fazer o teste antes do uso
dos métodos opcionais.
Classes
Membros estáticos
• Membros estáticos são compartilhados entre todas as instâncias criadas a partir de uma
classe e acessadas através do nome da classe.
get idade(){
return this._idade;
}
4) Seguindo os conceitos da OO
set idade(valor: number){ clássica, pode-se declarar
this.idade = valor; membros com encapsulamento
} protected. Esse nível de acesso
} restringe a utilização dos
3) Podemos acessar os membros somente à classe ou
métodos públicos let aluno1 = new Aluno('Johny', 23); às classes filhas.
herdados pela classe. aluno1.nome = 'Johny Lemos';
Classes
Classes abstratas
• Como na orientação a objetos clássica, em Typescript pode-se criar classes que não
podem ser instanciadas diretamente. Essas classes servem apenas de padrão para as
classes filhas, esse comportamento é alcançado através da palavra reservada abstract.
• Typescript permite que um parâmetro ou uma variável assuma mais de um tipo. Esse
conceito é chamado de união de tipos (“|”).
1) Usamos o conceito de
união para definir que o
parâmetro poderá ser do
tipo string ou number.
let r = padLeft('Texto..',4);
2) Usamos a console.log(r);
função com os 3) O tipo “any” poderia ter
r = padLeft('Texto..','Inicio');
dois tipos de sido usado, contudo, o
console.log(r);
parâmetros. usuário tem a possibilidade
de usar um tipo boolean, o
que não é o desejado.
Outros tipo
Unions
• Existe um outro recurso de guarda, o qual consiste em criar um campo em comum entre
os tipos, assim o compilador é capaz de inferir o tipo de acordo com esse campo em uma
condição if ou switch. interface Square {
kind: "square";
size: number;
}
interface Rectangle {
kind: "rectangle";
width: number;
height: number;
}
interface Circle {
kind: "circle";
radius: number;
}
• As interseções (&) são tipos personalizados criados a partir da combinação de vários tipos.
Assim, o objeto assume simultaneamente a identidade de todos os tipos e será
compostos pela união de todos os membros desses tipos.
interface IPessoa{
nome: string;
}
interface IAluno{
escola: string;
}
• Aliases permite criar nomes alternativos para tipos existentes. Não se trata de um novo
tipo, mas são uteis para a redução de código e para melhorar a abstração dos problemas.
Pode-se renomear tipos primitivos, uniões, tuplas, entre outros tipos criados pelo usuário.
type Nome = string;
type NomeCorreto = () => string;
type NomeOrNomeCorreto = Nome | NomeCorreto;
function getName(n: NomeOrNomeCorreto): Nome {
1) Usamos a palavra
if (typeof n === "string") {
reservada type para criar
return n;
os apelidos. Podemos criar
}
apelidos utilizando outros
apelidos e dar apelidos else
para tipos funções. return n();
}
type Tree = {
value: number;
left: Tree;
right: Tree;
}
• String literal types permitem criar um novo tipo de dados em que o tipo string recebe
exatamente os valores que foram especificados na definição.
let resposta: "Sim" | "Não";
resposta = "Sim";
//resposta = "talvez"; <===Erro
class Flies {
fly() {
console.log('voando...'); 1) Começamos com
} duas classes simples
} que representam
superpoderes de
class Climbs { heróis.
climb() {
console.log(‘subindo na parede');
}
}
Outros tipo 2) Criamos uma terceira classe que
herda os poderes das duas
primeiras classes (herança
Mixim ou herança múltiplas múltipla), para qual usamos a
palavra chave implements.
• Typescript, como outras linguagens oferece o recurso de generics, o qual visa aumentar a
reusabilidade de código tornando os tipos de dados genéricos, isso sem perder a verificação de
tipos.
• Um exemplo clássico é o uso de coleções que são capazes de se adaptarem a diferentes tipos
de objetos ou tipos primitivos.
• Veja um exemplo abaixo, aonde não queremos usar o tipo any, para dar mais segurança
referente os tipos de dados a uma função que compara se os valores são iguais:
1) Introduzimos um ou mais parâmetro de
tipos, de qualquer nome (padrão T) que serve
como um placeholder para tipos concretos.
• Pode-se utilizar generics em funções de uma interface, isso pode ser feito de duas formas:
2) Declaramos o
2) Declaramos o tipo genérico na
interface Molde { tipo genérico na interface Molde<T> { definição da
<T>(arg: T): T; função da interface. interface.
(arg: T): T;
} }
• Pode-se utilizar generics em classes, isso pode ser feito da seguinte forma:
class AdicionaGenerico<T> {
1) Classe com o valorInicial: T;
tipo genérico add: (x: T, y: T) => T;
definido na }
declaração da
classe. let myGenericNumber = new AdicionaGenerico<number>();
myGenericNumber.valorInicial = 0; 2) Instanciamos
dois objetos com
myGenericNumber.add = function(x, y) { return x + y; };
tipos diferentes.
console.log(myGenericNumber.add(100,400));
• Outro exemplo:
class Generica<U>{
3) Propriedade
constructor(public t: U){}
definida com
}
generics no
let g = new Generica<boolean>(true);
construtor
console.log(g.t);
Outros tipo
Generics Constraints
• O compilador Typescript, em muitas das vezes, não consegue prever se um parâmetro do tipo
genérico tem uma determinada propriedade ou método. Veja o exemplo abaixo:
function registrar<T>(arg: T): T {
1) Essa linha apresenta um
erro, o compilador não console.log(arg.length);
reconhece o método lenght return arg;
}
• Contudo, temos que garantir que o tipo passada terá esse método ou propriedade e isso é feito
criando uma interface (contrato) em conjunto com a palavra reservada extends durante a
declaração do tipo genérico:
interface Comprimento {
length: number;
}
class PessoaFisica{
• Outro exemplo: constructor(public nome: string){}
}
class PessoaJuridica{
constructor(public nome: string){}
1) O tipo Y tem a }
propriedade nome.
• Podemos aprofundar nos exemplos criando restrições entre os parâmetros de tipo genéricos:
function getProperty<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
2) O tipo k têm os mesmos
membros que o elemento T.
let xs = { a: 1, b: 2, c: 3, d: 4 };
• Promise é um tipo de dado que tenta solucionar problemas relacionados com tarefas
assíncronas em cadeia.
• Esse tipo de dado é responsável por notificar acerca da sua conclusão. Sua especificação é
direta
let pr = new Promise ( (resolve, reject) => {
// resolva ou rejeite
});
• Promises aceitam uma função por parâmetro. Esta função será executada recebendo duas
novas funções em seus argumentos – uma para resolver a promise, outra para rejeitá-la. Caso
um erro aconteça dentro de uma promise, ela também será rejeitada.
• Tanto a função resolve quanto a reject podem ser executadas apenas uma vez dentro de uma
promise.
• Já o método then pode ser usado várias vezes para a mesma promise.
resolve(100);
});
4) Caso o método reject tivesse
pr2.then( (valor) => {console.log(valor); return 200;})
sido acionado dentro da
promise, o catch seria .then( (v) => console.log(v))
executado. .catch( (err) => console.log('erro!'));
Outros tipo
Tipo Promises 1) Geralmente usamos
Promise como retorno
de funções.
• Exemplo 2:
function abrirArquivo() : Promise<String>{
• all: retorna uma promise pendente que será resolvida quando todas as promises passadas por
parâmetro (array) forem resolvidas. Ela será rejeitada se qualquer uma das promises rejeitar.
• race: retorna uma promise pendente, mas ela será resolvida assim que qualquer uma das
promises enviadas seja resolvida, se uma delas falhar antes de qualquer uma ser resolvida,
então essa promise será rejeitada.
Módulos
Introdução
• Um módulo pode ser considerado como um arquivo que importa ou exporta código fonte;
• Cada módulo tem seu próprio contexto, ou seja, seus elementos são visíveis somente dentro
dele, a menos que os exportemos, assim outros módulos podem acessar esses elementos;
Instrução de exportação
class Carro{
Quando o módulo possui apenas um elemento, pode-se fazer uma exportação predefinida.
Assim o nome do elemento é informado somente na hora da importação.
2) Informamos o nome da
classe no momento da
importação.
Um módulo pode utilizar outros módulos para criar seus elementos. É comum também que esse
módulo exponha os elementos importados, isso deixa a implementação transparente e da a
impressão que existe somente um arquivo.
3) O script principal importou
1) Esse módulo importou o somente o módulo 2, e usa
tipo Veículo do módulo 1. sem saber uma classe que foi
declarada em módulo 1.
2) O Módulo 2 exportou os
elementos dele e do módulo 1.
Módulos 1) Tipo Regex não
recebe uma string
4) Finalmente,
let emailExamples = ["teste","teste@teste","teste@teste.com"]; podemos utilizar as
let urlExamples = ["ifmg", "ifmg.edu.br","www.formiga.ifmg.edu.br"]; classes
Exemplo de dicionários:
https://gist.github.com/OliverJAsh/2a538639e35db183b0cc16ca8ab520a7
https://www.typescriptlang.org/docs/home.html
https://www.tutorialspoint.com/typescript/index.htm
https://www.devmedia.com.br/curso/curso-de-typescript/422
Typescript Fundamentals
https://www.youtube.com/watch?v=bAPJ2
W6Fr4Q&list=PL6tu16kXT9Pp6XV3L3lrWide
BW6Mcwaa5 Typescript: o Javascript Moderno Para
Criação de Aplicações - Luís Abreu