Software engineering
typescript
Apuntes TypeScript 🔥
Compilación y configuración
- Compilar con
tsc - Superset de JavaScript: agrega tipado estático y comprobaciones en tiempo de compilación
- TypeScript como herramienta de desarrollo y static checking
Tipos básicos
any,unknown,never- Arrays y tuplas
- Tuples permiten varios tipos, no usar
.push()directamente
- Tuples permiten varios tipos, no usar
- Enum
- Definir estados en DB, tallas, loadingState
- Usar PascalCase
- Crear const con estados de API
- Genera código IIFE
- Acceso a keys y valores con Object.values()
- Usar
as constpara mantener inmutabilidad
Inferencia y tipado explícito
- Tipos inferidos permiten acceso a métodos según tipo
- Inicializar propiedades con tipado explícito
- Propiedades:
- Opcionales con
? readonly id: number- Combinación con enums para valores fijos
- Opcionales con
- Definir objetos con
type Persona = {}y hacerlos inalterables - Composición: objetos dentro de objetos, arreglos de objetos
- Interfaces para tipado estructurado
- TypeScript docs
Avanzado
- Enum vs const enum para tipado
- Type alias y custom types:
type a = "b" - Union
|vs Intersection&- Union permite uno u otro tipo
- Intersection combina propiedades
unknownvsany- Casting con
aso<[]>a unknownexige castear antes de usar
- Casting con
- Generics
<T>:<T>(x:T) => x- Problemas al usar
typeofen condicionales
- Problemas al usar
- Functional overloading: definir distintos retornos según parámetros
- Operador
inpara verificar existencia de propiedades keyofy dependencia tipada:type Dependant<T extends {[prop: string]: any}> = T["prop"]
Clases y patrones
- Clases abstractas
abstract class Em {}- Extender solo mediante clases hijas
class Am extends Em {} - Constructor y métodos abstractos
- Jerarquía de clases y template pattern
- Propiedades privadas y públicas
- Métodos getter y abstractos:
abstract getSalary(): number - Ejemplos prácticos: listar información con distintos formatos, desuscribirse en
ngOnDestroy
Otros conceptos clave
Record, alias, optional?,!para propiedades por defectoaspara type assertion- Rest operator vs args operator
- Inference vs explicit types
Recursos y cursos
- Te enseño TODO de TypeScript con una Master Class #programacion #frontend #backend #typescript - YouTube
- Clases abstractas con Typescript + Patrones de diseño - YouTube
- Let’s Fix The Fatal Flaw in TypeScript’s Union Types! - YouTube
- Learn TypeScript – Full Tutorial
- video next typescript y shacdn
- video Next + TS
- You Might Be Using Typescript Wrong… - YouTube
- Practical TypeScript – Course for Beginners - YouTube
Cursos prácticos
- Fullstack TypeScript GraphQL & Node.js
- API, queries
- Twitter Clone
nvm use 16- Errores en
yarn dev
- GraphQL vs RESTful API
- Optimización de consultas costosas
- Next.js + TypeScript + shadcn/ui
- Integración de frontend moderno
- Gestión de tipos y estados
Fundamentos y Arquitectura de TypeScript
Fundamentos de TypeScript
Qué es TypeScript
- Superset de JavaScript que añade tipado estático y comprobaciones en tiempo de compilación
- Permite detectar errores antes de ejecutar el código
- Mejora mantenibilidad y escalabilidad en proyectos grandes
- Compatible con cualquier código JavaScript existente
- Proporciona herramientas avanzadas para desarrollo frontend y backend
Tipos de datos
- Primitivos:
string,number,boolean,symbol,bigint,null,undefined - Any y Unknown
any: deshabilita el tipado, permite cualquier valorunknown: exige validación/casteo antes de usar
- Never
- Indica que una función nunca retorna o siempre lanza un error
- Arrays y Tuples
- Arrays homogéneos:
number[] - Tuples: tipos heterogéneos con posición fija
[string, number] - Uso de
readonlypara inmutabilidad
- Arrays homogéneos:
- Enums
- Definen un conjunto de valores con nombres
- Usados para estados, configuraciones, flags
- Const enum para optimización y tipado
Tipado avanzado
- Interfaces
- Describen la forma de un objeto
- Se pueden extender y combinar
- Type Alias
- Definen tipos personalizados
- Combinables con unions
|e intersections&
- Generics
<T>- Permiten crear funciones, clases y tipos reutilizables
- Mantienen tipado flexible y seguro
- Keyof y Mapped Types
keyof T: obtiene las claves de un tipo- Mapped types permiten modificar tipos existentes
Funciones y objetos
- Tipado de parámetros y retorno
- Opcionales
?y valores por defecto - Desestructuración con tipado
- Functional overloading: funciones con distintos tipos de entrada y salida
Clases y patrones
- Clases abstractas y herencia
abstract classcomo base para extender- Métodos abstractos y propiedades definidas
- Modificadores de acceso:
public,private,protected,readonly - Implementación de interfaces en clases
- Patrones de diseño aplicables (Template Pattern, Singleton, Strategy)
Manejo de errores y seguridad de tipos
- Type assertions (
as) y casting - Control de tipos con
in,typeof,instanceof - Manejo seguro de propiedades opcionales
?y!
Arquitectura de TypeScript en proyectos
Organización del proyecto
- Separación de módulos y capas (DOM, UI, lógica, datos)
- Uso de
tsconfig.jsonpara configurar compilación y target JS - Modularización: export/import, namespaces y ES Modules
- Gestión de dependencias y librerías externas con tipado (
@types/...)
Estrategias de tipado
- Tipado explícito vs inferido
- Uso de interfaces y types para APIs y contratos
- Composición de tipos para objetos complejos
- Uso de enums y const assertions para estados y configuraciones
- Generics para reutilización de componentes y funciones
Integración con frameworks
- Angular: tipado fuerte en componentes, servicios y formularios
- Next.js: tipado de props y APIs, integración con GraphQL
- Node.js: tipado en servicios backend, manejo de errores y validación de datos
Testing y mantenimiento
- Tipado reduce errores en runtime
- Compatible con Jest, Mocha, y otros frameworks
- Integración con linters y formateadores (ESLint, Prettier)
- Mejora la escalabilidad y mantenibilidad de grandes proyectos
Performance y compilación
- Compilación a JavaScript compatible con distintos entornos (
ES5,ES6,ESNext) - Optimización de enums y const assertions para evitar sobrecarga
- Uso de
tsc --watchpara desarrollo en tiempo real
TypeScript: Avanzado, Fundamentos y Arquitectura Completa
Tipos y Manejo Avanzado
Literal Types
- Permiten restringir valores a literales específicos
- Ej:
type Size = "S" | "M" | "L" - Útiles para estados fijos, configuraciones o flags
- Ej:
Conditional Types
- Tipos que dependen de condiciones
- Ej:
type MessageOf<T> = T extends { message: unknown } ? T['message'] : never - Base para utilidades genéricas y abstracciones de librerías
- Ej:
Utility Types
- Tipos predefinidos para transformar otros tipos
Partial<T>: hace opcionales todas las propiedadesRequired<T>: hace obligatorias todas las propiedadesReadonly<T>: convierte propiedades en solo lecturaPick<T, K>/Omit<T, K>: seleccionar o excluir propiedadesRecord<K, T>: define un objeto con claves K y valores T
Advanced Generics
- Generics con constraints: limitar tipos aceptados
T extends string | number
- Generics anidados y combinados con conditional types
- Generics en clases, interfaces y funciones para máxima flexibilidad
Template Literal Types
- Construcción de tipos usando literales de string
- Ej:
type EventName<T extends string> =${T}Changed``
- Ej:
Mapped & Indexed Types Avanzados
- Transformar todos los keys de un tipo:
type OptionsFlags<Type> = { [Property in keyof Type]: boolean } - Index signatures dinámicos con
keyofyin
Arquitectura de Código y Escalabilidad
Organización por Capas
- Domain Layer: lógica de negocio, entidades y reglas
- Service Layer: servicios y APIs, comunicación con backend
- UI Layer: componentes, hooks, vistas
- Shared Layer: utilidades, tipos y constantes compartidas
Modularidad y Mantenibilidad
- Uso de
barrel files(index.ts) para exportar múltiples módulos - Separación de interfaces y tipos en carpetas
types/ointerfaces/ - Patrones de diseño aplicables:
- Factory, Singleton, Strategy, Observer, Template
- Dependency Injection para desacoplar dependencias y mejorar testabilidad
Buenas Prácticas de Tipado
- Siempre usar interfaces para contratos públicos de objetos
- Preferir
as constpara valores inmutables - Evitar
anyyunknownsalvo casos justificados - Validación de datos entrantes con tipos estrictos y schemas (zod, io-ts)
- Uso de enums y literal types para estados controlados
Integración con Frameworks Modernos
- Next.js: tipado de props, API routes y SWR/hooks
- Angular: servicios, formularios reactivos y observables tipados
- Node.js / Express: DTOs tipados, validación de inputs, patrones de servicios
- GraphQL: queries y mutations tipadas, autogeneración de tipos con codegen
Testing Tipado
- Unit testing con Jest o Vitest usando tipos
- Testeo de utilidades genéricas y funciones puras
- Mocking y tipado seguro en dependencias
- Integración con linters y herramientas de calidad (
ESLint,ts-prune)
Optimización y Compilación
Configuración de tsconfig.json
strict: truepara máxima seguridad de tiposnoImplicitAny,strictNullChecks,strictFunctionTypestarget,moduleylibsegún el entorno de ejecuciónpathsybaseUrlpara resolución de módulos escalable
Performance y Bundling
- Const enums para evitar código extra en runtime
- Optimización de tipos y módulos para tree-shaking
- Uso de
tsc --incrementaly build caching - Integración con Vite, Webpack o esbuild
Herramientas y Recursos Avanzados
- TypeScript Language Server (autocompletado y diagnósticos)
- Linters: ESLint con plugin
@typescript-eslint - Formatter: Prettier + soporte TS
- Validadores de runtime: Zod, io-ts, Yup
- Code generators: GraphQL Codegen, OpenAPI TS client
Generics en TypeScript
Concepto
- Los generics permiten crear componentes, funciones y clases reutilizables que mantienen tipado seguro.
- Permiten parametrizar tipos, evitando el uso de
anyy aumentando la flexibilidad del código. - Sintaxis básica:
<T>dondeTrepresenta un tipo genérico.
Uso en Funciones
Función genérica simple
function identity<T>(arg: T): T {
return arg;
}
const num = identity<number>(42); // número
const str = identity<string>("Hola"); // string
`
Inferencia de tipos
- TypeScript infiere automáticamente el tipo de
Tsegún el argumento pasado:
const inferred = identity("texto"); // T inferido como string
Funciones con múltiples generics
function merge<T, U>(obj1: T, obj2: U): T & U {
return { ...obj1, ...obj2 };
}
const combined = merge({ name: "Alice" }, { age: 25 });
// combined es { name: string; age: number }
Uso en Clases
Clase genérica
class Box<T> {
private contents: T;
constructor(value: T) {
this.contents = value;
}
getContents(): T {
return this.contents;
}
}
const numberBox = new Box<number>(100);
const stringBox = new Box<string>("Texto");
Generics con herencia
class SpecialBox<T extends { name: string }> {
constructor(private item: T) {}
getName(): string {
return this.item.name;
}
}
const box = new SpecialBox({ name: "Alice", age: 25 });
Uso en Interfaces y Tipos
Interface genérica
interface KeyValue<K, V> {
key: K;
value: V;
}
const pair: KeyValue<string, number> = { key: "edad", value: 30 };
Type alias genérico
type Response<T> = {
data: T;
error?: string;
};
const userResponse: Response<{ id: number; name: string }> = {
data: { id: 1, name: "Alice" },
};
Constraints y Utilidades
Restricciones (extends)
- Limitar los tipos permitidos para un generic:
function logLength<T extends { length: number }>(arg: T): void {
console.log(arg.length);
}
logLength([1, 2, 3]); // 3
logLength("Hola TS"); // 7
Default Generics
- Definir un tipo por defecto si no se pasa un generic:
function createArray<T = string>(items: T[]): T[] {
return [...items];
}
const defaultArray = createArray(["a", "b"]); // T inferido como string
Generics Avanzados
Conditional Generics
type ElementType<T> = T extends (infer U)[] ? U : T;
type StrType = ElementType<string[]>; // string
Mapped Types con Generics
type ReadonlyProps<T> = {
readonly [K in keyof T]: T[K];
};
type User = { id: number; name: string };
type ReadonlyUser = ReadonlyProps<User>; // { readonly id: number; readonly name: string }
Aplicaciones prácticas
- Tipado de formularios dinámicos
- Wrappers de APIs genéricas
- Componentes React con props tipadas
- Colecciones y estructuras de datos reutilizables
Buenas prácticas
- Evitar abusar de
any; usar generics para mantener tipado seguro - Nombrar generics de manera descriptiva (
T,U,K,Vpara claves/valores) - Usar constraints (
extends) cuando se necesita un comportamiento mínimo - Combinarlos con type alias, interfaces y mapped types para crear APIs robustas
TypeScript Cheatsheet 2025 – Fundamentos, Avanzado y Arquitectura
1. Tipos Básicos
string,number,boolean,bigint,symbol,null,undefinedany: desactiva tipadounknown: requiere casting antes de usarnever: función que nunca retorna o lanza error- Arrays:
number[],[string, number](tuples) - Readonly arrays:
readonly number[] - Enum:
enum Size { S = "S", M = "M", L = "L" }
`
- Const enum: optimiza runtime y tipado
2. Tipado Avanzado
- Interfaces:
interface User { id: number; name: string } - Type alias:
type ID = number | string - Union
|e Intersection& - Literal types:
type Direction = "left" | "right" - Generics
<T>: reutilización con tipado seguro - Conditional Types:
type MessageOf<T> = T extends { message: unknown } ? T['message'] : never
- Mapped Types:
[K in keyof T]: T[K] - Template literal types:
type Event<T extends string> = `${T}Changed`
3. Funciones
- Tipado parámetros y retorno:
function sum(a: number, b: number): number {} - Optional
?y default params - Functional overloading: distintas firmas según entrada
- Rest operator:
...args: number[]
4. Clases y Objetos
- Clases y herencia:
abstract class Em { abstract getSalary(): number }
class Am extends Em { getSalary() { return 1000; } }
- Modificadores:
public,private,protected,readonly - Getter/Setter:
get fullName(): string { return this.name; } - Interfaces implementadas por clases
- Abstract classes: base para extensiones, no se instancian
5. Generics
- Funciones:
function identity<T>(arg: T): T { return arg; }
- Clases genéricas:
class Box<T> { constructor(private value: T) {} getContents(): T { return this.value; } }
- Constraints:
T extends { length: number } - Type alias genéricos:
type Response<T> = { data: T; error?: string } - Mapped types genéricos:
[K in keyof T]: T[K]
6. Utilidades y Helpers
- Utility Types:
Partial<T>,Required<T>,Readonly<T>,Pick<T, K>,Omit<T, K>,Record<K, T> - Type assertion:
value as stringo<string>value - keyof: obtener claves de un tipo
- in: comprobar propiedad existente
- Object.values() y Object.keys() con tipado
7. Tipos de datos y estados
- Optional properties:
prop?: string - Non-null assertion:
prop! - Readonly properties:
readonly id: number - Tuples y arrays:
[string, number],number[] - Enum y literal types para estados controlados
8. Arquitectura de Proyectos
-
Capas:
- Domain Layer: entidades y lógica
- Service Layer: APIs, servicios
- UI Layer: componentes, hooks
- Shared Layer: utilidades, tipos
- Modularidad: barrel files, index.ts
-
tsconfig.json:
strict: true,noImplicitAny,strictNullChecks,strictFunctionTypestarget,module,lib,paths,baseUrl
- Testing tipado: Jest, Vitest, mocks seguros
- Integración con frameworks: Angular, Next.js, Node.js, GraphQL
9. Buenas Prácticas
- Evitar
any; preferir generics o union types - Usar interfaces para contratos
- Prefiere
as constpara valores inmutables - Separar tipos en
types/ointerfaces/ - Validar datos entrantes con zod, io-ts o Yup
- Mantener código escalable y modular
TypeScript 2025 – Referencia Completa y Avanzada
1. Tipos Básicos
string,number,boolean,bigint,symbol,null,undefinedany: desactiva tipadounknown: requiere casting antes de usarnever: función que nunca retorna o siempre lanza error- Arrays:
number[],[string, number](tuples) - Readonly arrays:
readonly number[] - Enum:
enum Size { S = "S", M = "M", L = "L" }
`
- Const enum: optimiza runtime y tipado
2. Tipos Avanzados
- Interfaces:
interface User { id: number; name: string } - Type alias:
type ID = number | string - Union
|e Intersection& - Literal types:
type Direction = "left" | "right" - Generics
<T>: funciones, clases, interfaces reutilizables - Conditional types:
type MessageOf<T> = T extends { message: unknown } ? T['message'] : never - Mapped types:
[K in keyof T]: T[K] - Template literal types:
type Event<T extends string> = `${T}Changed` - Recursive types: para estructuras anidadas como árboles o JSON
3. Funciones
- Tipado de parámetros y retorno:
function sum(a: number, b: number): number {} - Optional
?y valores por defecto - Rest parameters:
...args: number[] - Functional overloading: distintas firmas según entrada
4. Clases y Objetos
- Clases y herencia:
abstract class Em { abstract getSalary(): number }
class Am extends Em { getSalary() { return 1000; } }
- Modificadores:
public,private,protected,readonly - Getter/Setter
- Abstract classes: no se instancian directamente
- Interfaces implementadas por clases
- Mixins y composición: combinar funcionalidades de múltiples clases
5. Generics
- Funciones:
function identity<T>(arg: T): T { return arg; }
- Clases:
class Box<T> { constructor(private value: T) {} getContents(): T { return this.value; } }
- Constraints:
T extends { length: number } - Multiple generics:
function merge<T, U>(a: T, b: U): T & U - Mapped types genéricos:
[K in keyof T]: T[K] - Utility types:
Partial<T>,Required<T>,Readonly<T>,Pick<T, K>,Omit<T, K>,Record<K, T>
6. Decorators
- Añaden metadatos o lógica a clases, métodos, propiedades o parámetros
- Ejemplo:
function Logger(target: Function) { console.log(`Class ${target.name} created`); }
@Logger
class Person {}
- Tipos: class, property, method, parameter
- Usados en Angular y NestJS
7. Namespaces y Modules
- Namespaces: organizar código sin módulos (menos usado hoy)
- Modules:
exportyimportpara encapsular lógica - Recomendación: usar ES Modules para proyectos modernos
8. Ambient Declarations y Tipos Externos
declarepara variables globales o librerías JS:
declare const myGlobalVar: string;
@types/para tipado de librerías externas no escritas en TS
9. Runtime Type Checking
- TS es compile-time only
- Librerías para validación en runtime:
zod,io-ts,Yup
10. Herramientas de Manipulación Avanzadas
keyof,in,as const,instanceof,typeof-
Utility Types:
NonNullable<T>Parameters<T>yReturnType<T>InstanceType<T>- Custom mapped types:
RequiredKeys<T>,OptionalKeys<T>
11. Arquitectura de Proyectos
-
Capas:
- Domain Layer: entidades y lógica
- Service Layer: APIs, servicios
- UI Layer: componentes, hooks
- Shared Layer: utilidades y tipos
- Barrel files (
index.ts) para exportaciones -
tsconfig.json:
strict: true,noImplicitAny,strictNullChecks,strictFunctionTypestarget,module,lib,paths,baseUrl
- Testing tipado: Jest, Vitest
- Validación de datos y schemas
- Integración con frameworks: Angular, Next.js, Node.js, GraphQL
12. Buenas Prácticas
- Evitar
any, usar generics o union types - Interfaces para contratos públicos
as constpara inmutabilidad- Separar tipos en
types/ointerfaces/ - Validar datos entrantes
- Modularidad y escalabilidad en grandes proyectos
13. Estrategias de Migración y Escalabilidad
- Migración gradual de JS a TS (
allowJs: true) - Uso de
strictmode para seguridad de tipos - Alias y paths en tsconfig para imports limpios
- Separación de capas y responsabilidades para equipos grandes
Recursos Avanzados TypeScript 2025
Artículos y Blogs
- TypeScript Patterns That Will Make You a Better Developer in 2025
- Patrones avanzados: utility types, conditional types, arquitecturas
- grizzly-agency.com
- 15 Advanced TypeScript Patterns Every Developer Must Master in 2025
- Patrones prácticos y ejemplos complejos
- aimbytes.com
- Mastering TypeScript in 2025: Advanced Concepts & Pro-Level Patterns
- Generics, inferencia, decoradores, arquitectura
- medium.com
- TypeScript Mastery Guide: Advanced Concepts, Patterns & Pro Tips
- Técnicas pro, escalabilidad, mejores prácticas
- medium.com
- Mastering TypeScript in 2025: Advanced Patterns for Scalable and Robust Applications
- Composición de tipos y patrones a gran escala
- medium.com
- Sumérgete en TypeScript Avanzado
- Validación con Zod, type guards y migración
- gitnation.com
Cursos y Talleres
- Advanced TypeScript Workshop (AngularArchitects)
- Taller: tipos avanzados, generics, mapped types, conditional types
- angulararchitects.io
- Advanced TypeScript with OOP (Coursera / Edureka)
- OOP, decoradores, tipos utilitarios
- coursera.org
- Master en TypeScript, JavaScript Moderno, ES2025, APIs HTML5 (Udemy)
- Curso completo en español
- udemy.com
- Curso de TypeScript (PDF) por Diego Saavedra
- Teoría y ejemplos prácticos
- statick88.github.io
- TypeScript Tutorial PDF (riptutorial.com)
- Tutorial con ejemplos prácticos
- riptutorial.com
Investigación y Papers
- Dynamic Program Slices Change How Developers Diagnose Gradual Run-Time Type Errors
- Debugging de errores de tipo en runtime
- arxiv.org
- TypeScript’s Evolution: An Analysis of Feature Adoption Over Time
- Cómo se adoptan nuevas características en proyectos reales
- arxiv.org
- LambdaNet: Probabilistic Type Inference using Graph Neural Networks
- Inferencia de tipos mediante redes neuronales
- arxiv.org
# omnivore typescript
base type: list name: “Notas con #typescript en Omnivore” order:
- property: date_saved direction: desc columns:
- file.name
- date_saved
filters:
and:
- file.inFolder(“Omnivore”)
- file.hasTag(“typescript”, “Typescript”) views:
- type: table
name: Table
sort:
- property: file.mtime direction: DESC
```
¿Te gusta este contenido? Suscríbete vía RSS