{"id":1327,"date":"2026-03-29T23:05:39","date_gmt":"2026-03-30T02:05:39","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/"},"modified":"2026-03-29T23:05:39","modified_gmt":"2026-03-30T02:05:39","slug":"pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/","title":{"rendered":"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda"},"content":{"rendered":"\n<p>Si llevas un tiempo trabajando con Angular, ya sabes de memoria la situaci\u00f3n: necesit\u00e1s mostrar una fecha relativa (\u00abhace 3 d\u00edas\u00bb), truncar un texto largo, filtrar un array de objetos, o formatear bytes en algo legible. Y cada vez termin\u00e1s buscando en Stack Overflow, escribiendo la misma l\u00f3gica de siempre, o creando un pipe custom que ya hiciste en tres proyectos anteriores.<\/p>\n\n\n\n<p>\u00bfY si todos esos pipes ya estuvieran listos para usar? Eso es exactamente lo que propone <a href=\"https:\/\/ngx-transforms.vercel.app\/\" target=\"_blank\" rel=\"noopener\">ngx-transforms<\/a>: una colecci\u00f3n de pipes de Angular listos para importar y usar en tu template, sin escribir una l\u00ednea de l\u00f3gica extra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es ngx-transforms?<\/h2>\n\n\n\n<p>ngx-transforms es una librer\u00eda de pipes para Angular que re\u00fane las transformaciones m\u00e1s comunes que cualquier desarrollador necesita en el d\u00eda a d\u00eda. La idea es simple: en lugar de implementar la misma l\u00f3gica una y otra vez en cada proyecto, la instal\u00e1s una sola vez y la ten\u00e9s disponible en todos tus componentes.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install ngx-transforms --save<\/code><\/pre>\n\n\n\n<p>Una vez instalada, pod\u00e9s importar los pipes directamente en tus componentes standalone o en tu m\u00f3dulo, y usarlos directamente en el template.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El dolor que resuelve: el ciclo del pipe custom<\/h2>\n\n\n\n<p>Todo Angular developer ha vivido esta secuencia al menos una vez (o veinte):<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Necesit\u00e1s mostrar \u00abhace 5 minutos\u00bb en lugar de un timestamp<\/li>\n<li>Angular no tiene ese pipe built-in<\/li>\n<li>Cre\u00e1s <code>time-ago.pipe.ts<\/code> con tu propia implementaci\u00f3n<\/li>\n<li>Dos proyectos despu\u00e9s, hac\u00e9s copy-paste de ese mismo archivo<\/li>\n<li>En el tercer proyecto, el copy-paste tiene un bug que ya hab\u00edas corregido en el original<\/li>\n<\/ol>\n\n\n\n<p>Con una librer\u00eda de pipes como ngx-transforms, este ciclo desaparece. La l\u00f3gica est\u00e1 testeada, mantenida y disponible con un simple import.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes de texto: los que m\u00e1s vas a usar<\/h2>\n\n\n\n<p>La manipulaci\u00f3n de strings es una de las tareas m\u00e1s frecuentes en cualquier UI. Algunos pipes que te cambian la vida:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Truncar texto largo con elipsis -->\n{{ descripcion | truncate:100 }}\n{{ descripcion | truncate:100:'...' }}\n\n&lt;!-- Primera letra en may\u00fascula (no toda la palabra) -->\n{{ 'hola mundo' | ucFirst }}\n&lt;!-- Output: \"Hola mundo\" -->\n\n&lt;!-- Slugify para URLs amigables -->\n{{ 'Mi Art\u00edculo de Blog' | slugify }}\n&lt;!-- Output: \"mi-articulo-de-blog\" -->\n\n&lt;!-- Camelcase -->\n{{ 'nombre_de_variable' | camelize }}\n&lt;!-- Output: \"nombreDeVariable\" -->\n\n&lt;!-- Repetir texto -->\n{{ '&#x2b50;' | repeat:5 }}\n&lt;!-- Output: \"&#x2b50;&#x2b50;&#x2b50;&#x2b50;&#x2b50;\" -->\n\n&lt;!-- Limpiar HTML tags de un string -->\n{{ contenidoHTML | stripTags }}\n\n&lt;!-- Pluralizar autom\u00e1ticamente -->\n{{ cantidad }} {{ 'comentario' | makePluralString:cantidad }}<\/code><\/pre>\n\n\n\n<p>Todos estos casos surgen constantemente en el desarrollo de interfaces: cards con texto limitado, badges, slugs para rutas, labels din\u00e1micos. Tenerlos como pipe evita l\u00f3gica en el componente y mantiene el template limpio y declarativo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes de fechas: adi\u00f3s al boilerplate de Moment.js<\/h2>\n\n\n\n<p>El pipe m\u00e1s pedido que Angular no trae de f\u00e1brica: fechas relativas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Fechas relativas (timeAgo) -->\n{{ post.createdAt | timeAgo }}\n&lt;!-- Output: \"hace 3 minutos\", \"ayer\", \"la semana pasada\" -->\n\n&lt;!-- Comparado con el enfoque manual sin pipe -->\n&lt;span>{{ getTimeAgo(post.createdAt) }}&lt;\/span>\n&lt;!-- &#x261d;&#xfe0f; Requiere l\u00f3gica en el componente, no es reactive, es m\u00e1s dif\u00edcil de testear --><\/code><\/pre>\n\n\n\n<p>El pipe <code>timeAgo<\/code> es una alternativa liviana a Moment.js o date-fns para este caso de uso puntual. Se integra perfectamente con el sistema de Change Detection de Angular y no requiere importar una librer\u00eda de fechas completa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes de arrays: filtrar, ordenar y agrupar en el template<\/h2>\n\n\n\n<p>Uno de los casos de uso m\u00e1s poderosos: manipular colecciones directamente en el template sin procesar datos en el componente.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Filtrar array de objetos -->\n@for (user of usuarios | filterBy:['activo']:true; track user.id) {\n  &lt;app-user-card [user]=\"user\" \/>\n}\n\n&lt;!-- Ordenar por propiedad -->\n@for (producto of productos | orderBy:'precio'; track producto.id) {\n  &lt;app-producto [data]=\"producto\" \/>\n}\n\n&lt;!-- Ordenar descendente -->\n@for (nota of notas | orderBy:'-fecha'; track nota.id) {\n  &lt;app-nota [nota]=\"nota\" \/>\n}\n\n&lt;!-- Agrupar por categor\u00eda -->\n@for (grupo of productos | groupBy:'categoria' | keyvalue; track grupo.key) {\n  &lt;h3>{{ grupo.key }}&lt;\/h3>\n  @for (item of grupo.value; track item.id) {\n    &lt;app-producto [data]=\"item\" \/>\n  }\n}\n\n&lt;!-- Valores \u00fanicos -->\n{{ tags | unique | json }}\n\n&lt;!-- Aplanar array anidado -->\n{{ matrizDeNumeros | flatten }}<\/code><\/pre>\n\n\n\n<p><strong>Nota sobre performance:<\/strong> Los pipes de array (filterBy, orderBy) suelen ser <em>impure<\/em> por necesidad, lo que significa que Angular los re-eval\u00faa en cada ciclo de detecci\u00f3n de cambios. Para listas grandes, consider\u00e1 cachear el resultado en el componente con <code>computed()<\/code> si us\u00e1s Signals, o con una propiedad derivada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes matem\u00e1ticos: c\u00e1lculos sin tocar el componente<\/h2>\n\n\n\n<p>Peque\u00f1os c\u00e1lculos que terminan siendo m\u00e9todos en el componente cuando deber\u00edan ser pipes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Suma de un array -->\nTotal: {{ precios | sum | currency:'ARS' }}\n\n&lt;!-- Promedio -->\nPromedio: {{ calificaciones | average }}\n\n&lt;!-- M\u00e1ximo y m\u00ednimo -->\nMayor: {{ valores | max }}\nMenor: {{ valores | min }}\n\n&lt;!-- Porcentaje -->\n{{ completados | percentage:total }}%\n\n&lt;!-- Formatear bytes a KB\/MB\/GB legible -->\n{{ archivo.size | bytes }}\n&lt;!-- Output: \"2.4 MB\" en lugar de \"2516582\" -->\n\n&lt;!-- Redondear -->\n{{ precio | round:2 }}\n{{ temperatura | ceil }}\n{{ descuento | floor }}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes booleanos: legibilidad en los templates<\/h2>\n\n\n\n<p>Una categor\u00eda que parece peque\u00f1a pero mejora mucho la legibilidad del c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Verificaciones de tipo -->\n@if (valor | isString) {\n  &lt;span>{{ valor }}&lt;\/span>\n}\n\n@if (datos | isArray) {\n  &lt;ul>...&lt;\/ul>\n}\n\n&lt;!-- Comparaciones -->\n@if (precio | isGreaterThan:1000) {\n  &lt;span class=\"premium\">Premium&lt;\/span>\n}\n\n@if (stock | isLessEqualThan:5) {\n  &lt;span class=\"warning\">\u00a1\u00daltimas unidades!&lt;\/span>\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Antes y despu\u00e9s: un ejemplo real<\/h2>\n\n\n\n<p>Imagin\u00e1 una card de producto que muestra precio, nombre, descripci\u00f3n y stock. As\u00ed se ve <strong>sin<\/strong> pipes de utilidad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ producto-card.component.ts (sin pipes)\nexport class ProductoCardComponent {\n  @Input() producto!: Producto;\n\n  get descripcionCorta(): string {\n    return this.producto.descripcion.length > 120\n      ? this.producto.descripcion.substring(0, 120) + '...'\n      : this.producto.descripcion;\n  }\n\n  get stockLabel(): string {\n    return this.producto.stock === 1 ? '1 unidad' : ${this.producto.stock} unidades;\n  }\n\n  get precioFormateado(): string {\n    return new Intl.NumberFormat('es-AR', { style: 'currency', currency: 'ARS' }).format(this.producto.precio);\n  }\n}<\/code><\/pre>\n\n\n\n<p>Y as\u00ed se ve <strong>con<\/strong> pipes de utilidad:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- producto-card.component.html (con pipes) -->\n&lt;div class=\"card\">\n  &lt;h3>{{ producto.nombre | ucFirst }}&lt;\/h3>\n  &lt;p>{{ producto.descripcion | truncate:120 }}&lt;\/p>\n  &lt;span class=\"price\">{{ producto.precio | currency:'ARS' }}&lt;\/span>\n  &lt;span>{{ producto.stock }} {{ 'unidad' | makePluralString:producto.stock }}&lt;\/span>\n\n  @if (producto.stock | isLessEqualThan:5) {\n    &lt;span class=\"badge-warning\">\u00a1\u00daltimas unidades!&lt;\/span>\n  }\n&lt;\/div><\/code><\/pre>\n\n\n\n<p>El componente qued\u00f3 sin l\u00f3gica de presentaci\u00f3n. Todo est\u00e1 en el template, declarativo, legible y testeable.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pipes de objetos: iterar y transformar<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!-- Obtener keys de un objeto -->\n@for (key of configObj | keys; track key) {\n  &lt;span>{{ key }}: {{ configObj[key] }}&lt;\/span>\n}\n\n&lt;!-- Obtener values -->\n@for (val of configObj | values; track val) {\n  &lt;li>{{ val }}&lt;\/li>\n}\n\n&lt;!-- Seleccionar solo algunas propiedades -->\n{{ usuario | pick:['nombre', 'email'] | json }}\n\n&lt;!-- Excluir propiedades sensibles -->\n{{ usuario | omit:['password', 'token'] | json }}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u00bfPor qu\u00e9 usar una librer\u00eda de pipes en lugar de crearlos?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Testeados:<\/strong> Los pipes de una librer\u00eda tienen tests unitarios. Los tuyos custom&#8230; a veces.<\/li>\n<li><strong>Mantenidos:<\/strong> Las actualizaciones de Angular se manejan en la librer\u00eda, no en tu c\u00f3digo.<\/li>\n<li><strong>Consistentes:<\/strong> El mismo comportamiento en todos tus proyectos.<\/li>\n<li><strong>Documentados:<\/strong> No hay que leer el c\u00f3digo para entender qu\u00e9 hace <code>slugify<\/code>.<\/li>\n<li><strong>Sin dependencias externas:<\/strong> Librer\u00edas como ngx-transforms funcionan de forma aut\u00f3noma, sin necesidad de Moment.js ni lodash.<\/li>\n<li><strong>Tree-shakeable:<\/strong> Solo los pipes que import\u00e1s llegan al bundle final.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Integraci\u00f3n con Angular Signals<\/h2>\n\n\n\n<p>Los pipes funcionan perfectamente con el nuevo modelo reactivo de Angular Signals. Pod\u00e9s usar pipes en templates que consumen signals sin ninguna fricci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>export class ProductosComponent {\n  productos = signal&lt;Producto[]>([]);\n  busqueda = signal('');\n  ordenamiento = signal('nombre');\n}\n\n&lt;!-- Template: todo declarativo, todo reactivo -->\n@for (\n  p of productos() | filterBy:['nombre']:busqueda() | orderBy:ordenamiento();\n  track p.id\n) {\n  &lt;app-producto-card [producto]=\"p\" \/>\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusi\u00f3n<\/h2>\n\n\n\n<p>Los pipes de utilidad son uno de esos recursos que, una vez que los incorpor\u00e1s a tu flujo de trabajo, no pod\u00e9s creer c\u00f3mo los viviste sin ellos. Reducen la l\u00f3gica en los componentes, hacen los templates m\u00e1s expresivos y eliminan el copy-paste entre proyectos.<\/p>\n\n\n\n<p><a href=\"https:\/\/ngx-transforms.vercel.app\/\" target=\"_blank\" rel=\"noopener\">ngx-transforms<\/a> es una de las alternativas disponibles en el ecosistema Angular para resolver exactamente este problema. La pr\u00f3xima vez que vayas a escribir <code>getTimeAgo()<\/code>, <code>truncateText()<\/code> o <code>formatBytes()<\/code> en tu componente, consider\u00e1 si un pipe de utilidad no ser\u00eda la soluci\u00f3n m\u00e1s limpia.<\/p>\n\n\n\n<p>Tu yo del futuro \u2014el que tenga que mantener ese c\u00f3digo\u2014 te lo va a agradecer.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Descubr\u00ed c\u00f3mo una librer\u00eda de pipes para Angular como ngx-transforms elimina el boilerplate de tus componentes: truncar texto, fechas relativas, filtrar arrays, formatear bytes y mucho m\u00e1s, directo en el template sin escribir l\u00f3gica extra.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[1],"tags":[274,429,442,276,277,443,428,444,282,278,430],"class_list":["post-1327","post","type-post","status-publish","format-standard","hentry","category-blog","tag-angular","tag-angular-17","tag-angular-pipes","tag-frontend","tag-javascript","tag-ngx-transforms","tag-reactive-programming","tag-standalone-components","tag-template","tag-typescript","tag-web-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Descubr\u00ed c\u00f3mo una librer\u00eda de pipes para Angular como ngx-transforms elimina el boilerplate de tus componentes: truncar texto, fechas relativas, filtrar arrays, formatear bytes y mucho m\u00e1s, directo en el template sin escribir l\u00f3gica extra.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-30T02:05:39+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda\",\"datePublished\":\"2026-03-30T02:05:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/\"},\"wordCount\":860,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"angular\",\"Angular 17\",\"Angular Pipes\",\"frontend\",\"javascript\",\"ngx-transforms\",\"Reactive Programming\",\"Standalone Components\",\"template\",\"typescript\",\"Web Development\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/\",\"name\":\"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-30T02:05:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/","og_locale":"es_ES","og_type":"article","og_title":"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda &#183; devops Mauro Bernal","og_description":"Descubr\u00ed c\u00f3mo una librer\u00eda de pipes para Angular como ngx-transforms elimina el boilerplate de tus componentes: truncar texto, fechas relativas, filtrar arrays, formatear bytes y mucho m\u00e1s, directo en el template sin escribir l\u00f3gica extra.","og_url":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-30T02:05:39+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda","datePublished":"2026-03-30T02:05:39+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/"},"wordCount":860,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["angular","Angular 17","Angular Pipes","frontend","javascript","ngx-transforms","Reactive Programming","Standalone Components","template","typescript","Web Development"],"articleSection":["Blog"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/","url":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/","name":"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-30T02:05:39+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/pipes-de-angular-listos-para-usar-como-ngx-transforms-te-salva-el-dia\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Pipes de Angular Listos para Usar: C\u00f3mo ngx-transforms Te Salva el D\u00eda"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1327","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1327"}],"version-history":[{"count":0,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1327\/revisions"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1327"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1327"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1327"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}