Skip to content

Commit ae75e2d

Browse files
committed
Add Spanish translations for the playground
1 parent 68791d8 commit ae75e2d

File tree

7 files changed

+519
-0
lines changed

7 files changed

+519
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
//// { title: 'TypeScript con Deno', order: 3 }
2+
3+
// Deno es un entorno en tiempo de ejecución aún
4+
// incompleto para JavaScript y TypeScript basado en
5+
// v8 con un enfoque marcado en la seguridad.
6+
7+
// https://deno.land
8+
9+
// Deno cuenta con un sistema de permisos con base en el aislamiento,
10+
// lo cual reduce el acceso que tiene JavaScript al sistema de
11+
// archivos o a la red y utiliza importaciones basadas en http, las
12+
// cuales son descargadas y almacenadas localmente.
13+
14+
// Aquí hay un ejemplo del uso de deno para crear scripts:
15+
16+
import compose from "https://deno.land/x/denofun/lib/compose.ts";
17+
18+
function greet(name: string) {
19+
return `¡Hola, ${name}!`
20+
}
21+
22+
function makeLoud(x: string) {
23+
return x.toUpperCase();
24+
}
25+
26+
const greetLoudly = compose(
27+
makeLoud,
28+
greet
29+
);
30+
31+
// Dice "¡HOLA, MUNDO!."
32+
greetLoudly("mundo");
33+
34+
import concat from "https://deno.land/x/denofun/lib/concat.ts";
35+
36+
// Devuelve "holamundo"
37+
concat("hola", "mundo");
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
//// { title: 'TypeScript con Node', order: 3, isJavaScript: true }
2+
3+
// Node.js en un entorno de ejecución muy popular para JavaScript,
4+
// construido sobre v8, el motor de JavaScript que utiliza Chrome.
5+
// Puedes usarlo para construir servidores, interfaces de usuario y
6+
// cualquier otra cosa que se le parezca.
7+
8+
// https://nodejs.org/
9+
10+
// Node.js tiene con un conjunto de bibliotecas principales que
11+
// extienden el entorno de ejecución de JavaScript. Van desde el
12+
// manejo de rutas del sistema operativo:
13+
14+
import { join } from "path";
15+
const myPath = join("~", "downloads", "todo_list.json");
16+
17+
// hasta la manipulación de archivos:
18+
19+
import { readFileSync } from "fs";
20+
const todoListText = readFileSync(myPath, "utf8");
21+
22+
// Puedes añadir incrementalmente tipos a tus proyectos de JavaScript
23+
// usando tipos al estilo JSDoc. Haremos uno de los elementos de
24+
// nuestra lista de tareas pendientes (en inglés TODOs) basados en
25+
// la estructura JSON:
26+
27+
/**
28+
* @typedef {Object} TODO un elemento de TODO
29+
* @property {string} title El nombre a mostrar del elemento TODO
30+
* @property {string} body La descripción del elemento TODO
31+
* @property {boolean} done Si el elemento TODO ha sido o no completado
32+
*/
33+
34+
// Ahora asígnalo al valor de retorno de JSON.parse.
35+
// Para más información, dirígete a: example:jsdoc-support
36+
37+
/** @type {TODO[]} una lista de TODOs */
38+
const todoList = JSON.parse(todoListText);
39+
40+
// Y manejo de procesos:
41+
import { spawnSync } from "child_process";
42+
todoList
43+
.filter(todo => !todo.done)
44+
.forEach(todo => {
45+
// Usa el cliente ghi para crear una incidencia por cada
46+
// elemento de la lista que no se ha completado aún.
47+
48+
// Observa que se activa correctamente el autocompletamiento
49+
// y la documentación en JS cuando señalas debajo a 'todo.title'.
50+
spawnSync(`ghi open --message "${todo.title}\n${todo.body}"`);
51+
});
52+
53+
// TypeScript tiene definiciones de tipos actualizadas para todos
54+
// los módulos incorporados por defecto, mediante DefinitelyTyped;
55+
// lo que significa que puedes escribir programas de node con una
56+
// sólida cobertura de tipos.
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//// { title: 'TypeScript con la Web', order: 0, isJavaScript: true }
2+
3+
// El DOM (Document Object Model) es la API por detrás del
4+
// trabajo con una página web, y TypeScript tiene excelente
5+
// compatibilidad con esa API.
6+
7+
// Creemos un globo de ayuda (en inglés, popover) que se muestra cuando
8+
// se presiona "Ejecutar" en la barra de herramientas de arriba.
9+
10+
const popover = document.createElement("div");
11+
popover.id = "example-popover";
12+
13+
// Observa que el globo está correctamente anotado con el tipo
14+
// HTMLDivElement porque pasamos el elemento "div".
15+
16+
// Para hacer posible volver a ejecutar este código, primero
17+
// añadiremos una función para eliminar el globo si ya existía.
18+
19+
const removePopover = () => {
20+
const existingPopover = document.getElementById(popover.id);
21+
if (existingPopover && existingPopover.parentElement) {
22+
existingPopover.parentElement.removeChild(existingPopover);
23+
}
24+
};
25+
26+
// Y entonces llamarla inmediatamente.
27+
28+
removePopover();
29+
30+
// Podemos establecer los estilos en línea del elemento a través
31+
// de la propiedad .style en un HTMLElement: tiene todos los tipos
32+
// definidos
33+
34+
popover.style.backgroundColor = "#0078D4";
35+
popover.style.color = "white";
36+
popover.style.border = "1px solid black";
37+
popover.style.position = "fixed";
38+
popover.style.bottom = "10px";
39+
popover.style.right = "20px";
40+
popover.style.width = "200px";
41+
popover.style.height = "100px";
42+
popover.style.padding = "10px";
43+
44+
// Incluidos atributos CSS menos conocidos u obsoletos.
45+
popover.style.webkitBorderRadius = "4px";
46+
47+
// Para añadir contenido al globo, necesitaremos añadir
48+
// un elemento de párrafo y usarlo para añadir algún texto.
49+
50+
const message = document.createElement("p");
51+
message.textContent = "Here is an example popover";
52+
53+
// Y también añadiremos un botón de cerrar.
54+
55+
const closeButton = document.createElement("a");
56+
closeButton.textContent = "X";
57+
closeButton.style.position = "absolute";
58+
closeButton.style.top = "3px";
59+
closeButton.style.right = "8px";
60+
closeButton.style.color = "white";
61+
62+
closeButton.onclick = () => {
63+
removePopover()
64+
}
65+
66+
// Y entonces añadir todos estos elementos a la página.
67+
popover.appendChild(message);
68+
popover.appendChild(closeButton);
69+
document.body.appendChild(popover);
70+
71+
// Si ejecutas "Run" arriba, el popup debe aparecer
72+
// abajo a la izquierda, y lo puedes cerrar haciendo
73+
// click en la x en la parte superior derecha del popup.
74+
75+
// Este ejemplo muestra cómo puedes trabajar con la API
76+
// del DOM en JavaScript, pero usando TypeScript para
77+
// obtener mejores herramientas de asistencia.
78+
79+
// Hay un ejemplo extendido para las herramientas de TypeScript
80+
// con WebGL disponible aquí: example:typescript-with-webgl
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
//// { title: 'Encadenamiento de funciones', order: 2, compiler: { esModuleInterop: true } }
2+
3+
// Las APIs con funciones encadenadas son un patrón común en
4+
// JavaScript, lo que permite que tu código sea más conciso,
5+
// con menos valores intermedios y más fácil de leer debido
6+
// a sus habilidades de anidamiento.
7+
8+
// Una API muy común que funciona con encadenamiento
9+
// es jQuery. Aquí hay un ejemplo de jQuery
10+
// usada con tipos de DefinitelyTyped:
11+
12+
import $ from "jquery";
13+
14+
// Aquí hay un ejemplo de uso de la API de jQuery:
15+
16+
$("#navigation")
17+
.css("background", "red")
18+
.height(300)
19+
.fadeIn(200);
20+
21+
// Si añades un punto en la línea de arriba, verás
22+
// una larga lista de funciones. Este patrón es fácil
23+
// de reproducir en JavaScript. La clave es asegurarse
24+
// de que siempre retornes el mismo objeto.
25+
26+
// Aquí hay un ejemplo de API que crea una API con
27+
// encadenamiento. La clave es tener una función en
28+
// un nivel externo que mantenga información del estado
29+
// interno, y un objeto que exponga la API que se
30+
// devuelve siempre.
31+
32+
const addTwoNumbers = (start = 1) => {
33+
let n = start;
34+
35+
const api = {
36+
// Implement each function in your API
37+
add(inc: number = 1) {
38+
n += inc;
39+
return api;
40+
},
41+
42+
print() {
43+
console.log(n);
44+
return api;
45+
}
46+
};
47+
return api;
48+
};
49+
50+
// Lo que permite el mismo estilo de API que
51+
// vimos en jQuery:
52+
53+
addTwoNumbers(1)
54+
.add(3)
55+
.add()
56+
.print()
57+
.add(1);
58+
59+
// Aquí hay un ejemplo similar que usa una clase:
60+
61+
class AddNumbers {
62+
private n: number;
63+
64+
constructor(start = 0) {
65+
this.n = start;
66+
}
67+
68+
public add(inc = 1) {
69+
this.n = this.n + inc;
70+
return this;
71+
}
72+
73+
public print() {
74+
console.log(this.n);
75+
return this;
76+
}
77+
}
78+
79+
// Y aquí la vemos en acción:
80+
81+
new AddNumbers(2)
82+
.add(3)
83+
.add()
84+
.print()
85+
.add(1);
86+
87+
// Este ejemplo hace uso de la inferencia
88+
// de tipos de TypeScript como una forma
89+
// de proporcionar herramientas para patrones
90+
// de JavaScript.
91+
92+
// Para más ejemplos sobre esto:
93+
//
94+
// - example:code-flow
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//// { title: 'Funciones genéricas' }
2+
3+
// La genericidad proporciona una forma de utilizar tipos
4+
// como variables en otros tipos. Meta.
5+
6+
// Intentaremos mantener este ejemplo simple. Puedes hacer
7+
// muchas cosas con la genericidad y probablemente verás
8+
// en algún punto código muy complicado usando genericidad.
9+
// Pero eso no significa que la genericidad es complicada.
10+
11+
// Comenzaremos con un ejemplo donde envolvemos un objeto de
12+
// entrada en un arreglo. Solo nos importará una variable en
13+
// este caso, el tipo suministrado:
14+
15+
function wrapInArray<Type>(input: Type): Type[] {
16+
return [input];
17+
}
18+
19+
// Nota: es común ver el tipo Type como T. Esto es culturalmente
20+
// similar a como las personas usan i en un cliclo for para
21+
// representar index. T normalmente representa Type, por lo
22+
// que usaremos el nombre completo para mayor claridad.
23+
24+
// Nuestra función usará inferencia para siempre mantener
25+
// el tipo suministrado como entrada igual al suministrado
26+
// como salida (aunque será envuelto en un arreglo).
27+
28+
const stringArray = wrapInArray("hello generics");
29+
const numberArray = wrapInArray(123);
30+
31+
// Podemos verificar que funciona como se espera comprobando
32+
// si podemos asignar un arreglo de cadenas a una función
33+
// que debe ser un arreglo de objetos.
34+
const notStringArray: string[] = wrapInArray({});
35+
36+
// Además puedes saltarte la inferencia de tipos si añades
37+
// el tipo tú mismo:
38+
const stringArray2 = wrapInArray<string>("");
39+
40+
// wrapInArray permite que se use cualquier tipo, sin embargo
41+
// hay casos en que necesitas permitir solo un subconjunto de
42+
// tipos. En estos casos puedes decir que el tipo tiene que
43+
// extender un tipo en particular.
44+
45+
interface Drawable {
46+
draw: () => void;
47+
}
48+
49+
// Esta función toma un conjunto de objetos que tiene una función
50+
// para dibujar en la pantalla
51+
function renderToScreen<Type extends Drawable>(input: Type[]) {
52+
input.forEach(i => i.draw());
53+
}
54+
55+
const objectsWithDraw = [{ draw: () => { } }, { draw: () => { } }];
56+
renderToScreen(objectsWithDraw);
57+
58+
// Fallará si falta draw:
59+
60+
renderToScreen([{}, { draw: () => {} }]);
61+
62+
// La genericidad puede comenzar a parecer complicada cuando tienes
63+
// múltiples variables. Aquí hay un ejemplo de una función de caché
64+
// que te permite tener diferentes conjuntos de tipos de entrada y
65+
// de cachés.
66+
67+
interface CacheHost {
68+
save: (a: any) => void;
69+
}
70+
71+
function addObjectToCache<Type, Cache extends CacheHost>(obj: Type, cache: Cache): Cache {
72+
cache.save(obj);
73+
return cache;
74+
}
75+
76+
// Esto es lo mismo que lo anterior, pero con un parámetro extra.
77+
// Nota: Sin embargo para que esto funcione debimos usar any.
78+
// Esto puede solucionarse usando una interfaz genérica.
79+
80+
interface CacheHostGeneric<ContentType> {
81+
save: (a: ContentType) => void;
82+
}
83+
84+
// Ahora cuando se usa CacheHostGeneric, necesitas decirle
85+
// qué ContentType es.
86+
87+
function addTypedObjectToCache<Type, Cache extends CacheHostGeneric<Type>>(obj: Type, cache: Cache): Cache {
88+
cache.save(obj);
89+
return cache;
90+
}
91+
92+
// Eso escaló bastante rápido en términos de sintaxis. Sin
93+
// embargo provee más seguridad. Estas son decisiones que
94+
// ahora tienes más conocimiento para hacer. Al proporcionar
95+
// APIs para terceros, la genericidad ofrece una forma flexible
96+
// de permitir a otros utilizar sus propios tipos con total capacidad
97+
// de inferencia de código.
98+
99+
// Para más ejemplos de genericidad con clases e interfaces:
100+
//
101+
// example:advanced-classes
102+
// example:typescript-with-react
103+
// https://www.typescriptlang.org/docs/handbook/generics.html

0 commit comments

Comments
 (0)