JavaScript
Es un estándar (ECMAScript), por lo que cada engine puede expandirlo.
-
TypeScript
Creado por Microsoft añade que se tengan que especificar el tipo de dato.
TypeScript usa la extensión ".ts"
Al estar pensado para scripting, sigue el mismo esquema que BASH; solo ejecuta funciones si son llamadas directamente, el resto lo procesa todo en tiempo de ejecución.
Deno
Instalar Deno Engine
curl -fsSL https://deno.land/install.sh | sh
Ejecutar un archivo
deno run [archivo].ts
- "--allow-net" para permitir que el archivo use red
- "--config" para especificar otro archivo de configuración deno.json ó deno.jsonc
Vendor - Dependencias en local
deno cache [archivo].ts
Archivos de proyecto
-
deno.json ó deno.jsonc
Contiene las dependencias y configuración del proyecto para el compilador, formateador y enlazador.
Si contiene "tasks" permite acortar comandos largos en una simple tarea. Las tareas se corren con; "deno task [name]"
Si contiene "fmt" permite personalizar como va a formatear si se corre un "deno fmt".
Si contiene el tuple "exclude" se puede indicar que directorios no se quiere incluir por parte de la ejecución de Deno.
{
"compilerOptions": {
"allowJs": true,
"lib": ["deno.window"],
"strict": true
},
"lint": {
"include": ["src/"],
"exclude": ["src/testdata/", "src/fixtures/**/*.ts"],
"rules": {
"tags": ["recommended"],
"include": ["ban-untagged-todo"],
"exclude": ["no-unused-vars"]
}
},
"fmt": {
"useTabs": true,
"lineWidth": 80,
"indentWidth": 4,
"semiColons": false,
"singleQuote": true,
"proseWrap": "preserve",
"include": ["src/"],
"exclude": ["src/testdata/", "src/fixtures/**/*.ts"]
},
"lock": false,
"nodeModulesDir": true,
"unstable": ["webgpu"],
"npmRegistry": "https://mycompany.net/artifactory/api/npm/virtual-npm",
"test": {
"include": ["src/"],
"exclude": ["src/testdata/", "src/fixtures/**/*.ts"]
},
"tasks": {
"start": "deno run --allow-read main.ts"
},
"imports": {
"oak": "jsr:@oak/oak"
},
"exclude": [
"dist/"
]
}
TypeScript - JavaScript
Comentarios
// Esto es un comentario
Importar
Deno soporta tanto NPM como JSR.
Consideración; la función debe estar dentro de "{}" cuando el módulo no tiene un "export default function ....."
Las funciones que no necesitar las "{}" en el import son las que tienen en su módulo un el default.
- De otros archivos
import [Struct],[function_N] from "./[archivo].ts";
- De la stdlib
import [Function] from "[package_registry]:@std/[module]"
Importar desde JSR
import [Function] as mod from "jsr:@[user_or_organization]/[module]"
Importar desde NPM
import [Function] from "npm:[module]@[version]"
Variables y constantes
-
Variable
Alcance local en una función
var [var_name]: [var_type_if_is_Typescript] = [value]
-
Constante
Alcance global cuando son variables declaradas fuera de una función pero con alcance de bloque. Funciones incluidas.
Solo pueden ser declaradas una vez dentro de su alcance.
{
const [var_name]: [var_type_if_is_Typescript] = [value]
}
Las constantes no pueden actualizarse a futuro (por que hace un shadowing en realidad, que es una redeclaración a bajo nivel).
-
let
Al igual que en Rust, sirven para declarar variables. Y al igual que en "const" tiene alcance de bloque pero pueden actualizarse a posteriori.
{
let [var_name]: [var_type_if_is_Typescript] = [value]
}
Structuras
interface [struct_name] {
[var_name1]: [type];
[var_name2]: [type];
}
const [instance_name]: [struct_name] = {
[var_name1]: [value],
[var_name2]: [value],
}
Tipos
let var1 = 5;
let var2 = 12.1;
let var3 = 'string1';
let var4 = "string2";
let var5 = true;
let var6 = false;
let var7 = 'c';
Se puede formatear un retorno de string sin guardar previamente en una variable;
return 'Hello, ${[var_or_struct]}';
Funciones
function [func_name]([var_name]: [type]): [return_type]{
[operations];
return [return_value];
}
Si a la función se le añade "export function ...." entonces se vuelve pública y puede ser llamada desde otros archivos.
Equivalente al "pub" en Rust.
Si a la función le añadis "async" la volves eso; asíncrona, luego la variable que va a contener el retorno debe tener un "await" antes de su llamado.
Condicionales
- Para booleanos es un triple = para verificar valores
- Para el resto de tipos de datos son dobles = solamente
If - else if - else
if (var1 > var2) {
console.log("el valor de var2 es mayor que var1." + '\n' + "Var2;" + var2 + '\n' + "Var1;" + var1);
} else if (var1 > var2) {
console.log("el valor de var2 es menor que var1." + '\n' + "Var2;" + var2 + '\n' + "Var1;" + var1);
} else if (var1 == 0 || var2 >=12) {
console.log("var1 es cero ó var2 es mayor o igual a 12" + '\n' + "Var2;" + var2 + '\n' + "Var1;" + var1);
} else if ( var1 != var2 ) {
console.log("var1 no es igual a var2");
} else {
console.log("sin valores de coincidencia");
}
Switch
switch (var1) {
case 0:
case 1:
console.log("el valor de var1 es 0 ó 1");
break;
case 5:
console.log("el valor de var1 es 5");
break;
default:
console.log("sin valores de coincidencia");
break;
}
While
while (var5 === true) {
console.log("var 5 es verdadero");
}
/// Loop infinito
while (true){
console.log("loop infinito");
}
/// Loop combinado
let temporal1 = 0;
while (var5 === true && temporal1 <= 5){
console.log("loop finito");
temporal1 += 1;
}
For
Es igual que en C: inicio; condicion; modificacion final Al igual que con los if/else, pueden combinarse unos dentro de otros
for (let i = 0; i <= 15; i++){
console.log("i = " + i + ".");
}
/// Breaks combinados
/// Cuando en un bucle se usa el break se asegura que el resto no se procesa y que se
/// termina el ciclo
for (let j = 0; j <= 15; j++){
// Acá el if hace que no se impriman los mayores a 10
if ( j > 10) {
break;
}
console.log("j = " + j + ".");
}
/// El continue en cambio, hace que el ciclo se termine y se inicie el nuevo
for (let e = 0; e <= 15; e++){
// Acá el if hace que solamente se impriman los mayores a 10
if ( e < 10) {
continue;
}
console.log("e = " + e + ".");
}
Arrays
El estándar de javascript lo toma como una sucesion finita de chars con eso se puede hacer uso de cada uno de sus componentes/chars.
Se cuenta desde cero, por que va por posiciones
let string1 = "Cadena de texto 1";
/// imprimirá "C"
console.log("caracter cero; " + string1[0]);
/// también se puede contar desde atrás
/// imprimirá "!"
/// el método "length" devuelve el largo de la cadena
console.log("ultimo caracter; " + string1[ string1.length -1 ]);
/// Si se utiliza un array que está en una posición inválida se obtiene un error de tipo
/// "undefined"
console.log("caracter fuera de rango; " + string1[99999]);
/// Así mismo los valores pueden ser asignados a otras variables
/// La primera toma el primer caracter
/// La segunda toma el rango desde cero hasta la posicion numero 5
let varbuffer = string1[0];
let varbuffer2 = string1[0,5];
console.log("Buffer1 es;" + varbuffer + '\n' + "Buffer2 es;" + varbuffer2);
Tests - Pruebas
Esto lo ofrece el motor Deno
import { assertEquals } from "jsr:@std/assert";
import Person, { sayHello } from "./person.ts";
Deno.test("sayHello function", () => {
const grace: Person = {
lastName: "Hopper",
firstName: "Grace",
};
assertEquals("Hello, Grace!", sayHello(grace));
});
Luego se ejecuta ese testeo con;
deno test [archivo].ts
Funciones comunes
- Imprimir en pantalla
console.log([function_or_variable])
// show variable type
console.log("constante1 es del tipo; " + typeof constante1);
- Llamado asíncrono
await [function][func_parameters];
Al ser guardado en una variable, si se imprime en pantalla también necesita un "await").
- Request web (asíncrono)
fetch("[URL]");
- Tipo de dato
typeof [var]
- Obtener el largo de una cadena
[string_variable].length
- Ejecutar proceso hijo
new Deno.command("[path]/[binario]", [args], [opciones])
Algunas de las opciones son; - stdin: "piped", - stdout: "piped",