truncateString
Paquete: @tiendana/utils
Trunca un string a una longitud máxima específica. Si el string es más corto que la longitud máxima, lo retorna sin cambios.
Características
✅ Truncado simple y directo
✅ Maneja valores null/undefined
✅ No añade ellipsis automáticamente
✅ Performance O(1)
Firma
function truncateString(
str: string,
maxLength: number
): string
Parámetros
| Parámetro | Tipo | Descripción | Requerido |
|---|---|---|---|
str | string | String a truncar | ✅ |
maxLength | number | Longitud máxima del string resultante | ✅ |
Retorno
Tipo: string
- Si
str.length <= maxLength: retorna el string original - Si
str.length > maxLength: retorna los primerosmaxLengthcaracteres
Ejemplos de Uso
Truncado Básico
import { truncateString } from '@tiendana/utils';
truncateString('Hola Mundo', 4);
// 'Hola'
truncateString('Texto corto', 20);
// 'Texto corto' - sin cambios, menor que maxLength
truncateString('', 10);
// ''
Con Ellipsis Manual
function truncateWithEllipsis(text: string, maxLength: number): string {
if (text.length <= maxLength) {
return text;
}
return truncateString(text, maxLength - 3) + '...';
}
truncateWithEllipsis('Este es un texto muy largo', 15);
// 'Este es un t...'
Preview de Artículos
interface Article {
title: string;
content: string;
}
function ArticleCard({ article }: { article: Article }) {
const preview = truncateString(article.content, 200) + '...';
return (
<div>
<h2>{article.title}</h2>
<p>{preview}</p>
<a href="#">Leer más</a>
</div>
);
}
Nombres de Archivo
function displayFileName(fileName: string): string {
const maxLength = 30;
if (fileName.length <= maxLength) {
return fileName;
}
// Mantener extensión visible
const extension = fileName.split('.').pop() || '';
const nameWithoutExt = fileName.slice(0, fileName.lastIndexOf('.'));
const truncatedName = truncateString(nameWithoutExt, maxLength - extension.length - 4);
return `${truncatedName}...${extension}`;
}
displayFileName('reporte-financiero-anual-2024-completo.pdf');
// 'reporte-financiero-a...pdf'
Tooltips
function Tooltip({ text }: { text: string }) {
const shortText = truncateString(text, 50);
const needsTooltip = text.length > 50;
return (
<span title={needsTooltip ? text : undefined}>
{shortText}
{needsTooltip && '...'}
</span>
);
}
Lista de Productos
const products = [
{ name: 'Laptop HP EliteBook 840 G8 Intel Core i7 16GB RAM', price: 999 },
{ name: 'Mouse Logitech MX Master 3', price: 99 }
];
function ProductList() {
return (
<ul>
{products.map(product => (
<li key={product.name}>
{truncateString(product.name, 40)}... - ${product.price}
</li>
))}
</ul>
);
}
Breadcrumbs
function Breadcrumb({ path }: { path: string }) {
const segments = path.split('/').filter(Boolean);
return (
<nav>
{segments.map((segment, i) => (
<span key={i}>
{truncateString(segment, 15)}
{i < segments.length - 1 && ' > '}
</span>
))}
</nav>
);
}
Notificaciones
interface Notification {
message: string;
type: 'info' | 'success' | 'error';
}
function NotificationToast({ notification }: { notification: Notification }) {
const shortMessage = truncateString(notification.message, 80);
return (
<div className={`toast toast-${notification.type}`}>
{shortMessage}
{notification.message.length > 80 && '...'}
</div>
);
}
Tablas Responsivas
function DataTable({ data }: { data: any[] }) {
return (
<table>
<tbody>
{data.map(row => (
<tr key={row.id}>
<td>{truncateString(row.description, 50)}</td>
<td>{row.date}</td>
<td>{row.amount}</td>
</tr>
))}
</tbody>
</table>
);
}
Casos de Uso Comunes
- Previews de contenido: Mostrar extractos de artículos, comentarios
- UI con espacio limitado: Cards, tooltips, breadcrumbs
- Nombres de archivo: Mostrar archivos largos en interfaces
- Tablas: Limitar ancho de celdas con texto largo
- Notificaciones: Mensajes cortos en toasts/snackbars
- SEO: Meta descriptions, titles truncados
Notas Técnicas
- Performance: O(1) - usa
slice()nativo de JavaScript - Null safety: Usa optional chaining
?.para manejar null/undefined - Sin ellipsis: No añade '...' automáticamente, debes agregarlo manualmente si lo necesitas
- Caracteres especiales: Trunca por cantidad de caracteres, no por ancho visual
- Unicode: Puede cortar en medio de emojis o caracteres multi-byte
- Inmutabilidad: No modifica el string original
Limitaciones
Caracteres Multi-byte
La función trunca por cantidad de caracteres JavaScript, no por code points Unicode. Puede cortar emojis o caracteres especiales:
truncateString('👨👩👧👦 Familia', 2);
// Puede resultar en caracteres rotos
Para manejar Unicode correctamente, considera usar:
function truncateUnicode(str: string, maxLength: number): string {
const chars = Array.from(str);
return chars.slice(0, maxLength).join('');
}
Implementación
export function truncateString(str: string, maxLength: number): string {
if (str?.length <= maxLength) {
return str;
}
return str?.slice(0, maxLength);
}
Ver También
- stringToSlug - Convertir a URL-friendly slug
- removeDiacritics - Remover acentos