<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alberto Chamorro</title>
    <description>The latest articles on DEV Community by Alberto Chamorro (@achamorro_dev).</description>
    <link>https://dev.to/achamorro_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F393794%2F82fb5a8b-a57c-4f4d-8013-60139c806731.jpeg</url>
      <title>DEV Community: Alberto Chamorro</title>
      <link>https://dev.to/achamorro_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/achamorro_dev"/>
    <language>en</language>
    <item>
      <title>TypeScript [Capítulo 1] ¿Qué es TypeScript? Instalación y tipos básicos</title>
      <dc:creator>Alberto Chamorro</dc:creator>
      <pubDate>Fri, 15 Jul 2022 09:54:09 +0000</pubDate>
      <link>https://dev.to/achamorro_dev/typescript-capitulo-1-que-es-typescript-instalacion-y-tipos-basicos-4jbl</link>
      <guid>https://dev.to/achamorro_dev/typescript-capitulo-1-que-es-typescript-instalacion-y-tipos-basicos-4jbl</guid>
      <description>&lt;p&gt;Si has trabajado con JavaScript sabrás que es considerado un lenguaje de tipado débil o no tipado. &lt;/p&gt;

&lt;p&gt;En aplicaciones pequeñas puede que esto no sea un problema pero en un entorno empresarial donde el negocio y las aplicaciones tienden a escalar, dónde se busca estabilidad y solidez del software y donde el equipo de desarrollo incluyen a varias personas o incluso varios equipos los errores desconocidos empiezan a aparecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué es TypeScript?
&lt;/h2&gt;

&lt;p&gt;TypeScript (&lt;a href="https://www.typescriptlang.org/"&gt;https://www.typescriptlang.org/&lt;/a&gt;) es un lenguaje de programación open-source de tipado fuerte basado en JavaScript creado por Microsoft (podéis ver su repositorio de código en &lt;a href="https://github.com/microsoft/TypeScript/"&gt;GitHub&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Su uso cada vez es más extendido frente a JavaScript ya que nos trae lo mejor de los lenguajes de programación orientados a objetos para ayudarnos a modelar nuestras entidades. Su sintaxis es idéntica pero con añadidos, por eso también escucharás que es considerado un superset de tipos de JavaScript. &lt;/p&gt;

&lt;p&gt;Sus herramientas más potentes son el linter y el compilador ya que son capaces de detectar errores en tiempo de desarrollo y compilación. Tras el proceso de compilación, el código final será JavaScript puro compilado a la versión de ECMAScript que indiquemos en la configuración.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript vs JavaScript
&lt;/h2&gt;

&lt;p&gt;Imagina una función en JavaScript para sumar dos números:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secondNumber&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;firstNumber&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;secondNumber&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Resultado: 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aparentemente todo correcto ¿verdad? Ahora vamos a llamar más veces a la función:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 12&lt;/span&gt;
&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 12&lt;/span&gt;
&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// NaN&lt;/span&gt;
&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;// '2,46,8'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obviamente el ejemplo es exagerado pero podría ocurrir. El problema es que estos errores se detectan en tiempo de ejecución por lo que siempre llegamos tarde.&lt;/p&gt;

&lt;p&gt;Otro caso de error es la mutabilidad de los tipos. Ahora mismo JavaScript permite sin problemas algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A-12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora imagina que pudieras decirle a la variable &lt;code&gt;id&lt;/code&gt; que tiene que ser un número:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;A-12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="c1"&gt;// TS2322: Type 'string' is not assignable to type 'number'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El código anterior daría error al compilar además de que tu editor te avisará marcando la línea con error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rK37Y3NG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/dp1r5podd/image/upload/v1655985285/albertochamorro.dev/typescript-capitulo-1/Error_linter_TypeScript_VSCode.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rK37Y3NG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://res.cloudinary.com/dp1r5podd/image/upload/v1655985285/albertochamorro.dev/typescript-capitulo-1/Error_linter_TypeScript_VSCode.webp" alt="Captura del error del linter de Visual Studio Code" width="880" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Volvemos al ejemplo de la función pero con tipos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;firstNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secondNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;firstNumber&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;secondNumber&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Resultado: 3&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tendremos un error en tiempo de desarrollo y compilación indicándote que estás intentando utilizar un 'string' cuando la función necesita un 'number'.&lt;/p&gt;


&lt;center&gt;&lt;/center&gt;
&lt;h2&gt;
  
  
  ¡Quiero empezar! ¿Cómo lo instalo?
&lt;/h2&gt;

&lt;p&gt;La mayor parte de los frameworks/librerías en su documentación tienen información con comandos específicos para crear un proyecto desde cero o añadir TypeScript a un proyecto existente.&lt;/p&gt;

&lt;p&gt;Un ejemplo sería la documentación de React (&lt;a href="https://create-react-app.dev/docs/adding-typescript/):"&gt;https://create-react-app.dev/docs/adding-typescript/):&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app my-app --template typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el comando anterior iniciaremos un nuevo proyecto de React con TypeScript instalado y configurado.&lt;/p&gt;

&lt;p&gt;Otros frameworks como Angular o NestJS trabajan con TypeScript por defecto y no tendremos que hacer nada especial. &lt;/p&gt;

&lt;p&gt;Aun así, si quieres hacerlo manualmente teniendo un proyecto de &lt;code&gt;npm&lt;/code&gt; bastaría con seguir dos sencillos pasos:&lt;/p&gt;

&lt;p&gt;1- Instalar el paquete &lt;code&gt;typescript&lt;/code&gt; como &lt;strong&gt;dependencia de desarrollo&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev --save-exact typescript

// Version reducida
npm i -DE typescript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- Inicializar el proyecto de TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx tsc --init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este paso generará el fichero &lt;code&gt;tsconfig.json&lt;/code&gt; en la raíz del proyecto.&lt;br&gt;
Este fichero es el fichero de configuración que necesita el compilador de TypeScript, hablaré de él en un capítulo posterior.&lt;/p&gt;

&lt;p&gt;Sólo nos quedaría añadir un script a nuestro fichero &lt;code&gt;package.json&lt;/code&gt; para poder compilar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc --build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsc --watch"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Modo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;observador&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;para&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;compilar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;automáticamente&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;cuando&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;se&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;modifiquen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;los&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ficheros&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya podríamos crear nuestro primer fichero TypeScript, por ejemplo &lt;code&gt;index.ts&lt;/code&gt; en nuestro proyecto y compilarlo.&lt;br&gt;
Como puedes ver, el fichero lleva la extensión &lt;code&gt;.ts&lt;/code&gt; específica de TypeScript.&lt;/p&gt;

&lt;p&gt;Ahora prueba a meter el siguiente código y ejecutar &lt;code&gt;npm run build&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Hola &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pedro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El compilador generará el fichero &lt;code&gt;index.js&lt;/code&gt; que podrás ejecutar con &lt;code&gt;node index.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;¿Y tengo que hacer todo esto sólo para las pruebas? Pues no. En la web de TypeScript tienes su playground (&lt;a href="https://www.typescriptlang.org/play"&gt;https://www.typescriptlang.org/play&lt;/a&gt;) dónde puedes hacer pruebas, ver el código compilado en JavaScript, ejecutarlo, etc&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;El fichero &lt;code&gt;tsconfig.json&lt;/code&gt; es el fichero de configuración utilizado por el compilador de TypeScript&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Tipado o type annotations
&lt;/h2&gt;

&lt;p&gt;Como has podido comprobar en los ejemplos anteriores, definir el tipo de una variable o propiedad es tan sencillo como escribir &lt;code&gt;:&lt;/code&gt; seguido del tipo que queramos que tenga, por ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="c1"&gt;// La variable id es de tipo número&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lo mismo ocurre con las funciones, donde podremos indicar los tipos tanto para la entrada como para la salida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;`Hola &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En la función anterior puedes ver que el tipo de retorno de la función será un string y se indica después de la lista de parámetros.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inferencia de tipos
&lt;/h3&gt;

&lt;p&gt;En ocasiones no es necesario explícitamente añadir una anotación con el tipo de una propiedad, por ejemplo cuando inicializamos la variable con un valor.&lt;/p&gt;

&lt;p&gt;En este caso, TypeScript es capaz de determinar el tipo dependiendo del valor que le estemos dando inicialmente. A esto se le conoce como inferencia de tipos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="c1"&gt;// id es un boolean&lt;/span&gt;
&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="c1"&gt;// TS2322: Type 'number' is not assignable to type 'boolean'.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tipos básicos
&lt;/h2&gt;

&lt;p&gt;Hay una gran cantidad de tipos, desde los más básicos como string o number hasta algunos más complejos como interfaces, genéricos, union types, literal types, ... &lt;/p&gt;

&lt;p&gt;Vamos a repasar los tipos básicos, los que ya nos trae JavaScript.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// String&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alberto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;surname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Chamorro&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;surname&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;

&lt;span class="c1"&gt;// Number&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;33.5&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hexadecimal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0xf00d&lt;/span&gt;

&lt;span class="c1"&gt;// Boolean&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isTrue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isNotTrue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isTrue&lt;/span&gt;

&lt;span class="c1"&gt;// Array&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;listOfNumbers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;otherList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// Sería un array pero es preferible la anotación anterior&lt;/span&gt;

&lt;span class="c1"&gt;// Object&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alberto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;personWrong&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// TS2322: Type 'number' is not assignable to type 'string'.&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Esto es solo el principio.&lt;/p&gt;

&lt;p&gt;En próximos artículos veremos diferentes tipos más complejos y una gran cantidad de herramientas que nos aporta TypeScript para definir nuestros datos.&lt;/p&gt;

&lt;p&gt;Artículo original: &lt;a href="https://albertochamorro.dev/blog/typescript-capitulo-1-que-es-como-instalar-y-tipos-basicos"&gt;https://albertochamorro.dev/blog/typescript-capitulo-1-que-es-como-instalar-y-tipos-basicos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Gracias por leer hasta aquí y hasta la próxima 👋!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>tutorial</category>
      <category>programming</category>
    </item>
    <item>
      <title>Cómo tener diferentes versiones de Node.js</title>
      <dc:creator>Alberto Chamorro</dc:creator>
      <pubDate>Fri, 03 Jun 2022 07:46:47 +0000</pubDate>
      <link>https://dev.to/achamorro_dev/como-tener-diferentes-versiones-de-nodejs-17a0</link>
      <guid>https://dev.to/achamorro_dev/como-tener-diferentes-versiones-de-nodejs-17a0</guid>
      <description>&lt;p&gt;Cuantas veces te ha ocurrido que trabajas en diferentes proyectos con JavaScript pero utilizan versiones diferentes de Node.js. &lt;/p&gt;

&lt;p&gt;¿Sabías que existen gestores de versiones que te facilitan el cambio entre versiones? Aquí te enseño dos de los más famosos: NVM y N &lt;/p&gt;

&lt;h2&gt;
  
  
  NVM
&lt;/h2&gt;

&lt;p&gt;NVM (&lt;a href="https://nvm.sh/" rel="noopener noreferrer"&gt;https://nvm.sh/&lt;/a&gt;) (o Node Version Manager) es sin lugar a dudas el gestor de versiones de Node.js más conocido y extendido, con más de 58K estrellas en GitHub.&lt;/p&gt;

&lt;p&gt;Este gestor de versiones se instala como un comando en tu terminal y es compatible con terminales UNIX, macOS y Windows WSL. Te permite tener descargadas diferentes versiones de Node.js y cambiar de manera global entre ellas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NVM funciona en cualquier terminal POSIX (sh, dash, ksh, zsh, bash)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Instalación y configuración
&lt;/h3&gt;

&lt;p&gt;Para instalar o actualizar simplemente necesitas ejecutar un script con una de estas dos opciones:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;wget &lt;span class="nt"&gt;-qO-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Este script clonará el repositorio de &lt;code&gt;nvm&lt;/code&gt; en &lt;code&gt;$NVM_DIR/.nvm&lt;/code&gt; (por defecto NVM_DIR será tu directorio HOME) e intentará añadir la configuración necesaria a tu fichero de preferencias. Una vez recargues tu terminal ya tendrás el comando &lt;code&gt;nvm&lt;/code&gt; listo para funcionar.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ nvm -v
0.39.1


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;También si estás utilizando el sistema operativo macOS puedes instalar NVM gracias a Homebrew (&lt;a href="https://brew.sh/):" rel="noopener noreferrer"&gt;https://brew.sh/):&lt;/a&gt; &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

$ brew install nvm


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Comandos útiles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nvm ls-remote&lt;/code&gt;: lista todas las versiones disponibles de Node.js para descargar y utilizar (no te asustes que ya te digo que son muchas 😋).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm ls&lt;/code&gt;: lista las versiones que tienes descargadas en tu ordenador.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm install &amp;lt;VERSION&amp;gt;&lt;/code&gt;: descarga la versión que le pasemos por parámetro. Podemos indicar la versión en formato numérico (14.7.0), "stable" para instalar la última versión estable o "lts/" seguido del nombre de la versión que queramos, por ejemplo, "lts/gallium".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm use &amp;lt;VERSION&amp;gt;&lt;/code&gt;: configura de manera global la versión que le indiquemos para empezar a utilizarla.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm uninstall &amp;lt;VERSION&amp;gt;&lt;/code&gt;: elimina de tu ordenador la versión que le digamos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm current&lt;/code&gt;: muestra la versión de Node.js activa (igual que hacer &lt;code&gt;node -v&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm exec &amp;lt;VERSION&amp;gt; &amp;lt;COMANDO&amp;gt;&lt;/code&gt;: ejecuta el comando en la versión que le digamos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm run &amp;lt;VERSION&amp;gt; &amp;lt;ARGS&amp;gt;&lt;/code&gt;: ejecuta el comando &lt;code&gt;node&lt;/code&gt; con la versión y argumentos que le indiquemos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nvm reinstall-packages &amp;lt;VERSION&amp;gt;&lt;/code&gt;: reinstala los paquetes globales con la versión que le digamos.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;nvm current
v16.15.1

&lt;span class="nv"&gt;$ &lt;/span&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;stable
Downloading and installing node v18.3.0...
Local cache found: &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NVM_DIR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/.cache/bin/node-v18.3.0-darwin-arm64/node-v18.3.0-darwin-arm64.tar.xz
Computing checksum with shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256
Checksums &lt;span class="k"&gt;do &lt;/span&gt;not match: &lt;span class="s1"&gt;'413d8691e8dee241cfca660b17c3857f4bb63a35e87cddef893da52b83a91e51'&lt;/span&gt; found, &lt;span class="s1"&gt;'437e836a1e77d3e19c6e8a7526b8077fb38062a01511b99f3801457db6a63bec'&lt;/span&gt; expected.
Checksum check failed!
Removing the broken &lt;span class="nb"&gt;local &lt;/span&gt;cache...
Downloading https://nodejs.org/dist/v18.3.0/node-v18.3.0-darwin-arm64.tar.xz...
&lt;span class="c"&gt;################################################################################################################################### 100.0%&lt;/span&gt;
Computing checksum with shasum &lt;span class="nt"&gt;-a&lt;/span&gt; 256
Checksums matched!
Now using node v18.3.0 &lt;span class="o"&gt;(&lt;/span&gt;npm v7.24.2&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;nvm current
v18.3.0

&lt;span class="nv"&gt;$ &lt;/span&gt;nvm use 16
Now using node v16.15.1 &lt;span class="o"&gt;(&lt;/span&gt;npm v7.24.2&lt;span class="o"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Fichero .nvmrc
&lt;/h3&gt;

&lt;p&gt;Puede que al empezar a trabajar en un proyecto veas un fichero &lt;code&gt;.nvmrc&lt;/code&gt; en el directorio raíz. Este fichero indica la versión de Node.js que se está utilizando en ese proyecto y que tú deberías también utilizar.&lt;/p&gt;

&lt;p&gt;NVM buscará y utilizará la versión indicada en ese fichero para ejecutar los comandos si nosotros no especificamos una versión:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;nvm current
v18.3.0

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; .nvmrc
v16.15.1

&lt;span class="nv"&gt;$ &lt;/span&gt;nvm use
Found &lt;span class="s1"&gt;'/Users/alberto/workspace/personal/albertochamorro.dev/.nvmrc'&lt;/span&gt; with version &amp;lt;v16.15.1&amp;gt;
Now using node v16.15.1 &lt;span class="o"&gt;(&lt;/span&gt;npm v7.24.2&lt;span class="o"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;En la documentación de NVM, sección "Deeper Shell Integration" (&lt;a href="https://github.com/nvm-sh/nvm#deeper-shell-integration" rel="noopener noreferrer"&gt;https://github.com/nvm-sh/nvm#deeper-shell-integration&lt;/a&gt;), te enseñan a automatizar tu terminal para ejecutar el comando &lt;code&gt;nvm use&lt;/code&gt; cada vez que accedes a un directorio que contiene un fichero &lt;code&gt;.nvmrc&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  N
&lt;/h2&gt;

&lt;p&gt;N (&lt;a href="https://github.com/tj/n" rel="noopener noreferrer"&gt;https://github.com/tj/n&lt;/a&gt;) es otro conocido gestor de versiones de Node.js pero con una filosofía diferente a NVM. Sus creadores indican que lo han hecho mucho más sencillo que NVM sin tener que modificar la configuración del usuario para funcionar.     &lt;/p&gt;

&lt;p&gt;Este gestor de versiones también se instala como un comando en tu terminal y es compatible con sistemas UNIX, macOS y Windows WSL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalación y configuración
&lt;/h3&gt;

&lt;p&gt;Hay varias formas con las que puedes instalar N.&lt;/p&gt;

&lt;p&gt;Si por ejemplo ya tuvieras Node.js y npm instalados bastaría con ejecutar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; n


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si, por el contrario, aún no tienes npm estos serían los comandos a ejecutar: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://raw.githubusercontent.com/tj/n/master/bin/n &lt;span class="nt"&gt;-o&lt;/span&gt; n
&lt;span class="nv"&gt;$ &lt;/span&gt;bash n lts
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; n


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O si estás en Linux o macOS tienes un instalador en un sólo paso:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://bit.ly/n-install | bash


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;La instalación por defecto se hará en &lt;code&gt;/usr/local/n&lt;/code&gt; pero podríamos modificar el directorio donde queremos tener N estableciendo la variable de entorno &lt;code&gt;N_PREFIX&lt;/code&gt; antes de la instalación.&lt;/p&gt;

&lt;p&gt;Una vez terminemos la instalación podemos confirmar que tenemos N ejecutando:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;n &lt;span class="nt"&gt;--version&lt;/span&gt;&lt;br&gt;
v8.2.0&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Comandos útiles&lt;br&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;n&lt;/code&gt;: si no tenemos ninguna versión de Node.js descargada mostrará la ayuda. En caso de tener alguna versión descargada nos mostrará un selector interactivo para poder cambiar a la versión que queramos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n ls-remote&lt;/code&gt;: lista las últimas versiones disponibles de Node.js. Si queremos ver todas añadiremos &lt;code&gt;--all&lt;/code&gt; al comando.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n ls&lt;/code&gt;: lista las versiones que tienes descargadas en tu ordenador.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n install &amp;lt;VERSION&amp;gt;&lt;/code&gt;: descarga la versión que le pasemos por parámetro.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n use &amp;lt;VERSION&amp;gt;&lt;/code&gt;: configura de manera global la versión que le indiquemos para empezar a utilizarla.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n rm &amp;lt;VERSION&amp;gt;&lt;/code&gt;: elimina de tu ordenador la versión que le digamos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n exec &amp;lt;VERSION&amp;gt; &amp;lt;COMANDO&amp;gt;&lt;/code&gt;: ejecuta el comando en la versión que le digamos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n run &amp;lt;VERSION&amp;gt; &amp;lt;ARGS&amp;gt;&lt;/code&gt;: ejecuta el comando &lt;code&gt;node&lt;/code&gt; con la versión y argumentos que le indiquemos.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n prune&lt;/code&gt;: elimina todas las versiones descargadas menos la que está en uso en ese momento.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;n uninstall&lt;/code&gt;: eliminar la versión que está en uso en ese momento&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnimit.io%2Fimages%2Fn%2Fn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fnimit.io%2Fimages%2Fn%2Fn.gif" alt="Uso de n"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Algunos comandos tienen alias definidos para facilitar su uso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install: i&lt;/li&gt;
&lt;li&gt;latest: current&lt;/li&gt;
&lt;li&gt;ls: list&lt;/li&gt;
&lt;li&gt;lsr: ls-remote&lt;/li&gt;
&lt;li&gt;lts: stable&lt;/li&gt;
&lt;li&gt;rm: -&lt;/li&gt;
&lt;li&gt;run: use, as&lt;/li&gt;
&lt;li&gt;which: bin&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Definir versiones de Node.js
&lt;/h3&gt;

&lt;p&gt;Al igual que con NVM decíamos que se utilizaba el fichero &lt;code&gt;.nvmrc&lt;/code&gt; para definir la versión de Node.js del proyecto, con N tenemos soporte a diferentes mecanismos.&lt;/p&gt;

&lt;p&gt;N lee la versión en el directorio actual o cualquier directorio principal, buscando en el siguiente orden:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.n-node-version&lt;/code&gt;: fichero propio de &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.node-version&lt;/code&gt;: fichero común a otras herramientas (&lt;a href="https://github.com/shadowspawn/node-version-usage" rel="noopener noreferrer"&gt;https://github.com/shadowspawn/node-version-usage&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.nvmrc&lt;/code&gt;: usado por NVM&lt;/li&gt;
&lt;li&gt;Si no existe ninguno de los ficheros anteriores, busca la propiedad &lt;code&gt;engines&lt;/code&gt; (&lt;a href="https://docs.npmjs.com/cli/v7/configuring-npm/package-json#engines" rel="noopener noreferrer"&gt;https://docs.npmjs.com/cli/v7/configuring-npm/package-json#engines&lt;/a&gt;) dentro del fichero &lt;code&gt;package.json&lt;/code&gt; y utiliza &lt;code&gt;npx semver&lt;/code&gt; para resolver rangos complejos.
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;¿Conocías estas herramientas? ¿Vas a empezar a utilizarlas si no lo hacías ya? Espero que después de leer el artículo te anime al menos a probarlas 😊.&lt;/p&gt;

&lt;p&gt;Artículo original: &lt;a href="https://albertochamorro.dev/blog/diferentes-versiones-de-nodejs" rel="noopener noreferrer"&gt;https://albertochamorro.dev/blog/diferentes-versiones-de-nodejs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Gracias por leer hasta aquí y hasta la próxima 👋!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Conventional Commits - Qué es y por qué deberías empezar a utilizarlo</title>
      <dc:creator>Alberto Chamorro</dc:creator>
      <pubDate>Wed, 19 Jan 2022 10:17:58 +0000</pubDate>
      <link>https://dev.to/achamorro_dev/conventional-commits-que-es-y-por-que-deberias-empezar-a-utilizarlo-23an</link>
      <guid>https://dev.to/achamorro_dev/conventional-commits-que-es-y-por-que-deberias-empezar-a-utilizarlo-23an</guid>
      <description>&lt;p&gt;¿Alguna vez te ha pasado que no sabes que formato usar al escribir un mensaje de un commit? ¿Cada persona del equipo sigue un formato diferente porque no hay un acuerdo entre todos? O lo que es peor, ¿usa emojis en los commits? Yo he sido de esos...&lt;/p&gt;

&lt;p&gt;Pues Conventional Commits llega para solucionar todos esos problemas y más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pero, ¿qué es Conventional Commits?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.conventionalcommits.org/"&gt;Conventional Commits&lt;/a&gt; es una convención en el formato de los mensajes de los commits. Esta convención define una serie de reglas que hacen muy sencillo tanto la legibilidad del histórico del repositorio como el poder tener herramientas que automaticen procesos basándose en el historial de commits, por ejemplo, a la hora del versionado del proyecto.&lt;/p&gt;

&lt;p&gt;Esta convención está muy ligada con &lt;a href="http://semver.org/"&gt;Semantic Versioning&lt;/a&gt; (o SemVer), estableciendo la versión del proyecto basándose en los commits del repositorio.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Conventional Commits es una especificación para dar significado a los mensajes de los commits haciéndolos legibles para máquinas y humanos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Pero, ¿qué es Semantic Versioning o SemVer?
&lt;/h2&gt;

&lt;p&gt;A modo resumen, SemVer es la convención más extendida para establecer un versionado a librerías, paquetes, dependencias, y a la vida en general 🙃&lt;/p&gt;

&lt;p&gt;El versionado se divide en tres bloques:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// MAJOR.MINOR.PATCH&lt;/span&gt;

&lt;span class="mf"&gt;2.12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="c1"&gt;// 2 -&amp;gt; MAJOR&lt;/span&gt;
&lt;span class="c1"&gt;// 12 -&amp;gt; MINOR&lt;/span&gt;
&lt;span class="c1"&gt;// 7 -&amp;gt; PATCH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MAJOR&lt;/strong&gt;: número de versión que se incrementa cuando se rompe la compatibilidad de versiones anteriores.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MINOR&lt;/strong&gt;: número de versión que se incrementa cuando se añade funcionalidad y esta es compatible en la versión MAJOR actual.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PATCH&lt;/strong&gt;: número de versión que se incrementa cuando se arreglan errores en la versión MAJOR.MINOR actual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adicionalmente está permitido (y es muy común) añadir al bloque PATCH información adicional indicando si son versiones previas a un nuevo lanzamiento (alpha, beta, next, rc, ...) y el número de la compilación. Esta información adicional debe ir en el bloque PATCH precedido por un guión &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Un ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mf"&gt;12.2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;// Aquí "alpha" indica el estado de la compilación y ".0" indica el número de compilación&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Todo el detalle puedes consultarlo en la página oficial de &lt;a href="https://semver.org/"&gt;SemVer&lt;/a&gt;. Ahora sí, volvamos a Conventional Commits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Especificación de Conventional Commits
&lt;/h2&gt;

&lt;p&gt;Conventional Commits especifica que el mensaje de commit debe ser estructurado de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;tipo&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;(ámbito opcional): &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;descripci&lt;/span&gt;&lt;span class="err"&gt;ó&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LINEA_EN_BLANCO&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
[cuerpo opcional]
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;LINEA_EN_BLANCO&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
[nota(s) al pie opcional(es)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hay ciertos elementos que serán utilizados para comunicar la intención del commit a terceros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si el tipo es &lt;strong&gt;fix&lt;/strong&gt; indica que el commit es un parche de un error y está relacionado con la versión &lt;a href="https://semver.org/#summary"&gt;PATCH&lt;/a&gt; del proyecto.&lt;/li&gt;
&lt;li&gt;Si el tipo es &lt;strong&gt;feat&lt;/strong&gt; indica que el commit añade una nueva funcionalidad y se relaciona con la versión &lt;a href="https://semver.org/#summary"&gt;MINOR&lt;/a&gt; del proyecto.&lt;/li&gt;
&lt;li&gt;Añadir el texto &lt;strong&gt;BREAKING CHANGE&lt;/strong&gt; en el footer de un commit, o el carácter &lt;code&gt;!&lt;/code&gt; después del tipo, indica que se rompe la compatibilidad de la versión actual y está relacionado con la versión &lt;a href="http://semver.org/#summary"&gt;MAJOR&lt;/a&gt; del proyecto.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Espero que aún no hayas hecho 🤯  porque de verdad que es muy sencillo. Vamos a ver cada una de las zonas del commit en detalle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipo
&lt;/h3&gt;

&lt;p&gt;El primer elemento es el tipo de commit refiriéndose al contenido del commit. Basados en la &lt;a href="https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines"&gt;convención establecida por Angular&lt;/a&gt; estos son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;feat&lt;/strong&gt;: cuando se añade una nueva funcionalidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fix&lt;/strong&gt;: cuando se arregla un error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;chore&lt;/strong&gt;: tareas rutinarias que no sean específicas de una feature o un error como por ejemplo añadir contenido al fichero &lt;code&gt;.gitignore&lt;/code&gt; o instalar una dependencia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;test&lt;/strong&gt;: si añadimos o arreglamos tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;docs&lt;/strong&gt;: cuando solo se modifica documentación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;build&lt;/strong&gt;: cuando el cambio afecta al compilado del proyecto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ci&lt;/strong&gt;: el cambio afecta a ficheros de configuración y scripts relacionados con la integración continua.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;style&lt;/strong&gt;: cambios de legibilidad o formateo de código que no afecta a funcionalidad.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refactor&lt;/strong&gt;: cambio de código que no corrige errores ni añade funcionalidad, pero mejora el código.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;perf&lt;/strong&gt;: usado para mejoras de rendimiento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;revert&lt;/strong&gt;: si el commit revierte un commit anterior. Debería indicarse el hash del commit que se revierte.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ámbito
&lt;/h3&gt;

&lt;p&gt;El campo ámbito es opcional y sirve para dar información contextual como por ejemplo indicar el nombre de la feature a la que afecta el commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Descripción
&lt;/h3&gt;

&lt;p&gt;Breve descripción del cambio cumpliendo lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usa imperativos, en tiempo presente: “añade” mejor que “añadido” o “añadidos”&lt;/li&gt;
&lt;li&gt;la primera letra siempre irá en minúscula&lt;/li&gt;
&lt;li&gt;no escribir un punto al final&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cuerpo
&lt;/h3&gt;

&lt;p&gt;Es opcional y debería añadir aportar más información que la descripción. Debería usar el mismo tono imperativo que esta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nota al pie
&lt;/h3&gt;

&lt;p&gt;Es opcional. Siempre se utiliza para indicar cambios que rompan la compatibilidad de la versión actual (Breaking Changes) aunque también están permitidos otros formatos que sigan la convención de &lt;a href="https://git-scm.com/docs/git-interpret-trailers"&gt;git trailer format&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Si el pie de página indica un Breaking Change, el formato deberá ser el siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;BREAKING&lt;/span&gt; &lt;span class="nx"&gt;CHANGE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;¿A que no ha sido tan difícil? Venga que seguro que unos ejemplos te ayudan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Commit rompiendo la compatibilidad de la versión actual
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;feat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;provided&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;extend&lt;/span&gt; &lt;span class="nx"&gt;other&lt;/span&gt; &lt;span class="nx"&gt;configs&lt;/span&gt;

&lt;span class="nx"&gt;BREAKING&lt;/span&gt; &lt;span class="nx"&gt;CHANGE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`extends`&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="nx"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;now&lt;/span&gt; &lt;span class="nx"&gt;used&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;extending&lt;/span&gt; &lt;span class="nx"&gt;other&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="nx"&gt;files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mismo commit que antes pero indicando la ruptura de compatibilidad con &lt;code&gt;!&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;feat&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;provided&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;extend&lt;/span&gt; &lt;span class="nx"&gt;other&lt;/span&gt; &lt;span class="nx"&gt;configs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Commit con ámbito
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;feat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;add&lt;/span&gt; &lt;span class="nx"&gt;spanish&lt;/span&gt; &lt;span class="nx"&gt;language&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Commit con cuerpo y notas al pie
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;correct&lt;/span&gt; &lt;span class="nx"&gt;minor&lt;/span&gt; &lt;span class="nx"&gt;typos&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;code&lt;/span&gt;

&lt;span class="nx"&gt;see&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;issue&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt;

&lt;span class="nx"&gt;on&lt;/span&gt; &lt;span class="nx"&gt;typos&lt;/span&gt; &lt;span class="nx"&gt;fixed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nx"&gt;Reviewed&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Z&lt;/span&gt;
&lt;span class="nx"&gt;Refs&lt;/span&gt; &lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;133&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ¿Por qué usar Conventional Commits?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Conseguimos un acuerdo en el formato de los commits con todo el equipo de desarrollo tanto interno como externo&lt;/li&gt;
&lt;li&gt;Armonía en el histórico del repositorio&lt;/li&gt;
&lt;li&gt;Generación automática de CHANGELOG&lt;/li&gt;
&lt;li&gt;Versionado automático del proyecto&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Herramientas
&lt;/h2&gt;

&lt;p&gt;Hay muchas librerías, extensiones y linters que se integran con la convención de Conventional Commits para validar los mensajes de los commits, generar documentación como alimentar el fichero &lt;code&gt;CHANGELOG&lt;/code&gt; o para versionar automáticamente el proyecto.&lt;/p&gt;

&lt;p&gt;En la web de &lt;a href="https://www.conventionalcommits.org/en/about/#tooling-for-conventional-commits"&gt;Conventional Commits&lt;/a&gt; se listan un montón de estas herramientas para Go, Python, PHP, Java y JavaScript. Además hay plugins para tu editor favorito seguro así que te animo a que pases a echarle un vistazo.&lt;/p&gt;

&lt;p&gt;Algunas de las más famosas en el ecosistema JavaScript son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/conventional-changelog/standard-version"&gt;standard-version&lt;/a&gt;: librería creada por la gente de Conventional commits, automatiza la generación del CHANGELOG y genera la siguiente versión en base a las tags de versiones anteriores en tu repositorio y a los commits posteriores a esa tag. Genera un commit incluyendo la versión en el mensaje y los ficheros que ha creado/actualizado automáticamente y el tag con la nueva versión.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/semantic-release/semantic-release"&gt;semantic-release&lt;/a&gt;: otra herramienta más completa que la anterior y más extendida por la comunidad. Automatiza todo el flujo de desarrollo y versionado trabajando con ramas (master, next, beta, alpha, etc), genera versionado analizando las tags en estas ramas y los commits, genera las notas de la nueva versión, realiza commit con todos los cambios y lanza la publicación del paquete. ¡Un todo en uno en toda regla!&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/dhoulb/multi-semantic-release"&gt;multi-semantic-release&lt;/a&gt;: si lo tuyo son los monorepos esta es tu librería. Sigue el mismo concepto que semantic-release pero funciona con monorepos, determinando el versionado para cada uno de los workspaces dentro de tu proyecto.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/conventional-changelog/commitlint"&gt;commitlint&lt;/a&gt;: uno de los linters más famosos cuando hablamos de mensajes de commits y con una integración directa con Conventional Commits. Puedes usarlo por ejemplo con &lt;code&gt;simple-git-hooks&lt;/code&gt; o &lt;code&gt;husky&lt;/code&gt; para validar los mensajes del proyecto antes de que se registren en el histórico del repositorio y poder rechazarlo si no cumple el formato.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Algunos proyectos que lo usan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/vuejs/vue"&gt;vue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ionic-team/ionic-framework"&gt;ionic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ionic-team/stencil"&gt;stencil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/electron/electron"&gt;electron&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/remix-run/remix"&gt;remix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/yargs/yargs"&gt;yargs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/facebook/docusaurus"&gt;docusaurus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Espero que a partir de ahora utilices esta convención para tus commits, estaré vigilándote 🕵️‍.&lt;/p&gt;

&lt;p&gt;Artículo original: &lt;a href="https://albertochamorro.dev/blog/conventional-commits-que-es"&gt;https://albertochamorro.dev/blog/conventional-commits-que-es&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Gracias por leer hasta aquí y hasta la próxima 👋!&lt;/p&gt;

</description>
      <category>git</category>
      <category>javascript</category>
      <category>spanish</category>
      <category>github</category>
    </item>
  </channel>
</rss>
