Skip to content

Commit cbca0f6

Browse files
committed
Typescript Course
1 parent 79460de commit cbca0f6

17 files changed

+874
-0
lines changed

README.md

Lines changed: 357 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,357 @@
1+
# Curso base de Typescript
2+
3+
* [Comandos básicos](#comando-básicos)
4+
* [Variables Let y Const](#variables-let-y-const)
5+
* [Tipos de variables](#tipos-de-variables)
6+
* [Exclusión de archivos a traducir](#exclusión-de-archivos-a-traducir)
7+
* [Template literales del ES6](#template-literales-del-es6)
8+
* [Funciones: Parámetros opcionales, obligatorios y por defecto](#funciones-parámetros-opcionales-obligatorios-y-por-defecto)
9+
* [Funciones de flecha](#funciones-de-flecha)
10+
* [Desestructuración de objetos y arreglos](#desestructuración-de-objetos-y-arreglos)
11+
* [Promesas](#promesas)
12+
* [Interfaces de Typescript](#interfaces-de-typescript)
13+
* [Clases](#clases)
14+
* [Importación y exportación de módulos](#importación-y-exportación-de-módulos)
15+
* [Decoradores de Clases](#decoradores-de-Clases)
16+
17+
18+
19+
### Comando básicos
20+
* **`tsc app.ts`:** Genera un JS de archivo TS marcado
21+
* **`tsc --init`:** Permite generar un archivo de tipo `tsconfig.json`
22+
* **`tsc -w`:** Permite poner en escucha un proyecto de forma que cualquier cambio realizado en el TS sea inmediatamente agregado al JS
23+
24+
### Variables Let y Const
25+
* **let:** Permite la declaración de variables valoradas en un scope determinado.
26+
* **const:** Permite declarar una constante la cual como su nombre lo indica su valor siempre sera el mismo.
27+
28+
> Aunque es valido usar`var` existe la posibilidad de re-declarar la variable dentro del mismo scope, por ello al usar `let` nos evitamos este inconveniente ya que esta función agregada del TS nos permitirá poder reescribir la misma variable en distintos scope sin re-declarar alguna de ellas.
29+
30+
### Tipos de variables
31+
* **string:** Tipo de datos que permite una cadena de caracteres.
32+
* **number:** Tipo de dato que permite números.
33+
* **boolean:** Tipo de dato que permite `true` o `false`.
34+
* **Date:** Tipo de dato que genera fechas.
35+
36+
Puedes asignar más de un tipo de variable a un `Let`.
37+
```js
38+
let cualquierCosa : string | number | Date;
39+
```
40+
Con esta sintaxis puedes asignar tipos de datos *string, number o Date* a la variable *cualquierCosa*.
41+
42+
En typescript al declarar un objeto con múltiples variables y asignarles valores, por defecto el lenguaje le asignará el tipo de valor, por ejemplo si tenemos
43+
```js
44+
let spiderMan = {
45+
nombre: 'Peter',
46+
edad : 30
47+
};
48+
```
49+
Y deseamos volver reasignar nuevamente valores, es requerido que se asigne el valor y el mismo tipo en cada variable, en caso contrario el lenguaje automáticamente te lo marcará como un error dando como resultado.
50+
51+
<img src="images/var-object.png" width="500px;"/>
52+
53+
### Exclusión de archivos a traducir
54+
Al momento de traducir, tenemos la capacidad de obviar archivos y/o directorios, para ello basta con dirigirnos al archivo `tsconfig.json`, agregar el arreglo `exclude` con todos los archivos y/o directorios a excluir
55+
```json
56+
{
57+
//En este caso estaría excluyendo el directorio de nombre "notas"
58+
"exclude": ["notas"],
59+
"compilerOptions": {}
60+
}
61+
```
62+
> Este tipo de exclusiones son comúnes en archivos de respaldo los cuales por razones de espacio uno prefiere no traducirlos
63+
64+
### Template literales del ES6
65+
Los `templates literales` son herramientas del ES6 que nos permitirán construir Strings de manera más practica y sencilla, bastará con colocar los backtips `` seguido del símbolo $ más una llave donde colocaremos la variable/función/operación a leer
66+
67+
```js
68+
const nombre = 'Fernando';
69+
const apellido = 'Antúnez';
70+
const edad = 28;
71+
72+
// Desde JS si deseamos colocar una salida del tipo "Mi nombre es Fernando Antúnez (28)
73+
const salida = 'Mi nombre es ' + nombre + ' ' + apellido + ' (' + edad + ')';
74+
75+
//Usado templates literales bastaría con
76+
const salida = `Mi nombre es ${nombre} ${apellido} ( ${edad} )`;
77+
```
78+
79+
> Usando templates literales podremos llamar funciones y realizar cualquier tipo de operaciones de manera más eficiente
80+
81+
### Funciones parámetros opcionales, obligatorios y por defecto
82+
83+
Al momento de crear una función podemos colocar 3 tipos de parámetros según la necesidad del momento.
84+
85+
* **Parámetros obligatorio**: Son parámetros necesarios que recibe la función los cuales no se pueden obviar.
86+
```js
87+
//Mostrará la "La casa de Fernando."
88+
function activar ( quien : string, ){
89+
console.log(`La casa de ${quien}.`);
90+
}
91+
activar('Fernando');
92+
```
93+
94+
* **Parámetros opcional**: Como su nombre lo indica, la variable puede o no ser mandadá, basta con asignar `?:` al parámetro que deseamos que sea opcional.
95+
```js
96+
function activar ( quien ?: string, ) {
97+
if (quien) {
98+
console.log(`La casa de ${quien}.`);
99+
} else {
100+
console.log('La casa de Juan');
101+
}
102+
}
103+
activar('Fernando');
104+
```
105+
106+
* **Parámetros por defecto**: En este tipo de parámetro la variable ya tiene un valor asignado el cual puede ser modificado al momento de llamarse.
107+
```js
108+
function activar ( quien : string = 'Juan', ){
109+
console.log(`La casa de ${quien}.`);
110+
}
111+
// En caso de mandar a llamar sin valor tomaría el que tiene asignado
112+
activar();
113+
114+
// En caso de mandar a llamar con valor tomará el que se le coloque
115+
activar('Fernando');
116+
```
117+
118+
> La manera o el orden correcto para colocar los parámetros serian
119+
> 1) Parámetros obligatorios
120+
> 2) Parámetros Opcionales
121+
> 3) Parámetros por Defectos.
122+
123+
### Funciones de flecha
124+
Es una sintaxis abreviada que nos permitirá simplificar el ámbito de la función, un buen ejemplo sería al momento que una función solo tiene una linea de código
125+
126+
```js
127+
// Sin usar función flecha retornar a sería
128+
const miFuncion = function (a: string) {
129+
return a;
130+
}
131+
132+
// Usando función flecha nos quedaría
133+
const miFuncionF = (a: string) => a;
134+
```
135+
136+
Otra ventaja de las funciones de flechas es al utilizar objetos y dentro de los mismos una función, en estos casos si buscamos hacer referencia a un parámetro externo con `this`, se nos puede llegar a imposibilitar según el código que coloquemos
137+
138+
```js
139+
140+
/*
141+
El this en este código nos marcaría un error ya que
142+
no reconoce el parámetro 'nombre' debido a que esta
143+
haciendo referencia a la función anónima auto invocada
144+
desde el método "setTimeout"
145+
*/
146+
const hulk = {
147+
nombre: 'Hulk',
148+
smash() {
149+
setTimeout( function () {
150+
console.log(`${this.nombre} Smash!!!`);
151+
}, 1000);
152+
}
153+
}
154+
155+
/*
156+
El this en este código funcionaria ya que reconoce el
157+
parámetro 'nombre' debido a que esta usando función de
158+
flecha y las mismas no modifican a lo que apunta 'this'
159+
*/
160+
const hulk = {
161+
nombre: 'Hulk',
162+
smash() {
163+
setTimeout(() => {
164+
console.log(`${this.nombre} Smash!!!`);
165+
}, 1000);
166+
}
167+
}
168+
```
169+
170+
### Desestructuración de objetos y arreglos
171+
Al momento de tener un objeto o arreglo solemos usar
172+
```js
173+
// Objeto y llamada común de cada parte
174+
const aveanger = {
175+
nombre: 'Steve',
176+
clave: 'Capitan América',
177+
poder: 'Droga'
178+
};
179+
180+
console.log(aveanger.nombre);
181+
console.log(aveanger.clave);
182+
console.log(aveanger.poder);
183+
184+
//Arreglo y llamada común de cada posición
185+
186+
const aveangers : string[] = ['Thor','Ironman','Spiderman'];
187+
188+
console.log(aveangers[0]);
189+
console.log(aveangers[1]);
190+
console.log(aveangers[2]);
191+
192+
```
193+
Pero si deseas desestructurar dicho objeto y/o arreglo en ES6 podemos usar
194+
```js
195+
const aveangers : string[] = ['Thor','Ironman','Spiderman'];
196+
const aveanger = {
197+
nombre: 'Steve',
198+
clave: 'Capitan América',
199+
poder: 'Droga'
200+
}
201+
202+
const extraer = ( {nombre, poder} : any) => {
203+
console.log(nombre);
204+
console.log(poder);
205+
}
206+
extraer(aveanger);
207+
208+
/*
209+
El espacio en los arreglos da a entender que debe
210+
ignorar las posiciones indicadas, en este caso
211+
tomará la tercera posición del arreglo bajo el nombre
212+
de arana y el console.log(arana) mostrara "Spiderman"
213+
*/
214+
const [,, arana] = aveangers;
215+
216+
//Imitando lo realizado con los objetos
217+
const extraerArr = ( [,, arana] : string[]) => {
218+
console.log(arana);
219+
}
220+
extraerArr(aveangers);
221+
```
222+
223+
### Promesas
224+
Las `promesas` representan un resultado eventual de una operación asíncrona, es decir, permitirá ejecutar más de 1 bloque de código al mismo tiempo.
225+
Al momento de usar las promesas se requerirán dos funciones:
226+
* **`resolve`:** Se retorna cuando la promesa fue realizada de manera exitosa
227+
* **`reject`:** Se retorna cuando ocurre algún error
228+
229+
```js
230+
const retirarDinero= (montoRetirar : number) =>{
231+
let dineroActual = 1000;
232+
return new Promise( (resolve, reject) => {
233+
if(montoRetirar > dineroActual){
234+
reject('No hay suficiente fondos');
235+
}else{
236+
dineroActual -= montoRetirar;
237+
resolve(dineroActual);
238+
}
239+
} );
240+
}
241+
```
242+
243+
Las promesas son bastante utilizadas al realizar peticiones web, conexiones a BD, etc, las mismas recibirán 2 métodos principales
244+
245+
* **`then`:** Método callback que devuelve la resolución de la promesa
246+
* **`catch`:** Método callback que devuelve el rechazo/falla de la promesa
247+
248+
```js
249+
retirarDinero(1500).then((res)=>{
250+
console.log(`Me quedan ${res}`);
251+
}).catch((err)=>{
252+
console.warn(err);
253+
});
254+
```
255+
En caso de desear definir el tipo de retorno de la promesa bastaría bastaría con colocar después de los argumentos de la función `Promise<Tipo>`, si el dato recibido es del mismo tipo colocado la promesa retornará de manera correcta con el `resolve`, en caso contrario entrará en `reject`
256+
257+
```js
258+
const tipearPromise = ():Promise<number> =>{
259+
return new Promise((resolve, reject)=>{
260+
resolve(50);
261+
reject('No retorno un número');
262+
});
263+
}
264+
```
265+
266+
### Interfaces de Typescript
267+
Las `interfaces` son maneras para establecer reglas que permitan que tanto nosotros como otros compañeros que usen el código deban seguir para utilizarla
268+
269+
```js
270+
interface xMen {
271+
nombre : string,
272+
edad : number,
273+
poder ?: string
274+
};
275+
276+
const enviarMision = (xmen : xMen) =>{
277+
console.log(`Enviando a ${xmen.nombre} a la misión`);
278+
};
279+
280+
const wolverine : xMen = {
281+
nombre : 'Logan',
282+
edad : 60
283+
};
284+
285+
const ciclope : xMen = {
286+
nombre : 'Scott',
287+
edad : 60,
288+
poder : 'Explosión visual'
289+
};
290+
291+
enviarMision(wolverine);
292+
```
293+
294+
### Clases
295+
Una `clase` es un conjunto de métodos y variables que permite definir instancias con sus mismas características, es una buena practica inicializar las clases en mayúsculas de forma capitalizada
296+
```js
297+
class AvengerDeInfinityWar{
298+
nombre: string = '';
299+
equipo: string = '';
300+
}
301+
302+
// Inicializando una clase
303+
const antMan = new AvengerDeInfinityWar();
304+
```
305+
Un `consutructor` de una clase es el método que se ejecuta cuando creamos un objeto de dicha clase, en el constructor podremos colocar parámetros requeridos, opcionales o por defecto
306+
307+
```js
308+
class AvengerDeInfinityWar {
309+
constructor(
310+
public nombre: string,
311+
public equipo: string,
312+
public nombreReal?: string,
313+
public puedePelear?: boolean,
314+
public peleasGanadas: number = 1){}
315+
}
316+
317+
const antMan = new AvengerDeInfinityWar('Antman','Capi');
318+
console.log(antMan);
319+
```
320+
>La respuesta obtenida de hacer un console.log a antMan sería
321+
>
322+
><img src="images/claseAvenger.png" width="auto;"/>
323+
324+
### Importación y exportación de módulos
325+
Para importar clases de archivos distintos es necesario colocar `export` previo a la clase que deseamos usar en otros archivos, esto permitirá que dicha clase pueda ser usada en otros archivos a través de `ìmport { } from '' `, donde dentro de la desestructuración `{}` colocaremos el nombre de la clase y en `from` la ruta donde se ubica
326+
327+
```js
328+
// Archivo ubicado en la carpeta 'classes/xmen.class.ts'
329+
export class Xmen {
330+
constructor(
331+
public nombre: string,
332+
public clave: string
333+
){}
334+
}
335+
336+
// Archivo ubicado en la carpeta 'src/index.ts'
337+
import { Xmen } from './classes/xmen.class'
338+
const wolverine = new Xmen('Logan','Wolverine');
339+
console.log(wolverine);
340+
```
341+
342+
### Decoradores de Clases
343+
Un `decorador` es una función que expande la clase añadiéndole funcionalidades y características propias. Los decoradores los reconocemos ya que se colocan antes de la clase `@decorador`
344+
```js
345+
function imrpimirConsola ( constr: Function ){
346+
console.log(constr);
347+
}
348+
349+
@imrpimirConsola
350+
export class Xmen {
351+
constructor(
352+
public nombre: string,
353+
public clave: string
354+
){}
355+
}
356+
```
357+
>Los decoradores se diferencia de los `extends` en que estos no expanden la clase sino que añaden funcionalidad.

0 commit comments

Comments
 (0)