JavaScript vs TypeScript: ¡El choque de titanes que desencadena una guerra de tipos!

Pablo Contreras
9 min readMay 30, 2023

--

¡Bienvenidos a la lucha del siglo! En esta esquina, con una base de fanáticos global y una flexibilidad de tipados digna de un contorsionista de circo, ¡tenemos a JavaScript! Y en la otra esquina, con una seguridad de tipados comparable a un cinturón negro en artes marciales, ¡está TypeScript! ¿Estás listo para sumergirte en el ring y descubrir qué lenguaje de programación te ayudará a noquear tus próximos proyectos? ¡Sigue leyendo para descubrir el campeón en esta batalla épica entre JavaScript y TypeScript!

¡Empecemos!

JavaScript

Ventajas:

  1. Facilidad de uso: JavaScript es más fácil de usar para los principiantes porque no tiene que preocuparse por los tipos de datos estrictos y puede ser ejecutado directamente en cualquier navegador web sin la necesidad de transpilación.
  2. Adopción universal: JavaScript tiene una adopción más amplia y es compatible con todas las plataformas y navegadores. TypeScript, por otro lado, debe ser transpilado a JavaScript antes de que pueda ser ejecutado en un navegador.
  3. Curva de aprendizaje más baja: JavaScript tiene una curva de aprendizaje más baja en comparación con TypeScript, que añade una capa adicional de complejidad con su sistema de tipos.
  4. Menor tiempo de desarrollo: Como JavaScript no requiere la definición de tipos, puede ser más rápido para el desarrollo, especialmente para aplicaciones más pequeñas o prototipos rápidos.

Desventajas:

  1. Ausencia de verificación de tipos en tiempo de compilación: A diferencia de TypeScript, JavaScript es un lenguaje de tipado dinámico. Esto significa que no hay verificación de tipos durante la compilación, lo que puede llevar a errores que son difíciles de detectar y solucionar.
  2. Escalabilidad: Aunque JavaScript puede ser eficaz para aplicaciones pequeñas, puede ser difícil de manejar en aplicaciones más grandes y complejas. TypeScript, con su sistema de tipado estático y sus características adicionales de orientación a objetos, puede hacer que sea más fácil trabajar en proyectos a gran escala.
  3. Menos herramientas de desarrollo: Aunque la mayoría de los editores modernos proporcionan un buen soporte para JavaScript, TypeScript tiende a proporcionar un mejor autocompletado, navegación de código y refactoring, gracias a su sistema de tipos.

TypeScript

Ventajas:

  1. Seguridad de tipos: La característica más importante que TypeScript aporta a JavaScript es la seguridad de tipos. Esto puede ayudar a prevenir muchos errores comunes de programación al detectar problemas potenciales durante la fase de desarrollo en lugar de en tiempo de ejecución.
  2. Funcionalidades orientadas a objetos: TypeScript tiene características adicionales de orientación a objetos, como interfaces y modificadores de acceso, que pueden hacer que sea más fácil trabajar en grandes bases de código.
  3. Mejores herramientas de desarrollo: TypeScript puede proporcionar un mejor autocompletado, navegación de código y refactoring en la mayoría de los editores de código modernos.

Desventajas:

  1. Complejidad adicional: TypeScript añade una capa de complejidad a JavaScript. Esto puede hacer que sea más difícil de aprender y usar para los nuevos desarrolladores.
  2. Tiempo de desarrollo: TypeScript puede requerir más tiempo para el desarrollo debido a la necesidad de definir y verificar los tipos.
  3. Necesidad de transpilación: TypeScript no se ejecuta directamente en los navegadores. Necesita ser transpilado a JavaScript, lo que puede requerir herramientas adicionales y aumentar el tiempo de desarrollo.

Ahora vamos con ¿Que es mejor entonces JavaScript o Typescript? Y la respuesta que mas molesta aplica en este caso “depende”.

Vamos a cuando es mejor cada uno:

¿Cuándo usar JavaScript?

  1. Proyectos pequeños y rápidos: JavaScript es una excelente opción si necesitas crear un prototipo rápidamente o si estás trabajando en un proyecto pequeño donde el tiempo de desarrollo es más crítico que la robustez del código. Su naturaleza de tipado dinámico permite un desarrollo más rápido y flexible.
  2. Desarrollo de scripts del lado del cliente: Dado que JavaScript es el lenguaje predeterminado en la mayoría de los navegadores, es la opción ideal para agregar interactividad a las páginas web y desarrollar scripts del lado del cliente.
  3. Cuando trabajas con tecnologías basadas en JavaScript: Si estás trabajando con tecnologías como Node.js para el desarrollo del lado del servidor, o bibliotecas y frameworks como React, Vue o Express, que están escritos en JavaScript, puede ser más conveniente seguir utilizando JavaScript.

¿Cuándo usar TypeScript?

  1. Proyectos grandes y complejos: TypeScript es una elección fantástica si estás trabajando en un proyecto grande y complejo. El sistema de tipos de TypeScript hace que el código sea más fácil de leer y entender, lo que es esencial en proyectos a gran escala.
  2. Proyectos que necesitan un mantenimiento a largo plazo: TypeScript es más adecuado para proyectos que se mantendrán y desarrollarán a lo largo del tiempo. La comprobación de tipos de TypeScript puede prevenir muchos errores antes de que sucedan y hacer que el código sea más predecible y fácil de depurar.
  3. Desarrollo en equipo: TypeScript es muy útil cuando se trabaja en equipo. Gracias a la definición precisa de la estructura de los objetos y a la seguridad del tipado, cada miembro del equipo puede entender mejor el código de los demás. Esto también ayuda a prevenir errores, ya que el código se verifica en tiempo de compilación, no en tiempo de ejecución.
  4. Si usas Angular: Angular, uno de los frameworks más populares para la creación de aplicaciones de una sola página (SPA), está escrito en TypeScript. Por lo tanto, si planeas usar Angular, aprender TypeScript es definitivamente una buena idea.

Ejemplos de código:

Ejemplos Básicos

1. Variables

// JavaScript
let name = "Juan";
let age = 25;
// TypeScript
let name: string = "Juan";
let age: number = 25;

En JavaScript, no necesitas especificar el tipo de dato de la variable. Pero en TypeScript, puedes (y a menudo debes) hacerlo para aprovechar las ventajas de la comprobación de tipos.

2. Funciones

// JavaScript
function greet(name) {
return "Hola " + name;
}
// TypeScript
function greet(name: string): string {
return "Hola " + name;
}

En TypeScript, puedes especificar el tipo de dato de los parámetros de la función y el valor de retorno.

3. Objetos

// JavaScript
let student = {
name: "Juan",
age: 25
};
// TypeScript
let student: { name: string, age: number } = {
name: "Juan",
age: 25
};

En TypeScript, puedes definir la estructura y los tipos de los objetos.

4. Arrays

// JavaScript
let fruits = ["manzana", "banana", "mango"];
// TypeScript
let fruits: string[] = ["manzana", "banana", "mango"];

En TypeScript, puedes especificar el tipo de los elementos del array.

5. Clases

// JavaScript
class Car {
constructor(brand) {
this.brand = brand;
}
}
// TypeScript
class Car {
brand: string;

constructor(brand: string) {
this.brand = brand;
}
}

TypeScript proporciona una sintaxis más clara para la definición de clases, que incluye tipos de propiedades.

Ejemplos Intermedios

1. Herencia

// JavaScript
class Car {
constructor(brand) {
this.brand = brand;
}
}

class sportCar extends Car {
constructor(brand, model) {
super(brand);
this.model = model;
}
}
// TypeScript
class Car {
brand: string;

constructor(brand: string) {
this.brand = brand;
}
}

class CocheDeportivo extends Car {
model: string;

constructor(brand: string, model: string) {
super(brand);
this.model = model;
}
}

En TypeScript, puedes especificar los tipos de las propiedades de las clases y los parámetros del constructor.

2. Módulos

// JavaScript

// file.js
export function greet(name) {
return "Hola " + name;
}
// otherFile.js
import { greet } from './file.js';
// TypeScript

// file.ts
export function greet(name: string): string {
return "Hola " + name;
}
// otherFile.ts
import { greet } from './file';

Tanto JavaScript como TypeScript admiten módulos ES6 para organizar y compartir código.

3. Promesas

// JavaScript
let promesa = new Promise((resolve, reject) => {
// operación asincrónica
});

promesa.then(resultado => {
console.log(resultado);
}).catch(error => {
console.log(error);
});
// TypeScript
let promesa: Promise<string> = new Promise((resolve, reject) => {
// operación asincrónica
});

promesa.then((resultado: string) => {
console.log(resultado);
}).catch((error: any) => {
console.log(error);
});

Las promesas representan operaciones asincrónicas. En TypeScript, puedes especificar el tipo del resultado de la promesa.

4. Funciones flecha

// JavaScript
let multiplicar = (a, b) => a * b;
// TypeScript
let multiplicar = (a: number, b: number): number => a * b;

Las funciones flecha son una forma concisa de definir funciones. En TypeScript, puedes especificar los tipos de los parámetros y del valor de retorno.

5. Map, Filter, Reduce

// JavaScript
let numeros = [1, 2, 3, 4, 5];
let cuadrados = numeros.map(n => n * n);
let pares = numeros.filter(n => n % 2 === 0);
let suma = numeros.reduce((a, b) => a + b, 0);
// TypeScript
let numeros: number[] = [1, 2, 3, 4, 5];
let cuadrados: number[] = numeros.map((n: number) => n * n);
let pares: number[] = numeros.filter((n: number) => n % 2 === 0);
let suma: number = numeros.reduce((a: number, b: number) => a + b, 0);

JavaScript y TypeScript tienen métodos útiles para trabajar con arrays. En TypeScript, puedes especificar los tipos de los elementos del array y los parámetros de las funciones de callback.

Ejemplos Avanzados

Solo hay ejemplos para TypeScript.

1. Decoradores

// TypeScript
function log(target, propertyKey, descriptor) {
let originalMethod = descriptor.value;
descriptor.value = function(...args) {
console.log("Argumentos: ", args);
let result = originalMethod.apply(this, args);
console.log("Resultado: ", result);
return result;
};
return descriptor;
}

class Matematicas {
@log
sumar(a: number, b: number): number {
return a + b;
}
}

Los decoradores son una característica avanzada de TypeScript que permite modificar clases, propiedades, métodos y accesadores en tiempo de diseño.

2. Generics

// TypeScript
function primeraPosicion<T>(arr: T[]): T {
return arr[0];
}

Los generics permiten definir funciones, clases e interfaces que trabajan con diferentes tipos de datos, manteniendo la seguridad de los tipos.

3. Enums

// TypeScript
enum Dia {Lunes, Martes, Miercoles, Jueves, Viernes, Sabado, Domingo}

let diaFavorito: Dia = Dia.Viernes;

Los enums en TypeScript permiten definir un tipo que tiene un número limitado de valores posibles.

4. Namespaces

// TypeScript
namespace Matematicas {
export function sumar(a: number, b: number): number {
return a + b;
}
}

Los namespaces pueden ser utilizados para organizar el código en TypeScript.

5. Interfaces

// TypeScript
interface Persona {
nombre: string;
edad: number;
}

function presentar(persona: Persona) {
console.log(`Hola, soy ${persona.nombre} y tengo ${persona.edad} años.`);
}

Las interfaces en TypeScript definen una forma o contrato para los objetos, permitiendo que se asegure que un objeto tiene ciertas propiedades con ciertos tipos.

6. Seguridad de Tipos

// TypeScript
function suma(a: number, b: number) {
return a + b;
}

suma(1, 2); // Correcto
suma("1", "2"); // Error: Argumento de tipo '"1"' no es asignable al parámetro de tipo 'number'.

En JavaScript, este código se ejecutará sin problemas y dará un resultado inesperado de “12”.

7. Características de Orientación a Objetos

// TypeScript
interface Animal {
nombre: string;
hacerRuido(): string;
}

class Perro implements Animal {
constructor(public nombre: string) {}

hacerRuido(): string {
return 'Guau!';
}
}

let miPerro: Animal = new Perro("Toby");
console.log(miPerro.hacerRuido()); // "Guau!"

TypeScript tiene características avanzadas de orientación a objetos, como clases abstractas, modificadores de acceso (public, private, protected) e interfaces.

JavaScript no tiene interfaces ni una forma nativa de manejar modificadores de acceso.

8. Mejores Herramientas de Desarrollo

Las herramientas de desarrollo pueden proporcionar un mejor autocompletado y sugerencias de código cuando se usa TypeScript debido a su sistema de tipos.

// TypeScript
interface Persona {
nombre: string;
edad: number;
}

function saludo(persona: Persona) {
return `Hola, ${persona.nombre}`;
}

let juan: Persona = { nombre: 'Juan', edad: 25 };
console.log(saludo(juan)); // "Hola, Juan"

El editor proporcionará autocompletado para la variable ‘persona’ en la función ‘saludo’.

9. Soporte para Generics

Los generics proporcionan una forma de crear componentes reutilizables que pueden trabajar con varios tipos.

// TypeScript
function primero<T>(arr: T[]): T {
return arr[0];
}

console.log(primero<string>(["Hola", "Mundo"])); // "Hola"
console.log(primero<number>([1, 2, 3])); // 1

JavaScript no tiene un concepto comparable a los generics.

10. Alias de Tipos y Tipos de Unión

TypeScript permite la creación de alias de tipos y tipos de unión que pueden ser muy útiles para crear tipos complejos.

// TypeScript
type StringOrNumber = string | number;

function duplicar(valor: StringOrNumber) {
return valor + valor;
}

console.log(duplicar("Hola")); // "HolaHola"
console.log(duplicar(2)); // 4

En JavaScript, no hay manera de especificar que una variable puede ser uno de varios tipos.

¡Y ahí lo tienes, damas y caballeros, después de rondas emocionantes de comparaciones, ejemplos y análisis, tenemos un claro ganador! ¡TypeScript ha demostrado ser un lenguaje de programación más robusto, poderoso y seguro! Con su fuerte sistema de tipos, su asombrosa seguridad en la compilación y sus características orientadas a objetos, TypeScript ha dejado una impresión duradera.

Aunque JavaScript sigue siendo un lenguaje versátil y ampliamente adoptado, TypeScript brilla por su capacidad para manejar proyectos más grandes y complejos, y por sus herramientas de desarrollo más robustas.

Pero, al final del día, la elección del lenguaje de programación siempre dependerá de tus necesidades específicas y de tu situación particular. Por lo tanto, no importa quién haya ganado esta batalla, recuerda que tanto JavaScript como TypeScript tienen sus méritos y son herramientas valiosas para cualquier desarrollador.

Quiero agradecer a todos los que se tomaron el tiempo de leer este post y espero que haya sido útil y esclarecedor. Sea cual sea el lenguaje que elijas para tu próximo proyecto, ¡te deseo mucho éxito y felices codificaciones!

TypeScript es el azul, evidentemente xD

--

--

Pablo Contreras

Desarrollador con conocimientos en JS, TS y Python. Construí soluciones para restaurantes y fintech. Aprendiendo y compartiendo en mi newsletter.