Back to Tips
consejos mecanografía TypeScriptsintaxis TypeScriptanotaciones de tipo

Consejos de Mecanografía TypeScript: Domina la Sintaxis para Codificar Más Rápido

Aprende consejos esenciales para escribir código TypeScript más rápido. Desde anotaciones de tipo, genéricos e interfaces hasta tipos de utilidad y patrones avanzados, mejora tu velocidad y precisión de mecanografía en TypeScript.

TypeScript se ha convertido en el estándar para construir aplicaciones JavaScript escalables. Su potente sistema de tipos detecta errores en tiempo de compilación, pero escribir código TypeScript eficientemente requiere dominar sus patrones de sintaxis únicos. Esta guía completa te ayudará a escribir TypeScript más rápido y con menos errores.

Por Qué Importan las Habilidades de Mecanografía en TypeScript

TypeScript añade anotaciones de tipo sobre JavaScript, lo que significa más caracteres para escribir. Sin embargo, las ganancias de productividad al detectar errores temprano superan con creces las pulsaciones adicionales. Los desarrolladores que pueden escribir TypeScript con fluidez pasan menos tiempo depurando y más tiempo construyendo funcionalidades.

Símbolos Esenciales de TypeScript para Dominar

1

Dos puntos (:)

Usado para anotaciones de tipo después de variables, parámetros y tipos de retorno.

2

Corchetes angulares (<>)

Esenciales para genéricos, aserciones de tipo y elementos JSX.

3

Barra vertical (|)

Tipos de unión que combinan múltiples tipos.

4

Ampersand (&)

Tipos de intersección que combinan múltiples tipos.

5

Signo de interrogación (?)

Propiedades opcionales y encadenamiento opcional.

Patrones Básicos de Anotación de Tipos

Las anotaciones de tipo son la base de TypeScript. Practica hasta que sean automáticas:

typescript
const name: string = 'Alice';
const age: number = 30;
const isActive: boolean = true;
typescript
const items: string[] = ['a', 'b', 'c'];
const numbers: Array<number> = [1, 2, 3];
typescript
const user: { name: string; age: number } = {
  name: 'Bob',
  age: 25,
};

Patrones de Tipos de Función

Las funciones en TypeScript requieren anotaciones de parámetros y tipo de retorno:

typescript
function greet(name: string): string {
  return `Hello, ${name}!`;
}
typescript
const add = (a: number, b: number): number => {
  return a + b;
};
typescript
function fetchUser(id: number): Promise<User> {
  return api.get(`/users/${id}`);
}
typescript
function process(data: string, callback: (result: string) => void): void {
  callback(data.toUpperCase());
}

Patrones de Interface

Las interfaces definen la forma de los objetos y son fundamentales en TypeScript:

typescript
interface User {
  id: number;
  name: string;
  email: string;
}
typescript
interface Config {
  readonly apiUrl: string;
  timeout?: number;
  retries: number;
}
typescript
interface Repository<T> {
  find(id: number): Promise<T>;
  save(item: T): Promise<void>;
  delete(id: number): Promise<boolean>;
}
typescript
interface ApiResponse<T> {
  data: T;
  status: number;
  message: string;
}

Patrones de Alias de Tipo

Los alias de tipo crean nombres de tipo personalizados:

typescript
type ID = string | number;
typescript
type Status = 'pending' | 'active' | 'completed';
typescript
type Point = {
  x: number;
  y: number;
};
typescript
type Callback<T> = (data: T) => void;
typescript
type Nullable<T> = T | null | undefined;

Patrones de Genéricos

Los genéricos permiten código reutilizable y seguro en tipos:

typescript
function identity<T>(value: T): T {
  return value;
}
typescript
function map<T, U>(items: T[], fn: (item: T) => U): U[] {
  return items.map(fn);
}
typescript
class Container<T> {
  constructor(private value: T) {}
  getValue(): T {
    return this.value;
  }
}
typescript
interface State<T> {
  data: T;
  loading: boolean;
  error: Error | null;
}

Tipos de Unión e Intersección

Combina tipos para mayor flexibilidad:

typescript
type StringOrNumber = string | number;
typescript
type Result<T> = { success: true; data: T } | { success: false; error: string };
typescript
type Named = { name: string };
type Aged = { age: number };
type Person = Named & Aged;
typescript
function handle(value: string | number | boolean): void {
  if (typeof value === 'string') {
    console.log(value.toUpperCase());
  }
}

Patrones de Tipos de Utilidad

TypeScript proporciona tipos de utilidad incorporados:

typescript
type PartialUser = Partial<User>;
typescript
type RequiredConfig = Required<Config>;
typescript
type ReadonlyUser = Readonly<User>;
typescript
type UserKeys = keyof User;
typescript
type NameType = User['name'];
typescript
type UserWithoutId = Omit<User, 'id'>;
typescript
type UserIdAndName = Pick<User, 'id' | 'name'>;

Patrones de Clase

Las clases de TypeScript soportan modificadores de acceso e interfaces:

typescript
class User {
  constructor(
    public name: string,
    private age: number,
    readonly id: string
  ) {}
}
typescript
class Service implements IService {
  private cache: Map<string, Data> = new Map();

  async fetch(id: string): Promise<Data> {
    return this.cache.get(id) ?? await this.load(id);
  }
}
typescript
abstract class BaseRepository<T> {
  abstract find(id: number): Promise<T>;
  abstract save(item: T): Promise<void>;
}

Patrones de Type Guard

Los type guards estrechan tipos en tiempo de ejecución:

typescript
function isString(value: unknown): value is string {
  return typeof value === 'string';
}
typescript
function isUser(obj: unknown): obj is User {
  return typeof obj === 'object' && obj !== null && 'name' in obj;
}
typescript
if (value instanceof Date) {
  console.log(value.toISOString());
}

Patrones Asíncronos

Tipando correctamente código asíncrono:

typescript
async function fetchData(): Promise<Data[]> {
  const response = await fetch(url);
  return response.json();
}
typescript
const getData = async (): Promise<Result<User>> => {
  try {
    const user = await api.getUser();
    return { success: true, data: user };
  } catch (error) {
    return { success: false, error: String(error) };
  }
};

Patrones de React con TypeScript

Patrones comunes para aplicaciones React:

typescript
interface Props {
  title: string;
  onClick: () => void;
  children?: React.ReactNode;
}
typescript
const Button: React.FC<Props> = ({ title, onClick }) => {
  return <button onClick={onClick}>{title}</button>;
};
typescript
const [count, setCount] = useState<number>(0);
const [user, setUser] = useState<User | null>(null);
typescript
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  setValue(e.target.value);
};

Patrones de Módulos e Importación

Organizando código TypeScript:

typescript
import type { User, Config } from './types';
import { fetchUser, saveUser } from './api';
typescript
export interface ApiResponse<T> {
  data: T;
  status: number;
}
typescript
export type { User, Config };
export { UserService, ConfigService };

Consejos de Práctica para TypeScript

Enfócate en los corchetes angulares <> - aparecen constantemente en genéricos

Practica la colocación del dos puntos : después del nombre de variable y antes del tipo

Domina la barra vertical | para tipos de unión y el ampersand & para intersecciones

Familiarízate con la palabra clave extends para restricciones genéricas

Practica keyof, typeof y tipos de acceso indexado

Put these tips into practice!

Use DevType to type real code and improve your typing skills.

Start Practicing