Skip to content

TypeScript en el Proyecto

  1. Errores en compilación, no en producción: Si escribes user.nmae en vez de user.name, TypeScript te avisa al instante
  2. Autocomplete inteligente: Tu editor sabe exactamente qué propiedades tiene cada objeto
  3. Refactoring seguro: Renombra una propiedad y TypeScript te muestra todos los lugares que debes actualizar
  4. Documentación viva: Los tipos son documentación que nunca se desactualiza

  • Prohibido any: Siempre. Usar unknown si no conoces el tipo y hacer type narrowing
  • Tipar todo explícitamente: Props, emits, retornos de funciones, estado reactivo
  • No // @ts-ignore: Nunca. Soluciona el error de tipo real

interface Props {
title: string
count?: number // opcional
variant?: 'primary' | 'secondary' // union literal
}
const props = defineProps<Props>()
const emit = defineEmits<{
update: [value: string] // emit con payload
close: [] // emit sin payload
}>()
const items = ref<Course[]>([]) // array tipado
const selected = ref<Course | null>(null) // puede ser null
const isLoading = ref(false) // inferido como boolean
// Firma genérica usada en la vertical config
type FunctionService<T, U = undefined> = U extends undefined
? (lang: LanguageCode) => Promise<T | null>
: (lang: LanguageCode, params: U) => Promise<T | null>

Esto significa: un servicio recibe siempre un idioma, opcionalmente parámetros, y retorna data o null.


CarpetaContieneEjemplo
app/types/Tipos simples, unions, auxiliaresLanguageCode, AlertType, LoginData
app/interfaces/Estructuras complejas de APILoginResponse, Expert, Product
app/interfaces/api/Contratos con StrapiResponses tipadas del CMS
  • ¿Objeto con múltiples propiedades que viene de API? → interfaces/
  • ¿Union type, enum, tipo auxiliar pequeño? → types/

types/common.d.ts
type LanguageCode = 'es' | 'en' | 'pt-BR'
type AlertType = 'error' | 'success'
type HexColor = `#${string}`
// types/services.d.ts
type FunctionService<T, U = undefined> = ...
// types/forms.d.ts
type FormField = { valid: boolean; showError: boolean }

Para arrays o objetos que son constantes literales:

export const SUBSCRIPTION_TYPES = ['annual', 'monthly'] as const
// Tipo inferido: readonly ['annual', 'monthly'] — no string[]
export const USER_ROLES = {
ADMIN: 'admin',
USER: 'user',
} as const

Derivar tipos automáticamente:

type SubscriptionType = (typeof SUBSCRIPTION_TYPES)[number] // 'annual' | 'monthly'
type UserRole = (typeof USER_ROLES)[keyof typeof USER_ROLES] // 'admin' | 'user'

Errores de tipo comunes y cómo resolverlos

Section titled “Errores de tipo comunes y cómo resolverlos”
ErrorSolución
Type 'X' is not assignable to type 'Y'Verifica que el tipo del valor coincide con lo declarado
Object is possibly 'null'Usa optional chaining (?.) o un guard (if (obj))
Property does not exist on typeEl tipo no tiene esa propiedad — verifica el nombre o amplía la interface
Argument of type 'string' is not assignable to parameter of type 'LanguageCode'Usa assertion (as LanguageCode) o valida el valor