Giter Club home page Giter Club logo

learn_typescript's Introduction

Aprender typescript desde cero en YouTube


¡Claro! TypeScript es un lenguaje de programación desarrollado y mantenido por Microsoft. Es un superconjunto de JavaScript que agrega tipado estático y algunas características adicionales que facilitan el desarrollo de aplicaciones grandes y complejas. Aquí hay una introducción básica a TypeScript:

1. Qué es TypeScript

TypeScript es un lenguaje que se transpila a JavaScript. Esto significa que el código TypeScript se convierte en JavaScript antes de ser ejecutado en el navegador o en un entorno de Node.js. TypeScript agrega tipos estáticos, lo que ayuda a detectar errores en tiempo de compilación en lugar de en tiempo de ejecución.

2. Instalación

Para comenzar a usar TypeScript, primero necesitas instalarlo. Esto se puede hacer a través de npm (Node Package Manager):

npm install -g typescript

Después de instalar TypeScript, puedes verificar la instalación y la versión utilizando el siguiente comando:

tsc --version

3. Primer Archivo TypeScript

Crea un archivo con extensión .ts (por ejemplo, app.ts) y escribe el siguiente código:

function greeter(person: string) {
    return "Hello, " + person;
}

let user = "World";

console.log(greeter(user));

4. Compilación

Para convertir el archivo TypeScript (app.ts) a JavaScript, usa el comando tsc:

tsc app.ts

Esto generará un archivo app.js que contiene el JavaScript equivalente.

5. Tipos Básicos

TypeScript agrega varios tipos básicos que no están presentes en JavaScript:

  • Tipos Primitivos: boolean, number, string, null, undefined
  • Array: number[] o Array<number>
  • Tuplas: [string, number]
  • Enum: enum Color {Red, Green, Blue}
  • Any: Permite desactivar el chequeo de tipos
  • Void: Para funciones que no retornan un valor

6. Interfaces

Las interfaces son una forma de definir contratos en tu código, permitiendo una tipificación más estricta.

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person: Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

let user = { firstName: "John", lastName: "Doe" };

console.log(greeter(user));

7. Clases

TypeScript soporta la programación orientada a objetos con clases y herencia.

class Student {
    fullName: string;
    constructor(public firstName: string, public middleInitial: string, public lastName: string) {
        this.fullName = firstName + " " + middleInitial + " " + lastName;
    }
}

interface Person {
    firstName: string;
    lastName: string;
}

function greeter(person: Person) {
    return "Hello, " + person.firstName + " " + person.lastName;
}

let user = new Student("Jane", "M.", "Doe");

console.log(greeter(user));

8. Módulos

TypeScript utiliza módulos para organizar y encapsular el código.

// greeter.ts
export function greeter(person: string) {
    return "Hello, " + person;
}

// main.ts
import { greeter } from './greeter';

let user = "World";

console.log(greeter(user));

9. Configuración de TypeScript

Puedes configurar el compilador TypeScript mediante un archivo tsconfig.json. Este archivo permite definir las opciones de compilación.

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "strict": true,
        "esModuleInterop": true
    }
}

10. Herramientas y Ecosistema

TypeScript se integra bien con muchas herramientas y frameworks populares, como React, Angular, Vue, y Node.js. Muchas IDEs y editores de texto como Visual Studio Code, WebStorm, y Sublime Text tienen un excelente soporte para TypeScript, ofreciendo características como autocompletado, refactorización y depuración.

Beneficios de TypeScript

  1. Mejor Mantenimiento: El tipado estático ayuda a encontrar errores temprano y facilita la refactorización.
  2. Escalabilidad: TypeScript es ideal para proyectos grandes y equipos múltiples.
  3. Ecosistema y Herramientas: Integración con IDEs, herramientas de construcción, y frameworks.
  4. Interoperabilidad: Puedes usar bibliotecas JavaScript existentes sin problemas.

Conclusión

TypeScript agrega poderosas características a JavaScript, permitiendo un desarrollo más robusto y mantenible. Aprender TypeScript puede mejorar significativamente la calidad de tu código y la productividad de tu equipo.

¿Te gustaría profundizar en algún aspecto específico de TypeScript?


Modo Observador

El modo observador en TypeScript es una característica que permite a tsc (el compilador de TypeScript) vigilar los archivos .ts para detectar cambios y recompilarlos automáticamente. Esto es especialmente útil durante el desarrollo, ya que no necesitas ejecutar manualmente el comando de compilación cada vez que haces un cambio en tu código.

Usar el Modo Observador

Para usar el modo observador, simplemente agrega la opción -w (o --watch) al comando tsc. Por ejemplo, si tienes un archivo script.ts y deseas que el compilador lo observe, ejecuta:

tsc script.ts -w

Cuando ejecutas este comando, tsc comienza a observar el archivo script.ts y cualquier otro archivo que dependa de él. Cada vez que guardas cambios en cualquiera de estos archivos, tsc los recompilará automáticamente.

Ejemplo Práctico

Supongamos que tienes dos archivos:

1. greeter.ts

export function greeter(person: string) {
    return "Hello, " + person;
}

2. main.ts

import { greeter } from './greeter';

let user = "World";
console.log(greeter(user));

Para compilar estos archivos en modo observador, primero debes tener un archivo tsconfig.json que defina las opciones de compilación:

tsconfig.json

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "strict": true,
        "esModuleInterop": true,
        "outDir": "./dist"
    },
    "include": ["./*.ts"]
}

Luego, ejecuta el siguiente comando en el terminal en el directorio donde se encuentra el tsconfig.json:

tsc -w

Beneficios del Modo Observador

  1. Ahorro de Tiempo: No necesitas ejecutar el comando de compilación manualmente después de cada cambio, lo que ahorra tiempo y facilita el flujo de trabajo.
  2. Feedback Inmediato: Obtienes retroalimentación inmediata sobre errores de compilación, lo que te ayuda a corregirlos rápidamente.
  3. Mejora la Productividad: Mantiene un ciclo de desarrollo más rápido y eficiente, ya que puedes concentrarte en escribir código sin preocuparte por la compilación.

Salida de Consola

Cuando ejecutas tsc -w, verás una salida en la consola similar a esta:

> tsc -w
12:00:00 AM - File change detected. Starting incremental compilation...
12:00:02 AM - Compilation complete. Watching for file changes.

Cada vez que guardas un archivo, el compilador detecta el cambio y recompila automáticamente:

12:01:00 AM - File change detected. Starting incremental compilation...
12:01:02 AM - Compilation complete. Watching for file changes.

El archivo tsconfig.json es fundamental para cualquier proyecto de TypeScript. Este archivo permite configurar las opciones del compilador de TypeScript y especificar los archivos que se deben incluir en el proyecto. A continuación, se presenta una explicación detallada sobre la estructura y las opciones más comunes del archivo tsconfig.json.

Estructura Básica de tsconfig.json

El archivo tsconfig.json es un archivo JSON que puede contener varias secciones. Aquí hay un ejemplo básico:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "strict": true,
        "esModuleInterop": true,
        "outDir": "./dist",
        "rootDir": "./src",
        "sourceMap": true
    },
    "include": ["src/**/*"],
    "exclude": ["node_modules", "**/*.spec.ts"]
}

Sección compilerOptions

Esta sección contiene las opciones del compilador de TypeScript. Aquí están algunas de las opciones más comunes:

  • target: Especifica la versión de JavaScript a la que se debe compilar el código. Ejemplos: es5, es6, es2016, es2017, etc.

    "target": "es5"
  • module: Especifica el sistema de módulos a utilizar. Ejemplos: commonjs, amd, es6, esnext.

    "module": "commonjs"
  • strict: Habilita todas las verificaciones estrictas de tipo. Esto incluye varias opciones como strictNullChecks, noImplicitAny, etc.

    "strict": true
  • esModuleInterop: Habilita la interoperabilidad de módulos ES para su uso con módulos CommonJS.

    "esModuleInterop": true
  • outDir: Especifica el directorio donde se colocarán los archivos JavaScript compilados.

    "outDir": "./dist"
  • rootDir: Especifica el directorio raíz de entrada de los archivos de origen.

    "rootDir": "./src"
  • sourceMap: Genera archivos .map para el código fuente, lo que facilita la depuración.

    "sourceMap": true

Sección include

Esta sección especifica los archivos y directorios que deben incluirse en el proyecto de TypeScript.

"include": ["src/**/*"]

Sección exclude

Esta sección especifica los archivos y directorios que deben excluirse del proyecto de TypeScript.

"exclude": ["node_modules", "**/*.spec.ts"]

Otras Opciones de compilerOptions

Aquí hay algunas otras opciones importantes que puedes encontrar en compilerOptions:

  • lib: Especifica las bibliotecas que deben incluirse en la compilación. Por ejemplo, ["dom", "es2015", "es2017.object"].

    "lib": ["dom", "es2015"]
  • declaration: Genera archivos .d.ts que contienen las definiciones de tipo para el código compilado.

    "declaration": true
  • removeComments: Elimina los comentarios de los archivos JavaScript generados.

    "removeComments": true
  • noImplicitAny: Lanza un error cuando el compilador no puede inferir el tipo de una variable y la asigna a any.

    "noImplicitAny": true
  • strictNullChecks: Habilita la verificación estricta de null y undefined.

    "strictNullChecks": true
  • jsx: Soporte para archivos JSX en proyectos de React. Opciones: react, react-native, preserve.

    "jsx": "react"

Ejemplo Completo de tsconfig.json

Aquí tienes un ejemplo más completo que muestra varias de las opciones mencionadas:

{
    "compilerOptions": {
        "target": "es6",
        "module": "commonjs",
        "strict": true,
        "esModuleInterop": true,
        "outDir": "./dist",
        "rootDir": "./src",
        "sourceMap": true,
        "declaration": true,
        "noImplicitAny": true,
        "strictNullChecks": true,
        "removeComments": true,
        "lib": ["dom", "es2015"],
        "jsx": "react"
    },
    "include": ["src/**/*"],
    "exclude": ["node_modules", "**/*.spec.ts"]
}

Conclusión

El archivo tsconfig.json es una herramienta poderosa que te permite configurar cómo TypeScript debe compilar tu proyecto. Proporciona una gran cantidad de opciones para ajustar el comportamiento del compilador, especificar qué archivos incluir y excluir, y más. Entender y configurar correctamente tsconfig.json es crucial para aprovechar al máximo las capacidades de TypeScript en tus proyectos.

Conclusión

El modo observador de TypeScript es una herramienta poderosa que mejora significativamente la experiencia de desarrollo. Permite una compilación continua y automática de los archivos TypeScript, proporcionando un flujo de trabajo más eficiente y productivo.


Tipos de datos en Typescript

¡Claro! TypeScript, al ser un superconjunto de JavaScript, incluye todos los tipos de datos disponibles en JavaScript y agrega algunos adicionales para mejorar la seguridad y la claridad del código. Aquí tienes un resumen de los principales tipos de datos en TypeScript:

Tipos Primitivos

  1. Booleano (boolean) Representa valores verdaderos y falsos.

    let isDone: boolean = true;
  2. Números (number) Representa tanto números enteros como de punto flotante.

    let decimal: number = 6;
    let hex: number = 0xf00d;
    let binary: number = 0b1010;
    let octal: number = 0o744;
  3. Cadenas de texto (string) Representa secuencias de caracteres.

    let color: string = "blue";
    let fullName: string = `John Doe`;
    let age: number = 30;
    let sentence: string = `Hello, my name is ${fullName}. I'll be ${age + 1} years old next month.`;
  4. Arreglos (Array) Representa una colección de elementos del mismo tipo.

    let list: number[] = [1, 2, 3];
    let listGeneric: Array<number> = [1, 2, 3];
  5. Tuplas ([type1, type2, ...]) Representa un arreglo con una cantidad fija de elementos de tipos específicos.

    let x: [string, number];
    x = ["hello", 10]; // Correcto
    // x = [10, "hello"]; // Error
  6. Enums (enum) Representa un conjunto de valores con nombre.

    enum Color {Red, Green, Blue}
    let c: Color = Color.Green;
  7. Any (any) Representa cualquier tipo. Útil cuando se trabaja con código de terceros o cuando se necesita deshabilitar la verificación de tipos.

    let notSure: any = 4;
    notSure = "maybe a string instead";
    notSure = false; // OK
  8. Void (void) Representa la ausencia de un tipo. Utilizado generalmente en las funciones que no retornan un valor.

    function warnUser(): void {
        console.log("This is my warning message");
    }
  9. Null y Undefined (null y undefined) Representan valores nulos o indefinidos.

    let u: undefined = undefined;
    let n: null = null;
  10. Never (never) Representa el tipo de valores que nunca ocurren. Utilizado para funciones que nunca retornan (como aquellas que lanzan excepciones o que tienen un bucle infinito).

    function error(message: string): never {
        throw new Error(message);
    }

Tipos de Datos Adicionales

  1. Objetos (object) Representa tipos no primitivos, como funciones, arreglos, etc.

    let obj: object = { name: "John", age: 30 };
  2. Uniones (|) Permite que una variable tenga uno de varios tipos.

    let id: number | string;
    id = 10; // Correcto
    id = "123"; // Correcto
  3. Alias de Tipo (type) Permite crear un nombre para un tipo de datos.

    type StringOrNumber = string | number;
    let sample: StringOrNumber;
    sample = "hello"; // Correcto
    sample = 10; // Correcto
  4. Intersecciones (&) Combina múltiples tipos en uno solo.

    interface Person {
        name: string;
    }
    
    interface Employee {
        id: number;
    }
    
    type EmployeePerson = Person & Employee;
    
    let emp: EmployeePerson = {
        name: "John",
        id: 123
    };

Inferencia de Tipos

TypeScript es capaz de inferir el tipo de una variable basada en su valor inicial, lo que puede reducir la necesidad de anotaciones explícitas.

let someValue = "this is a string"; // Inferido como string

Anotaciones de Funciones

Puedes especificar tipos para los parámetros y el tipo de retorno de las funciones.

function add(x: number, y: number): number {
    return x + y;
}

Interfaces y Clases

TypeScript permite definir estructuras de datos más complejas utilizando interfaces y clases.

Interfaces:

interface Point {
    x: number;
    y: number;
}

function printPoint(p: Point) {
    console.log(`${p.x}, ${p.y}`);
}

Clases:

class Animal {
    name: string;

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

    move(distanceInMeters: number = 0) {
        console.log(`${this.name} moved ${distanceInMeters}m.`);
    }
}

let dog = new Animal("Dog");
dog.move(10);

Conclusión

TypeScript amplía el sistema de tipos de JavaScript, proporcionando mayor seguridad y herramientas para el desarrollo de aplicaciones robustas. Estos tipos ayudan a detectar errores temprano en el ciclo de desarrollo y a documentar mejor el código.

Claro, ¿hay algún tipo de dato o característica específica de TypeScript sobre la que te gustaría profundizar? Puedo proporcionarte más detalles sobre temas como:

  1. Interfaces y Tipos: Diferencias, uso avanzado, y cómo extenderlos.
  2. Clases y Herencia: Cómo funcionan las clases, herencia, modificadores de acceso, y abstract classes.
  3. Generics: Cómo usar tipos genéricos para crear componentes y funciones reutilizables.
  4. Decorators: Qué son los decoradores, cómo funcionan y ejemplos de uso.
  5. Modules: Cómo organizar y modularizar tu código usando import/export.
  6. Advanced Types: Uso de mapped types, conditional types, y otras características avanzadas del sistema de tipos.
  7. Type Guards: Cómo refinar tipos usando type guards y type assertions.

Los datos Primitivos

En TypeScript, al igual que en JavaScript, existen varios tipos de datos primitivos que son fundamentales para la programación. Aquí te explico cada uno de ellos:

  1. number: Representa tanto números enteros como de punto flotante. Ejemplos: 42, 3.14, -0.99.

    let edad: number = 25;
    let precio: number = 19.99;
  2. string: Representa secuencias de caracteres, es decir, texto. Puedes usar comillas simples ('...'), comillas dobles ("..."), o backticks (\...``) para definir strings.

    let nombre: string = "Juan";
    let saludo: string = `Hola, ${nombre}`;
  3. boolean: Representa un valor verdadero o falso. Solo tiene dos valores posibles: true o false.

    let esMayorDeEdad: boolean = true;
    let estaLogueado: boolean = false;
  4. null: Representa la ausencia intencionada de cualquier valor. En TypeScript, null es un tipo y también un valor.

    let valorNulo: null = null;
  5. undefined: Representa una variable que ha sido declarada pero no ha sido asignada aún. También es un tipo y un valor.

    let valorIndefinido: undefined = undefined;
  6. symbol: Introducido en ECMAScript 2015, un symbol es un valor único e inmutable. Se utiliza para identificar propiedades de objetos de forma única.

    let id: symbol = Symbol("id");
  7. bigint: Introducido en ECMAScript 2020, permite representar números enteros muy grandes, más allá del límite de number. Se define agregando una n al final del número.

    let granNumero: bigint = 1234567890123456789012345678901234567890n;

Estos tipos de datos primitivos son la base para la manipulación de datos en TypeScript, y conocerlos es fundamental para escribir código correcto y eficiente.


Any (cualquier dato)

En TypeScript, el tipo any es un tipo especial que permite desactivar la verificación de tipos y puede contener cualquier valor. Es útil en situaciones donde no se conoce de antemano el tipo exacto de una variable o cuando se necesita trabajar con código JavaScript existente que no tiene tipado.

Características del Tipo any

  1. Flexibilidad: Permite asignar valores de cualquier tipo a una variable.
  2. Sin Restricciones de Tipado: No se realizan comprobaciones de tipo en las operaciones realizadas con variables de tipo any.
  3. Interoperabilidad con JavaScript: Facilita la integración de TypeScript con bibliotecas y código JavaScript que no están tipados.

Ejemplos

  1. Asignación de Diferentes Tipos:

    let variable: any;
    
    variable = 42;         // number
    console.log(variable); // 42
    
    variable = "Hola";     // string
    console.log(variable); // Hola
    
    variable = true;       // boolean
    console.log(variable); // true
  2. Desactivar la Verificación de Tipos:

    let dato: any = "un texto";
    
    // No hay error, aunque 'dato' es un string en este momento.
    let longitud = dato.length;
    console.log(longitud); // 8
    
    // Ninguna advertencia o error de compilación.
    dato = 100;
    console.log(dato); // 100

Uso Adecuado del Tipo any

Aunque any ofrece mucha flexibilidad, su uso excesivo puede anular las ventajas del tipado estático que ofrece TypeScript. Aquí hay algunas recomendaciones:

  1. Usarlo Temporalmente: Ideal para el desarrollo inicial o para migrar código JavaScript a TypeScript.
  2. Reemplazarlo Progresivamente: A medida que se entiende mejor el código, se puede sustituir any por tipos más específicos.
  3. Evitar en Código Final: Siempre que sea posible, especificar tipos concretos para mantener la seguridad y claridad del código.

Ejemplo de Uso Adecuado

function procesarEntrada(input: any) {
    if (typeof input === 'string') {
        return input.trim();
    } else if (typeof input === 'number') {
        return input.toFixed(2);
    } else {
        return input;
    }
}

En resumen, any es una herramienta poderosa en TypeScript que debe usarse con cuidado. Facilita la flexibilidad y la interoperabilidad con código no tipado, pero también puede llevar a errores difíciles de detectar si se usa indiscriminadamente.


Arrays

En TypeScript, los arrays son colecciones de elementos del mismo tipo. Puedes definir arrays de dos maneras principales: usando la sintaxis de corchetes [] o usando la clase genérica Array<T>. Aquí te explico cómo funcionan y cómo se utilizan.

Definición de Arrays

  1. Usando Corchetes:

    let numeros: number[] = [1, 2, 3, 4, 5];
    let palabras: string[] = ["hola", "mundo"];
  2. Usando la Clase Genérica Array<T>:

    let numeros: Array<number> = [1, 2, 3, 4, 5];
    let palabras: Array<string> = ["hola", "mundo"];

Acceso y Modificación de Elementos

Puedes acceder a los elementos de un array usando su índice (comenzando desde 0) y modificarlos de la misma manera.

let frutas: string[] = ["manzana", "banana", "cereza"];

console.log(frutas[0]); // "manzana"

frutas[1] = "naranja";
console.log(frutas); // ["manzana", "naranja", "cereza"]

Métodos Comunes de Arrays

TypeScript hereda todos los métodos de los arrays de JavaScript. Aquí algunos ejemplos comunes:

  1. push(): Agrega uno o más elementos al final del array.

    let numeros: number[] = [1, 2, 3];
    numeros.push(4, 5);
    console.log(numeros); // [1, 2, 3, 4, 5]
  2. pop(): Elimina el último elemento del array y lo devuelve.

    let numeros: number[] = [1, 2, 3];
    let ultimo = numeros.pop();
    console.log(ultimo); // 3
    console.log(numeros); // [1, 2]
  3. shift(): Elimina el primer elemento del array y lo devuelve.

    let numeros: number[] = [1, 2, 3];
    let primero = numeros.shift();
    console.log(primero); // 1
    console.log(numeros); // [2, 3]
  4. unshift(): Agrega uno o más elementos al inicio del array.

    let numeros: number[] = [2, 3];
    numeros.unshift(1);
    console.log(numeros); // [1, 2, 3]
  5. map(): Aplica una función a cada elemento del array y devuelve un nuevo array con los resultados.

    let numeros: number[] = [1, 2, 3];
    let cuadrados = numeros.map(num => num * num);
    console.log(cuadrados); // [1, 4, 9]
  6. filter(): Crea un nuevo array con todos los elementos que pasen una prueba (proporcionada como función).

    let numeros: number[] = [1, 2, 3, 4, 5];
    let pares = numeros.filter(num => num % 2 === 0);
    console.log(pares); // [2, 4]
  7. reduce(): Aplica una función a un acumulador y a cada valor del array (de izquierda a derecha) para reducirlo a un solo valor.

    let numeros: number[] = [1, 2, 3, 4, 5];
    let suma = numeros.reduce((acumulador, valorActual) => acumulador + valorActual, 0);
    console.log(suma); // 15

Arrays Multidimensionales

Puedes crear arrays de múltiples dimensiones (arrays dentro de arrays) especificando más niveles de corchetes.

let matriz: number[][] = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

console.log(matriz[1][2]); // 6

Tuplas

En TypeScript, también puedes usar tuplas, que son arrays con un número fijo de elementos de tipos específicos.

let tupla: [string, number];
tupla = ["hola", 42]; // Correcto
// tupla = [42, "hola"]; // Error: el tipo 'number' no se puede asignar al tipo 'string'

En resumen, los arrays en TypeScript son una herramienta poderosa y flexible para trabajar con colecciones de datos. Entender cómo definir, manipular y usar arrays te permitirá escribir código más eficiente y organizado.


Objetos literales (introducción)

En TypeScript, los objetos literales son una forma fundamental de representar estructuras de datos. Un objeto literal es una colección de pares clave-valor, donde las claves son cadenas (o símbolos) y los valores pueden ser de cualquier tipo. Los objetos literales son muy similares a los de JavaScript, pero en TypeScript se puede aprovechar el sistema de tipos para garantizar una estructura más robusta y segura.

Definición de Objetos Literales

En TypeScript, puedes definir un objeto literal de la siguiente manera:

let persona = {
    nombre: "Juan",
    edad: 30,
    casado: true
};

En este ejemplo, persona es un objeto literal con tres propiedades: nombre (una cadena), edad (un número) y casado (un booleano).

Tipado de Objetos Literales

Para aprovechar las ventajas de TypeScript, puedes definir un tipo para un objeto literal utilizando interfaces o tipos (type aliases).

Usando Interfaces

Las interfaces permiten definir la estructura de un objeto.

interface Persona {
    nombre: string;
    edad: number;
    casado: boolean;
}

let persona: Persona = {
    nombre: "Juan",
    edad: 30,
    casado: true
};

Usando Type Aliases

Los type aliases son otra manera de definir la estructura de un objeto.

type Persona = {
    nombre: string;
    edad: number;
    casado: boolean;
};

let persona: Persona = {
    nombre: "Juan",
    edad: 30,
    casado: true
};

Propiedades Opcionales

Puedes definir propiedades opcionales en un objeto usando el operador ?.

interface Persona {
    nombre: string;
    edad: number;
    casado?: boolean;
}

let persona1: Persona = {
    nombre: "Juan",
    edad: 30
};

let persona2: Persona = {
    nombre: "María",
    edad: 25,
    casado: true
};

En este caso, casado es opcional, por lo que persona1 no necesita tener esta propiedad, mientras que persona2 sí la tiene.

Propiedades de Solo Lectura

Puedes hacer que una propiedad sea de solo lectura usando el modificador readonly.

interface Persona {
    readonly nombre: string;
    edad: number;
    casado?: boolean;
}

let persona: Persona = {
    nombre: "Juan",
    edad: 30
};

// persona.nombre = "Carlos"; // Error: La propiedad 'nombre' es de solo lectura

Index Signatures

Las index signatures permiten definir objetos con propiedades dinámicas, donde los nombres de las propiedades no son conocidos de antemano.

interface Diccionario {
    [key: string]: string;
}

let diccionario: Diccionario = {
    "hola": "hello",
    "mundo": "world"
};

En este ejemplo, Diccionario puede tener cualquier cantidad de propiedades con nombres de tipo string y valores de tipo string.

Ejemplo Completo

Aquí tienes un ejemplo completo que combina varios conceptos:

interface Persona {
    nombre: string;
    edad: number;
    casado?: boolean;
    readonly id: number;
    [key: string]: any;
}

let persona: Persona = {
    nombre: "Juan",
    edad: 30,
    id: 1,
    direccion: "Calle Falsa 123"
};

En resumen, los objetos literales en TypeScript son una herramienta poderosa y flexible para representar datos. Usando interfaces y tipos, puedes definir estructuras de objetos claras y seguras, aprovechando al máximo las capacidades de tipado de TypeScript.


Type Personalizado

En TypeScript, un "Type Personalizado" (custom type) se refiere a la creación de tipos específicos que pueden ser utilizados para definir la forma y estructura de los datos de manera más precisa y descriptiva. Esto se puede lograr utilizando interfaces, type aliases y uniones de tipos. Aquí te explico cómo funcionan y cómo se utilizan.

Type Aliases

Los type aliases permiten definir un nombre personalizado para un tipo específico. Esto es útil para mejorar la legibilidad del código y para definir tipos complejos de manera más manejable.

Ejemplo Básico

type Id = number;
type Nombre = string;

let usuarioId: Id = 123;
let usuarioNombre: Nombre = "Juan";

Tipos Compuestos

Puedes combinar tipos utilizando type aliases.

type Coordenada = {
    x: number;
    y: number;
};

let punto: Coordenada = {
    x: 10,
    y: 20
};

Interfaces

Las interfaces permiten definir la estructura de un objeto. Son más flexibles que los type aliases en términos de extensión e implementación.

Ejemplo Básico

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

let persona: Persona = {
    nombre: "Juan",
    edad: 30
};

Propiedades Opcionales y de Solo Lectura

Puedes definir propiedades opcionales y de solo lectura en una interfaz.

interface Persona {
    nombre: string;
    edad: number;
    casado?: boolean; // Propiedad opcional
    readonly id: number; // Propiedad de solo lectura
}

let persona: Persona = {
    nombre: "Juan",
    edad: 30,
    id: 1
};

Uniones de Tipos

Las uniones de tipos permiten que una variable tenga múltiples tipos. Esto es útil cuando un valor puede ser de diferentes formas.

type Resultado = string | number;

let resultado1: Resultado = "Exito";
let resultado2: Resultado = 42;

Intersecciones de Tipos

Las intersecciones de tipos combinan múltiples tipos en uno solo, lo que requiere que una variable cumpla con todas las propiedades de los tipos combinados.

interface Direccion {
    calle: string;
    ciudad: string;
}

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

type PersonaConDireccion = Persona & Direccion;

let persona: PersonaConDireccion = {
    nombre: "Juan",
    edad: 30,
    calle: "Calle Falsa 123",
    ciudad: "Madrid"
};

Ejemplo Completo

Aquí tienes un ejemplo que combina varios conceptos de tipos personalizados:

type Id = number;
type Nombre = string;

interface Persona {
    id: Id;
    nombre: Nombre;
    edad: number;
    casado?: boolean;
}

type Coordenada = {
    x: number;
    y: number;
};

type Resultado = Persona | string;

let persona1: Persona = {
    id: 1,
    nombre: "Juan",
    edad: 30
};

let persona2: Persona = {
    id: 2,
    nombre: "María",
    edad: 25,
    casado: true
};

let punto: Coordenada = {
    x: 10,
    y: 20
};

let resultado1: Resultado = persona1;
let resultado2: Resultado = "Error";

Resumen

Los tipos personalizados en TypeScript te permiten definir estructuras de datos precisas y legibles, lo que mejora la seguridad y la claridad del código. Utilizando type aliases, interfaces, uniones e intersecciones de tipos, puedes crear tipos complejos que se adapten a las necesidades específicas de tu aplicación.


Interfaces

En TypeScript, una interfaz (interface) es una forma poderosa y flexible de definir la estructura de un objeto. Las interfaces permiten describir cómo debe ser un objeto, qué propiedades y métodos debe tener, y sus tipos correspondientes. Son útiles para garantizar que los objetos que se utilizan en el código cumplan con una estructura esperada, lo que ayuda a evitar errores y mejora la mantenibilidad del código.

Definición Básica de una Interfaz

Una interfaz en TypeScript se define utilizando la palabra clave interface, seguida por el nombre de la interfaz y el bloque de propiedades que debe contener.

Ejemplo Básico

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

let persona: Persona = {
    nombre: "Juan",
    edad: 30
};

En este ejemplo, la interfaz Persona define que cualquier objeto del tipo Persona debe tener dos propiedades: nombre (de tipo string) y edad (de tipo number).

Propiedades Opcionales

Puedes definir propiedades opcionales en una interfaz utilizando el operador ?.

interface Persona {
    nombre: string;
    edad: number;
    casado?: boolean; // Propiedad opcional
}

let persona1: Persona = {
    nombre: "Juan",
    edad: 30
};

let persona2: Persona = {
    nombre: "María",
    edad: 25,
    casado: true
};

Propiedades de Solo Lectura

Puedes definir propiedades de solo lectura utilizando el modificador readonly. Estas propiedades no pueden ser modificadas después de su inicialización.

interface Persona {
    readonly id: number;
    nombre: string;
    edad: number;
}

let persona: Persona = {
    id: 1,
    nombre: "Juan",
    edad: 30
};

// persona.id = 2; // Error: La propiedad 'id' es de solo lectura

Métodos en una Interfaz

Las interfaces también pueden definir métodos, especificando los nombres de los métodos, sus parámetros y los tipos de retorno.

interface Persona {
    nombre: string;
    edad: number;
    saludar(): void;
}

let persona: Persona = {
    nombre: "Juan",
    edad: 30,
    saludar() {
        console.log(`Hola, mi nombre es ${this.nombre}`);
    }
};

persona.saludar(); // "Hola, mi nombre es Juan"

Herencia de Interfaces

Una interfaz puede extender (heredar) otra interfaz, lo que permite la reutilización y combinación de estructuras de objetos.

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

interface Empleado extends Persona {
    salario: number;
}

let empleado: Empleado = {
    nombre: "Juan",
    edad: 30,
    salario: 50000
};

Intersecciones de Interfaces

Las interfaces pueden combinarse usando la intersección de tipos (&).

interface Direccion {
    calle: string;
    ciudad: string;
}

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

type PersonaConDireccion = Persona & Direccion;

let persona: PersonaConDireccion = {
    nombre: "Juan",
    edad: 30,
    calle: "Calle Falsa 123",
    ciudad: "Madrid"
};

Index Signatures

Las interfaces pueden definir propiedades dinámicas usando index signatures. Esto permite que los objetos tengan propiedades adicionales que no están predefinidas.

interface Diccionario {
    [key: string]: string;
}

let diccionario: Diccionario = {
    "hola": "hello",
    "mundo": "world"
};

Implementación de Interfaces en Clases

Las interfaces pueden ser implementadas por clases, lo que asegura que la clase siga la estructura definida por la interfaz.

interface Persona {
    nombre: string;
    edad: number;
    saludar(): void;
}

class Empleado implements Persona {
    constructor(public nombre: string, public edad: number, public salario: number) {}

    saludar() {
        console.log(`Hola, mi nombre es ${this.nombre}`);
    }
}

let empleado = new Empleado("Juan", 30, 50000);
empleado.saludar(); // "Hola, mi nombre es Juan"

Resumen

Las interfaces en TypeScript son una herramienta poderosa para definir la estructura de los objetos y garantizar la consistencia en el código. Permiten describir las propiedades y métodos que un objeto debe tener, definir propiedades opcionales y de solo lectura, extender otras interfaces, y ser implementadas por clases. Esto mejora la robustez y claridad del código, facilitando su mantenimiento y evitando errores.


Clases y POO

La Programación Orientada a Objetos (POO) es un paradigma de programación que utiliza "objetos" para modelar datos y comportamientos. TypeScript, al igual que JavaScript, soporta POO, pero agrega características adicionales que facilitan la definición de clases y objetos de manera más robusta y tipada. Aquí te explico los conceptos fundamentales de POO y cómo se implementan en TypeScript.

Conceptos Básicos de POO

  1. Clases: Una clase es una plantilla para crear objetos. Define un conjunto de propiedades y métodos que los objetos creados a partir de la clase tendrán.

  2. Objetos: Son instancias de clases. Contienen datos y métodos definidos por su clase.

  3. Herencia: Es un mecanismo que permite a una clase derivar de otra, heredando sus propiedades y métodos.

  4. Encapsulamiento: Es la agrupación de datos y métodos que operan sobre esos datos en una sola unidad (clase) y restringir el acceso a algunos de los componentes.

  5. Polimorfismo: Permite a las clases derivadas ser tratadas como instancias de su clase base.

Clases en TypeScript

Definición de Clases

Una clase en TypeScript se define utilizando la palabra clave class, seguida del nombre de la clase y un bloque de propiedades y métodos.

class Persona {
    nombre: string;
    edad: number;

    constructor(nombre: string, edad: number) {
        this.nombre = nombre;
        this.edad = edad;
    }

    saludar(): void {
        console.log(`Hola, mi nombre es ${this.nombre}`);
    }
}

let juan = new Persona("Juan", 30);
juan.saludar(); // "Hola, mi nombre es Juan"

Modificadores de Acceso

TypeScript proporciona modificadores de acceso para controlar la visibilidad de las propiedades y métodos:

  • public: Accesible desde cualquier lugar (por defecto).
  • private: Solo accesible desde dentro de la clase.
  • protected: Accesible desde la clase y las clases derivadas.
class Persona {
    public nombre: string;
    private edad: number;
    protected direccion: string;

    constructor(nombre: string, edad: number, direccion: string) {
        this.nombre = nombre;
        this.edad = edad;
        this.direccion = direccion;
    }

    public saludar(): void {
        console.log(`Hola, mi nombre es ${this.nombre}`);
    }

    private getEdad(): number {
        return this.edad;
    }
}

Herencia

TypeScript permite que una clase herede de otra utilizando la palabra clave extends.

class Empleado extends Persona {
    salario: number;

    constructor(nombre: string, edad: number, direccion: string, salario: number) {
        super(nombre, edad, direccion);
        this.salario = salario;
    }

    public mostrarSalario(): void {
        console.log(`Salario: ${this.salario}`);
    }
}

let empleado = new Empleado("Juan", 30, "Calle Falsa 123", 50000);
empleado.saludar(); // "Hola, mi nombre es Juan"
empleado.mostrarSalario(); // "Salario: 50000"

Clases Abstractas

Las clases abstractas no pueden ser instanciadas directamente. Se utilizan como clases base y pueden contener métodos abstractos que deben ser implementados por las clases derivadas.

abstract class Figura {
    abstract calcularArea(): number;

    public describir(): void {
        console.log("Soy una figura");
    }
}

class Circulo extends Figura {
    radio: number;

    constructor(radio: number) {
        super();
        this.radio = radio;
    }

    public calcularArea(): number {
        return Math.PI * this.radio * this.radio;
    }
}

let circulo = new Circulo(5);
circulo.describir(); // "Soy una figura"
console.log(circulo.calcularArea()); // 78.53981633974483

Interfaces en Clases

Las clases pueden implementar interfaces, lo que obliga a que la clase cumpla con la estructura definida por la interfaz.

interface Saludo {
    saludar(): void;
}

class Persona implements Saludo {
    nombre: string;

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

    public saludar(): void {
        console.log(`Hola, mi nombre es ${this.nombre}`);
    }
}

let juan = new Persona("Juan");
juan.saludar(); // "Hola, mi nombre es Juan"

Propiedades y Métodos Estáticos

Las propiedades y métodos estáticos pertenecen a la clase en sí, en lugar de a instancias individuales de la clase.

class Utilidades {
    static convertirMayusculas(texto: string): string {
        return texto.toUpperCase();
    }
}

console.log(Utilidades.convertirMayusculas("hola")); // "HOLA"

Resumen

La POO en TypeScript permite organizar y estructurar el código de manera más eficiente y modular. Usando clases, modificadores de acceso, herencia, clases abstractas, interfaces y propiedades y métodos estáticos, se puede crear código que es más fácil de mantener y entender. Estas características hacen que TypeScript sea una poderosa herramienta para el desarrollo de aplicaciones escalables y robustas.


Encapsulamiento y Genéricos

Encapsulamiento en TypeScript

El encapsulamiento es uno de los cuatro pilares fundamentales de la Programación Orientada a Objetos (POO), junto con la herencia, el polimorfismo y la abstracción. El objetivo del encapsulamiento es agrupar datos (propiedades) y métodos que operan sobre esos datos dentro de una sola unidad (la clase), y controlar el acceso a estos datos para protegerlos de modificaciones no autorizadas.

En TypeScript, se logra el encapsulamiento utilizando modificadores de acceso (public, private y protected).

Modificadores de Acceso

  1. public: Las propiedades y métodos públicos son accesibles desde cualquier lugar. Este es el modificador de acceso por defecto.

    class Persona {
        public nombre: string;
    
        constructor(nombre: string) {
            this.nombre = nombre;
        }
    
        public saludar(): void {
            console.log(`Hola, mi nombre es ${this.nombre}`);
        }
    }
    
    let persona = new Persona("Juan");
    persona.saludar(); // "Hola, mi nombre es Juan"
    console.log(persona.nombre); // "Juan"
  2. private: Las propiedades y métodos privados solo son accesibles dentro de la clase donde se definen. No pueden ser accedidos ni modificados desde fuera de la clase.

    class Persona {
        private nombre: string;
    
        constructor(nombre: string) {
            this.nombre = nombre;
        }
    
        public saludar(): void {
            console.log(`Hola, mi nombre es ${this.nombre}`);
        }
    }
    
    let persona = new Persona("Juan");
    persona.saludar(); // "Hola, mi nombre es Juan"
    // console.log(persona.nombre); // Error: La propiedad 'nombre' es privada
  3. protected: Las propiedades y métodos protegidos son accesibles dentro de la clase donde se definen y en las clases derivadas, pero no desde fuera de estas.

    class Persona {
        protected nombre: string;
    
        constructor(nombre: string) {
            this.nombre = nombre;
        }
    
        public saludar(): void {
            console.log(`Hola, mi nombre es ${this.nombre}`);
        }
    }
    
    class Empleado extends Persona {
        private salario: number;
    
        constructor(nombre: string, salario: number) {
            super(nombre);
            this.salario = salario;
        }
    
        public mostrarSalario(): void {
            console.log(`${this.nombre} tiene un salario de ${this.salario}`);
        }
    }
    
    let empleado = new Empleado("Juan", 50000);
    empleado.saludar(); // "Hola, mi nombre es Juan"
    empleado.mostrarSalario(); // "Juan tiene un salario de 50000"
    // console.log(empleado.nombre); // Error: La propiedad 'nombre' es protegida

Genéricos en TypeScript

Los genéricos son una herramienta poderosa en TypeScript que permite crear componentes reutilizables que funcionan con varios tipos de datos. Con los genéricos, puedes escribir funciones, clases e interfaces que no están restringidas a un solo tipo, proporcionando flexibilidad y reutilización del código.

Funciones Genéricas

Las funciones genéricas permiten que los tipos sean parámetros que se pasan a las funciones.

function identidad<T>(valor: T): T {
    return valor;
}

let numero = identidad<number>(42); // 42
let cadena = identidad<string>("Hola"); // "Hola"

En este ejemplo, T es un parámetro de tipo genérico. Cuando llamas a la función identidad, especificas el tipo que deseas utilizar.

Clases Genéricas

Las clases genéricas permiten que las clases trabajen con diferentes tipos sin necesidad de ser redefinidas.

class Caja<T> {
    contenido: T;

    constructor(contenido: T) {
        this.contenido = contenido;
    }

    abrir(): T {
        return this.contenido;
    }
}

let cajaDeNumero = new Caja<number>(123);
console.log(cajaDeNumero.abrir()); // 123

let cajaDeCadena = new Caja<string>("Hola");
console.log(cajaDeCadena.abrir()); // "Hola"

Interfaces Genéricas

Las interfaces genéricas permiten definir estructuras de datos que pueden operar con múltiples tipos.

interface Par<T, U> {
    primero: T;
    segundo: U;
}

let par: Par<string, number> = { primero: "Hola", segundo: 42 };
console.log(par); // { primero: "Hola", segundo: 42 }

Restricciones en Genéricos

Puedes aplicar restricciones a los genéricos para garantizar que los tipos utilizados cumplen con ciertos requisitos.

interface ConLongitud {
    longitud: number;
}

function imprimirLongitud<T extends ConLongitud>(elemento: T): void {
    console.log(elemento.longitud);
}

imprimirLongitud("Hola"); // 4
imprimirLongitud([1, 2, 3]); // 3
// imprimirLongitud(42); // Error: El número no tiene una propiedad 'longitud'

Resumen

  • Encapsulamiento: Controla el acceso a las propiedades y métodos de una clase utilizando modificadores de acceso (public, private, protected). Esto ayuda a proteger los datos y a mantener la integridad del estado interno de los objetos.
  • Genéricos: Permiten escribir componentes reutilizables y flexibles que pueden trabajar con múltiples tipos. Puedes usar genéricos en funciones, clases e interfaces, y también puedes aplicar restricciones para asegurar que los tipos utilizados cumplen con ciertos requisitos.

Estos conceptos son fundamentales para escribir código más seguro, modular y reutilizable en TypeScript.


Proyecto Reactjs con TypeScript

React.js con TypeScript combina la popular biblioteca de desarrollo frontend, React, con TypeScript, un superset tipado de JavaScript. Esta combinación ofrece beneficios significativos en términos de desarrollo más robusto, mantenibilidad del código y mejor soporte para equipos grandes y proyectos a gran escala. Aquí te explico más detalladamente sobre React.js con TypeScript:

¿Qué es React.js?

React.js es una biblioteca de JavaScript desarrollada por Facebook que se utiliza para construir interfaces de usuario interactivas y eficientes. Utiliza un enfoque basado en componentes donde los componentes encapsulan el estado y el comportamiento y se pueden componer para construir interfaces complejas. React utiliza un DOM virtual para optimizar las actualizaciones del DOM real, lo que mejora el rendimiento de las aplicaciones web.

¿Qué es TypeScript?

TypeScript es un superset tipado de JavaScript desarrollado por Microsoft. Añade tipos estáticos opcionales a JavaScript que pueden ser verificados por el compilador TypeScript durante el tiempo de desarrollo. Esto proporciona:

  • Verificación de tipos en tiempo de compilación: Ayuda a detectar errores comunes durante el desarrollo antes de que se ejecuten en tiempo de ejecución.
  • Mejor soporte para herramientas de desarrollo: Proporciona autocompletado más preciso, refactoring más seguro y documentación de código más clara.
  • Mejora la mantenibilidad del código: Al agregar tipos, el código se vuelve más legible y menos propenso a errores.

Integrando React.js con TypeScript

Integrar TypeScript con React.js implica algunos pasos clave:

  1. Instalación de TypeScript: Primero, debes instalar TypeScript como una dependencia de desarrollo en tu proyecto. Puedes hacerlo con npm o yarn:

    npm install --save-dev typescript

    o

    yarn add --dev typescript
  2. Configuración del Proyecto: Puedes iniciar un nuevo proyecto de React con TypeScript utilizando herramientas como create-react-app con la bandera --template typescript o configurando manualmente TypeScript en un proyecto existente.

  3. Tipado de Componentes: En TypeScript, los componentes de React pueden definirse como funciones o clases tipadas. Por ejemplo:

    import React from 'react';
    
    interface Props {
      name: string;
      age: number;
    }
    
    const MyComponent: React.FC<Props> = ({ name, age }) => {
      return (
        <div>
          <p>Name: {name}</p>
          <p>Age: {age}</p>
        </div>
      );
    };
    
    export default MyComponent;

    Aquí, Props define la forma de las propiedades que se espera que reciba MyComponent.

  4. Estado y Hooks: TypeScript también se integra bien con los hooks de React, como useState y useEffect, permitiendo tipar correctamente el estado y los efectos secundarios de la misma manera que con las propiedades.

  5. Beneficios de TypeScript con React:

    • Mejora la seguridad del código: Reduce errores al detectar problemas en tiempo de compilación.
    • Documentación mejorada: Mejora la legibilidad y comprensión del código mediante la definición explícita de tipos.
    • Escalabilidad: Facilita el trabajo en equipos grandes y proyectos a largo plazo al hacer que el código sea más predecible y mantenible.

Conclusión

Integrar TypeScript con React.js proporciona una manera poderosa de construir aplicaciones frontend modernas y robustas. La combinación de la facilidad de desarrollo y la seguridad adicional de TypeScript hace que sea una opción popular entre desarrolladores que buscan mejorar la calidad y la escalabilidad de sus proyectos.

Claro, puedo explicarte cómo usar npm create vite@latest para crear un proyecto de React.js con TypeScript utilizando Vite como herramienta de desarrollo. Aquí tienes los detalles:

Contexto y Uso

  1. Vite: Es un entorno de desarrollo rápido para JavaScript y TypeScript. Es conocido por su velocidad de inicio y recarga rápida en el desarrollo, optimizado para proyectos frontend modernos.

  2. npm create: Es un comando de npm que permite crear un nuevo proyecto a partir de una plantilla o starter pack especificado por el usuario.

  3. React.js con TypeScript: React.js es una biblioteca popular para construir interfaces de usuario, y TypeScript es un superset tipado de JavaScript que proporciona tipado estático opcional. Combinar React con TypeScript proporciona beneficios significativos en términos de robustez y mantenibilidad del código.

Detalles del Comando

El comando npm create vite@latest se usa para crear un nuevo proyecto utilizando la última versión estable de Vite como el gestor de proyectos. Vamos a ver cómo crear un proyecto de React.js con TypeScript utilizando este comando:

Pasos para Crear un Proyecto de React.js con TypeScript usando Vite

  1. Instalación de Node.js y npm: Asegúrate de tener Node.js instalado en tu sistema, ya que npm viene incluido con Node.js.

  2. Crear el Proyecto: Abre tu terminal y ejecuta el siguiente comando:

    npm create vite@latest my-react-app --template react-ts
    • vite@latest: Indica que quieres usar la última versión de Vite.
    • my-react-app: Es el nombre del directorio del nuevo proyecto que se creará. Puedes cambiar my-react-app por el nombre que desees para tu proyecto.
    • --template react-ts: Especifica que deseas usar una plantilla preconfigurada para React.js con TypeScript.
  3. Configuración y Dependencias: Una vez que se complete la creación del proyecto, npm instalará todas las dependencias necesarias y configurará la estructura inicial del proyecto.

  4. Desarrollo: Puedes comenzar a desarrollar tu aplicación React.js con TypeScript dentro del directorio my-react-app. Vite proporcionará un servidor de desarrollo local con características como recarga rápida y una configuración optimizada.

Beneficios de usar Vite con React.js y TypeScript

  • Rápido inicio y recarga: Vite es conocido por su rápido tiempo de inicio y recarga, lo que mejora significativamente la productividad del desarrollador.

  • Soporte para TypeScript: La plantilla react-ts configurará tu proyecto para usar TypeScript de manera nativa, proporcionando soporte completo para tipos estáticos y autocompletado en tu editor.

  • Optimizaciones de producción: Vite optimiza automáticamente tu aplicación para la producción, generando bundles eficientes y optimizando el rendimiento.

En resumen, npm create vite@latest es una forma rápida y conveniente de configurar un nuevo proyecto de React.js con TypeScript utilizando Vite como el entorno de desarrollo. Esto te permite comenzar rápidamente con la construcción de aplicaciones frontend modernas y optimizadas.

learn_typescript's People

Contributors

zolynux avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.