https://code.visualstudio.com/docs/typescript/typescript-compiling
Mes: febrero 2021
Ejercicio interfaces TS
Declarar un interface llamado ‘Producto’ que incluya:
Nombre:string
Precio:number
oferta:boolean opcional
Crear un producto ‘botijo’ que valga 100€ y otro ‘gaita’, que valga 150€ y esté de oferta.
Crear una función precioConIva que tenga como parámetro un ‘Producto’, que devuelva un number y que lo que devuelva sea el precio del producto multiplicado por 1.21
interface Producto {
nombre:string,
precio:number,
oferta?:boolean
}
let botijo:Producto={nombre:'Botijo',precio:100}
let gaita:Producto={nombre:'Gaita',precio:150,oferta:true}
function precioConIva(p:Producto):number{
return p.precio*1.21
}
console.log(botijo.nombre,precioConIva(botijo))
Ejemplos Interfaces
https://code.tutsplus.com/tutorials/typescript-for-beginners-part-3-interfaces–cms-29439
https://desarrolloweb.com/articulos/definicion-interfaces-typescript.html
interface Alumno{
nombre:string,
readonly edad:number,
matriculado:boolean,
notas:number[],
dni?:string
}
interface AlumnoCorto{
nombre:string,
edad:number
}
let ana:Alumno={nombre:'Ana',
edad:23,
matriculado:true,
notas:[10,9,7]}
let eva:Alumno={nombre:'Eva',
edad:23,
notas:[10,9,7]} //Error en Eva porque falta una propiedad
let pep:Alumno={nombre:'Pep',
edad:23,
matriculado:true,
notas:[10,9,7],
dni:'1231312332'} //Error en dni porque en Alumno no existe esa propiedad
console.log(eva)
ana.nombre='Ana Pi'
ana.edad=90
function saludo(alum:Alumno):void{
console.log("Hola "+alum.nombre)
}
function recortarAlumno(al:Alumno):AlumnoCorto{
return {nombre:al.nombre,edad:al.edad}
}
saludo(ana)
console.log(ana)
Otro ejemplo:
interface Alumno{
nombre:string,
edad:number
}
let ana:Alumno={nombre:'Ana',edad:25}
let eva:Alumno={nombre:'Eva',edad:25}
let pep:Alumno={nombre:'Pep',edad:25}
let juan:Alumno={nombre:'Juan'} // Falla
interface Aula{
nombre:string,
alumnos:Alumno[]
}
let laboratorio:Aula={nombre:'Laboratorio',alumnos:[ana]}
let lectura:Aula={nombre:'Lectura',alumnos:[ana,eva,pep,juan]}
console.log(lectura)
Prueba TS
Declarar una variable como cadena y asignarle cadena y numero para ver si da error
Declarar una variable como array de cadenas y lo mismo, probar si se le pueden asignar otros valores o da error
Declarar una función triple(numero:number):number que nos devuelva el triple de un número y ver si funciona y que pasa si pasamos una cadena o asignamos el resultado a una variable de tipo string
https://www.typescriptlang.org/play
let cad:string;
cad='hola'
cad=5 //ERROR
let alumnos:string[]
let perros:Array<string> // Tipos genéricos, una característica de TS
perros=['carlino','Bulldog','Sin raza']
perros=[1,2,3] // ERROR
alumnos=['ana','eva','pep']
alumnos=[1,2,3] // ERROR
alumnos=['ana','eva',3] //Error en el 3
function triple(numero:number):number{
return numero*3
}
console.log(triple(5))
let edad:number
edad=triple(7)
cad=triple(9) //ERROR
let a: [number, string];
a=[3,'cadena']
a=['cadena',5] //ERROR
enum Animals {cat, lion, dog, cow, monkey}
let c: Animals = Animals.cat;
console.log(Animals[3]); // cow
console.log(Animals.monkey); // 4
Typescript
Funciones para practicar
1.- Crear una función triple que nos devuelva el triple de un número. Ej: triple(5)–>15 triple(0)–>0
2.- Crear una función nombreCompleto que pasándole un nombre y un apellido nos devuelva una cadena con nombre y apellido juntos separados por un espacio: nombreCompleto(‘ana’,’pi’)->’ana pi’
3.- Crear una función areaCirculo que le pasemos el radio de un círculo y nos devuelva el área, que es 2*3.1416*r*r ej: areaCirculo(1)–>6,2832
4.- Crear una función triplicar que le pasemos una cadena y nos la devuelva repetida tres veces: triplocar(‘hola’)->’holaholahola’
5.- Crear una función perímetro a la que le pasamos dos lados y nos devuelve el perímetro de un rectángulo, que es lado1*2+lado2*2 Ej: perimetro(2,3)–>10
6.- Crear una función que me devuelva el mayor elemento del array
7.- Función que nos sume las posiciones pares por un lado y las impares por otro. Nos devuelve un array con [pares,impares]
8.- Función que nos cuente las vocales de una cadena
9.- Función que nos cuente las consonantes
10.- Función que nos diga si un número es capicua
11.- Función que nos diga si una frase es capicua (deberíamos eliminar los espacios)
12.- Función que nos elimine espacios repetidos dentro de la cadena
13.- Función que dada una cadena nos ponga las vocales en minúsculas y las consonantes en mayúsculas
14.- Función que nos devuelva la tirada de dos dados en un array: [1,5]
15.- Función que nos cuenta las apariciones de una cadena dentro de otra
16.- Función que nos convierta de minutos a segundos
17.- Función que nos diga,dada una edad, cuantos días ha vivido esa persona (sin contar bisiestos)
18.- Función que dados dos números nos diga si tienen la misma paridad
19.- Función a la que le pasemos un array y un número y nos devuelva un array con los numeros menores que el número dado
20.- Función a la que le pasemos una cadena y una longitud y nos elimine las palabras que sean de mayor longitud que la dada.
// Función a la que le pasemos una cadena y una longitud y nos elimine las palabras que sean de mayor longitud que la dada.
// eliminarPorLongitud('hola que tal',3)-->'que tal'
// eliminarPorLongitud('hola que tal estamos',4)-->'hola que tal'
function eliminarPorLongitud (cadena, longitud) {
// recorrer las palabras y mirar su longitud
const palabras = cadena.split(' ')
let res = ''
for (let i = 0; i < palabras.length; i++) {
if (palabras[i].length <= longitud) {
res += palabras[i] + ' '
}
}
return res.trim()
}
function eliminarPorLongitud2 (cadena, longitud) {
// recorrer las palabras y mirar su longitud
const palabras = cadena.split(' ')
const res = []
for (let i = 0; i < palabras.length; i++) {
if (palabras[i].length <= longitud) {
res.push(palabras[i])
}
}
return res.join(' ')
}
Otro ejercicio de repaso
Una página que nos pida una cadena de números separados por comas, que tenga un select con ‘pares’ o ‘impares’ y un botón de calcular. Al darle al botón nos dirá el número de pares o de impares dependiendo de lo que nos hayan seleccionado.
<div id="contenedor" class="container"> <p>Números: <input type="text" id="inicial" placeholder="Introduzca Los números"></p> <!--<p>Incremento: <input type="number" id="incremento" placeholder="Introduzca el incremento"></p>--> <p> Seleccione opción: <select id="opcion"> <option value="0">Pares</option> <option value="1">Impares</option> </select></p> <button id="calcular" class="btn btn-success">Calcular</button> <p id="resultado"></p> </div>
document.getElementById('calcular').addEventListener('click', calcular)
function calcular () {
const cadena = document.getElementById('numeros').value
const opcion = document.getElementById('opcion').value
/*
if (opcion == '0') {
resultado = contarPares(cadena)
} else {
resultado = contarImpares(cadena)
}
*/
const resultado = contarNumeros(cadena, opcion)
document.getElementById('resultado').innerHTML = resultado
}
function contarNumeros (cadena, opcion) {
const numeros = cadena.split(',')
let cont = 0
for (let i = 0; i < numeros.length; i++) {
if (numeros[i] % 2 == opcion) {
cont++
}
}
return cont
}
function contarPares (cadena) {
const numeros = cadena.split(',')
let cont = 0
for (let i = 0; i < numeros.length; i++) {
if (numeros[i] % 2 == 0) {
cont++
}
}
return cont
}
function contarImpares (cadena) {
const numeros = cadena.split(',')
let cont = 0
for (let i = 0; i < numeros.length; i++) {
if (numeros[i] % 2 == 1) {
cont++
}
}
return cont
}
Repaso de conceptos
1.- Hacer el HTML y sin javascript
2.- Creo la función con sus parámetros y devuelvo algo para ver que va bien. Esta función es la que hará los cálculos y por lo tanto: No console.log (salvo para comprobar que funciona) NO alerts NO document.getElementById
Esta función recibe unos valores y devuelve un resultado.
3.- Enlazo el botón (click) a una función ¿Cömo? No con onclick, con addEventListener ¡Y compruebo que funcione!
4.- Recupero los valores. También comprobamos y ¡ojo! Si es una cadena, value nos basta pero si es un número: parseFloat(). Si hay más de un valor, yo primero compruebo uno y cuando lo tenga bien los otros los hago igual.
5.- Llamo a la función. Normalmente los valores que he recuperado con los parámetro de la función.
6.- Muestro el resultado.
En estos momentos ya tenemos el esquema/esqueleto de nuestra web. Sólo siguiendo los pasos.
<div id="contenedor" class="container"> <p>Número inicial: <input type="number" id="inicial" placeholder="Introduzca el número inicial"></p> <p>Incremento: <input type="number" id="incremento" placeholder="Introduzca el incremento"></p> <p>Número de términos: <input type="number" id="terminos" placeholder="Introduzca el número de términos"> </p> <button id="calcular" class="btn btn-success">Calcular</button> <p id="resultado"></p> </div>
document.getElementById('calcular').addEventListener('click', calcular)
function calcular () {
const inicial = parseFloat(document.getElementById('inicial').value)
const incremento = parseFloat(document.getElementById('incremento').value)
const terminos = parseFloat(document.getElementById('terminos').value)
const resultado = serie(inicial, incremento, terminos)
document.getElementById('resultado').innerHTML = resultado
}
function serie (inicial, incremento, terminos) {
// Aquí hay jaleo pero lo dejo para el final
console.log(inicial, incremento, terminos)
return 'Estamos trabajando en ello'
}
Después de tener el esquema tengo que hacer el algoritmo.
1.- Si tengo que devolver un resultado lo tendré que inicializar y luego un return
2.- Pienso como lo haría yo. Y lo intento implementar.
3.- En este caso yo sé que lo tengo hacer tantas veces como terminos-> for
4.- Yo tengo un valor inicial al que le voy sumando el incremento: let numero=inicial; for(){numero+=incremento}
function serie (inicial, incremento, terminos) {
// Aquí tengo que ir calculando los elementos de una serie
// Y luego devolverlos todos juntos
// Empiezo con el número inicial y le voy sumando el incremento
// Tantas veces como terminos
// Si yo empiezo por 1, el incremento es 3, y me piden 4 términos
// Empiezo por el 1. Le sumo 3: 1+3-->4
// Le sumo 3: 4+3-->7
// Le sumo 3: 7+3-->10
let resultado = ''
let numero = inicial
for (let i = 0; i < terminos; i++) {
resultado += numero + ', '
numero += incremento
}
return resultado.slice(0, -2)
}
Cambio la función calcular para que compruebe si son números:
function calcular () {
const inicial = parseFloat(document.getElementById('inicial').value)
const incremento = parseFloat(document.getElementById('incremento').value)
const terminos = parseFloat(document.getElementById('terminos').value)
if (isNaN(inicial) || isNaN(incremento) || isNaN(terminos)) {
document.getElementById('resultado').innerHTML = 'Algún número está mal'
} else {
const resultado = serie(inicial, incremento, terminos)
document.getElementById('resultado').innerHTML = resultado
}
}
Solución tarea
<div id="contenedor" class="container "> <p>Número inicial: <input type="number" id="inicial" placeholder="Introduzca el número inicial"></p> <p></p>Incremento: <input type="number" id="incremento" placeholder="Introduzca el incremento"></p> <p></p>Número de términos: <input type="number" id="terminos" placeholder="Introduzca el número de términos"> </p> <button id="calcular" class="btn btn-success">Calcular</button> <p id="resultado"></p> </div>
document.getElementById('calcular').addEventListener('click', calcular)
function calcular () {
const inicial = parseFloat(document.getElementById('inicial').value)
const incremento = parseFloat(document.getElementById('incremento').value)
const terminos = parseFloat(document.getElementById('terminos').value)
if (!isNaN(inicial) && !isNaN(incremento) && !isNaN(terminos)) {
const serie = calcularSerie(inicial, incremento, terminos)
document.getElementById('resultado').innerHTML = serie
} else {
document.getElementById('resultado').innerHTML = 'Algún número es incorrecto'
}
}
function calcularSerie (inicial, incremento, terminos) {
let res = ''
for (let i = 0; i < terminos; i++) {
res += (inicial + incremento * i) + ', '
}
return res.slice(0, -2)
}
Ejercicio 2
Tengo una web en la que me pueden introducir una cadena.
Esa cadena es una referencia de un producto. Las referencias son de tres tipos: ‘RX’+numero es un producto de servicios. ‘TW’+numero es un producto de grifería ‘PS’ + número es un producto de sanitarios.
Yo quiero que al pulsar un botón me salga la información siguiente: Tipo de producto + número
Ejemplos.
‘TW456’ – > Grifería número 456
‘RX123123’ – > Servicios número 123123
‘EE123123’ -> Producto desconocido