TS
Resolutor de Errores de Build — TypeScript
NutriBot SaaS · Next.js 14 · TypeScript 5 · 7 errores → 0 errores
BUILD VERDE
7
Errores iniciales
0
Errores finales
9
Líneas cambiadas
5
Archivos tocados
Output inicial — npx tsc --noEmit --pretty
00:00$ npx tsc --noEmit --pretty
00:01src/app/dashboard/page.tsx(12,7): error TS2322: Type 'string | undefined' is not assignable to type 'string'.
00:01src/lib/api/nutrition.ts(34,15): error TS7006: Parameter 'userId' implicitly has an 'any' type.
00:01src/lib/api/nutrition.ts(58,10): error TS2339: Property 'dailyCalories' does not exist on type 'NutritionPlan'.
00:01src/components/PatientCard.tsx(23,5): error TS2741: Property 'onSelect' is missing in type '{ patient: Patient; }' but required in type 'PatientCardProps'.
00:01src/components/PatientCard.tsx(89,3): error TS2774: This condition will always return true since this function is always defined.
00:01src/hooks/useNutritionData.ts(15,14): error TS2345: Argument of type 'string | null' is not assignable to parameter of type 'string'.
00:01src/app/api/patients/route.ts(27,9): error TS1308: 'await' expression is only allowed within an async function.
00:01Found 7 errors.
Diagnóstico y Diffs (mínimos)
#1 TS2322 src/app/dashboard/page.tsx:12 HIGH
Type 'string | undefined' is not assignable to type 'string'.
dashboard/page.tsx línea 10–14
10 const params = useParams()
11
12 const patientId: string = params.id
12 const patientId = params.id as string
13
useParams() en Next.js 14 retorna Record<string, string | string[]>. Se añade as string porque el segmento [id] es siempre escalar. Fix mínimo: 1 línea.
#2 TS7006 src/lib/api/nutrition.ts:34 HIGH
Parameter 'userId' implicitly has an 'any' type.
nutrition.ts línea 32–36
32
34export async function getNutritionPlan(userId) {
34export async function getNutritionPlan(userId: string) {
35 const { data } = await supabase
36 .from('nutrition_plans')
Anotación de tipo explícita en el parámetro. El tsconfig tiene noImplicitAny: true activado. Fix mínimo: 1 token añadido.
#3 TS2339 src/lib/api/nutrition.ts:58 CRITICAL
Property 'dailyCalories' does not exist on type 'NutritionPlan'.
nutrition.ts interfaz NutritionPlan + línea 58
8interface NutritionPlan {
9 id: string
10 patientId: string
11 dailyCalories: number
12 createdAt: Date
13}
El campo daily_calories existe en la tabla Supabase pero faltaba en la interfaz TypeScript. Se añade la propiedad faltante. Sin cambios en lógica.
#4 TS2741 src/components/PatientCard.tsx:23 HIGH
Property 'onSelect' is missing in type '{ patient: Patient; }' but required in type 'PatientCardProps'.
PatientCard.tsx interfaz Props
5interface PatientCardProps {
6 patient: Patient
7 onSelect: () => void
7 onSelect?: () => void
8}
Se hace onSelect opcional con ?. El componente ya maneja el caso en que no se pasa (línea 89 llama con guard). Fix mínimo: 1 carácter.
#5 TS2774 src/components/PatientCard.tsx:89 MEDIUM
This condition will always return true since this function is always defined. Did you mean to call it instead?
PatientCard.tsx línea 87–91
87 const handleClick = () => {
89 if (onSelect) onSelect()
89 if (onSelect != null) onSelect()
90 }
Ahora que onSelect es opcional (() => void | undefined), el guard != null distingue correctamente undefined de una función definida. TS 5 detecta el caso anterior como siempre verdadero.
#6 TS2345 src/hooks/useNutritionData.ts:15 HIGH
Argument of type 'string | null' is not assignable to parameter of type 'string'.
useNutritionData.ts línea 13–17
13 const { data: session } = useSession()
14
15 const plan = getNutritionPlan(session?.user.id)
15 const plan = getNutritionPlan(session?.user.id ?? '')
16
session?.user.id puede ser undefined. Nullish coalescing ?? '' proporciona fallback seguro. La función ya retorna vacío cuando userId es '' (validación interna existente). Fix mínimo.
#7 TS1308 src/app/api/patients/route.ts:27 CRITICAL
'await' expression is only allowed within an async function.
api/patients/route.ts línea 25–29
25export function GET(req: Request) {
25export function GET(req: Request) {
25export async function GET(req: Request) {
26
27 const { data } = await fetchPatients()
Faltaba la keyword async en el handler de la Route API. Next.js 14 no lo añade automáticamente. Fix mínimo: 1 palabra clave.
Output final — build en verde
00:12$ npx tsc --noEmit --pretty
00:13Done in 1.42s — 0 errors.
00:14$ npm run build
00:14 ▲ Next.js 14.2.3
00:15 ✓ Creating an optimized production build
00:22 ✓ Compiled successfully
00:22 ✓ Linting and checking validity of types
00:23 ✓ Collecting page data
00:24 ✓ Generating static pages (12/12)
00:24 ✓ Build complete — ready for deploy

✓ Build en verde

7 errores resueltos · 9 líneas modificadas · 0 arquitectura alterada · deploy desbloqueado en Vercel

npx tsc --noEmit && npm run build → exit 0
Resumen de cambios
# Archivo Error TS Fix aplicado Líneas
1 dashboard/page.tsx:12 TS2322 Añadido as string al acceso de params +1 / -1
2 nutrition.ts:34 TS7006 Anotado parámetro userId: string +0 / -0 (inline)
3 nutrition.ts (interfaz) TS2339 Añadida propiedad dailyCalories: number +1 / -0
4 PatientCard.tsx:7 TS2741 Hecho onSelect? opcional +1 / -1
5 PatientCard.tsx:89 TS2774 Guard cambiado a != null +1 / -1
6 useNutritionData.ts:15 TS2345 Añadido fallback ?? '' +1 / -1
7 api/patients/route.ts:25 TS1308 Añadida keyword async al handler GET +1 / -1