| name | expo-types |
| description | Patrones de TypeScript: interfaces, tipos compartidos, strict mode. Trigger: Cuando se definen interfaces, se trabaja con tipos compartidos, o se sigue TypeScript patterns.
|
| license | MIT |
| metadata | {"author":"myquota","version":"1.0","auto_invoke":["Defining interfaces","Working with shared types","Using TypeScript patterns"]} |
Propósito
Mantener tipado consistente en MyQuota App con TypeScript strict mode.
Ubicación de Tipos
src/
├── shared/types/ # Interfaces usadas en múltiples features
│ ├── creditCard.ts
│ ├── transaction.ts
│ ├── quota.ts
│ ├── billingPeriod.ts
│ ├── user.ts
│ └── category.ts
│
└── features/<feature>/types/ # Interfaces de un solo feature
└── featureSpecific.ts
Regla de Ubicación
| Situación | Ubicación |
|---|
| Interface usada en 1 feature | features/<feature>/types/ |
| Interface usada en 2+ features | shared/types/ |
| DTOs para crear/actualizar | Junto a la interface principal |
Template: Interface de Entidad
export interface CreditCard {
id: string;
createdAt: string;
updatedAt: string;
deletedAt?: string | null;
name: string;
lastFourDigits: string;
color: string;
closingDay: number;
paymentDay: number;
}
export interface CreateCreditCardDto {
name: string;
lastFourDigits: string;
color: string;
closingDay: number;
paymentDay: number;
}
export type UpdateCreditCardDto = Partial<CreateCreditCardDto>;
Template: Props de Componente
interface CreditCardItemProps {
card: CreditCard;
onPress?: () => void;
showActions?: boolean;
}
export default function CreditCardItem({
card,
onPress,
showActions = false,
}: CreditCardItemProps) {
}
Fechas
El backend devuelve ISO strings, no objetos Date:
export interface BillingPeriod {
id: string;
startDate: string;
endDate: string;
closingDate: string;
}
export interface BillingPeriod {
startDate: Date;
}
Opcionales
deletedAt?: string | null;
description: string | null;
showActions?: boolean;
Uniones y Literales
type TransactionStatus = "pending" | "completed" | "cancelled";
export interface Transaction {
id: string;
status: TransactionStatus;
type: "purchase" | "payment" | "refund";
}
Interfaces vs Types
interface CreditCard {
id: string;
name: string;
}
type PaymentMethod = CreditCard | BankAccount;
type CreditCardWithStats = CreditCard & { totalDebt: number };
type UpdateDto = Partial<CreateDto>;
type IdOnly = Pick<CreditCard, "id">;
Sincronización con Backend
Ver skill sync-types para detalles.
Regla: Los campos deben reflejar los modelos del backend:
| Backend (model.ts) | Frontend (types/) |
|---|
CreditCard | CreditCard |
Transaction | Transaction |
BillingPeriod | BillingPeriod |
Reglas Estrictas
PROHIBIDO any
const data: any = response.json();
const data: CreditCard[] = await response.json();
const data: unknown = await response.json();
if (isValidResponse(data)) {
}
Return Types Explícitos
export const getCards = async (): Promise<CreditCard[]> => {
};
export function useCreditCards(): {
cards: CreditCard[];
loading: boolean;
error: string | null;
refresh: () => void;
} {
}
Anti-patterns
const items: any[] = [];
interface CreditCard { ... }
interface CreditCard { ... }
const [cards, setCards] = useState<{ id: string; name: string }[]>([]);
function MyComponent(props) {
startDate: Date;
Checklist