<?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>Forem: Juan Delgado</title>
    <description>The latest articles on Forem by Juan Delgado (@juandelgado06).</description>
    <link>https://forem.com/juandelgado06</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%2F222569%2F35b11ca0-b36d-4a6f-8d4a-5e4185c65ed4.png</url>
      <title>Forem: Juan Delgado</title>
      <link>https://forem.com/juandelgado06</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/juandelgado06"/>
    <language>en</language>
    <item>
      <title>Interface en TypeScript</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Wed, 29 Apr 2020 14:10:10 +0000</pubDate>
      <link>https://forem.com/juandelgado06/interface-en-typescript-3kok</link>
      <guid>https://forem.com/juandelgado06/interface-en-typescript-3kok</guid>
      <description>&lt;p&gt;Una de las principales ideologías de &lt;strong&gt;Typescript&lt;/strong&gt; es que la verificación de tipos se centra en la forma que tienen los valores. Esto a veces se llama "tipificación de pato" o "subtipificaión". Las &lt;strong&gt;interfaces&lt;/strong&gt; en &lt;strong&gt;Typescript&lt;/strong&gt; son una forma muy poderosa de definir que valores tienen que cumplir ya sea una clase, un objecto, etc...&lt;/p&gt;

&lt;p&gt;Pasemos a escribir nuestra primera interfaz en &lt;strong&gt;Typescript&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/kw3fo"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://codesandbox.io/s/interfaces-en-typescript-kw3fo?autoresize=1&amp;amp;expanddevtools=1&amp;amp;fontsize=14&amp;amp;hidenavigation=1&amp;amp;theme=dark"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pzpI10jk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://codesandbox.io/static/img/play-codesandbox.svg" alt="Edit Interfaces en Typescript"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
      <category>guia</category>
    </item>
    <item>
      <title>Tipos Avanzados en Typescript</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Wed, 22 Apr 2020 04:37:39 +0000</pubDate>
      <link>https://forem.com/juandelgado06/tipos-avanzados-en-typescript-2526</link>
      <guid>https://forem.com/juandelgado06/tipos-avanzados-en-typescript-2526</guid>
      <description>&lt;h2&gt;
  
  
  Protectores de tipo y tipos diferenciadores
&lt;/h2&gt;

&lt;p&gt;Una expresión común en JavaScript para diferenciar entre dos valores posibles es verificar la presencia de un miembro. Como mencionamos, solo puede acceder a miembros que están garantizados en todos los componentes de un tipo de unión.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let pet = getSmallPet();

// Cada uno de estos accesos a la propiedad causará un error
if (pet.swim) {
  pet.swim();
} else if (pet.fly) {
  pet.fly();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para que funcione el mismo código, necesitaremos usar una aserción de tipo:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let pet = getSmallPet();

if ((pet as Fish).swim) {
  (pet as Fish).swim();
} else if ((pet as Bird).fly) {
  (pet as Bird).fly();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Usando el operador in
&lt;/h2&gt;

&lt;p&gt;El operador in ahora actúa como una expresión de reducción para los tipos.&lt;/p&gt;

&lt;p&gt;Para una &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt; in expresión &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt;, donde &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt; es un literal de cadena o tipo de literal de cadena y &lt;strong&gt;&lt;em&gt;x&lt;/em&gt;&lt;/strong&gt; es un tipo de unión, la rama "verdadera" se estrecha a los tipos que tienen una propiedad opcional o requerida &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt;, y la rama "falsa" se estrecha a los tipos que tienen una opción o faltan propiedad &lt;strong&gt;&lt;em&gt;n&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function move(pet: Fish | Bird) {
  if ("swim" in pet) {
    return pet.swim();
  }
  return pet.fly();
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  typeof type guards
&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function isNumber(x: any): x is number {
  return typeof x === "number";
}

function isString(x: any): x is string {
  return typeof x === "string";
}

function padLeft(value: string, padding: string | number) {
  if (isNumber(padding)) {
    return Array(padding + 1).join(" ") + value;
  }
  if (isString(padding)) {
    return padding + value;
  }
  throw new Error(`Expected string or number, got '${padding}'.`);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Sin embargo, tener que definir una función para determinar si un tipo es primitivo es una molestia. Afortunadamente, no necesita abstraer &lt;code&gt;typeof x === "number"&lt;/code&gt; en su propia función porque TypeScript lo reconocerá como un protector de tipo por sí solo. Eso significa que podríamos escribir estos cheques en línea.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function padLeft(value: string, padding: string | number) {
  if (typeof padding === "number") {
    return Array(padding + 1).join(" ") + value;
  }
  if (typeof padding === "string") {
    return padding + value;
  }
  throw new Error(`Se espera un string o number, no '${padding}'.`);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Tipos Anulables
&lt;/h2&gt;

&lt;p&gt;Efectivamente, &lt;code&gt;null&lt;/code&gt; y &lt;code&gt;undefined&lt;/code&gt; son valores válidos de cada tipo. Eso significa que no es posible evitar que se asignen un tipo &lt;code&gt;null&lt;/code&gt;, incluso cuando desee evitarlo. El inventor de null, Tony Hoare, llama a esto su "error de mil millones de dólares".&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let s = "foo";
s = null; // error, 'null' no esta asignado para 'string'
let sn: string | null = "bar";
sn = null; // ok

sn = undefined; // error, 'undefined' no esta asignado para 'string | null'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Parámetros y propiedades opcionales
&lt;/h2&gt;

&lt;p&gt;Con &lt;code&gt;--strictNullChecks&lt;/code&gt;, un parámetro opcional agrega automáticamente | undefined:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function f(x: number, y?: number) {
  return x + (y || 0);
}
f(1, 2);
f(1);
f(1, undefined);
f(1, null); // error, 'null' no es asignable a 'number | undefined'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Lo mismo es cierto para las propiedades opcionales:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class C {
  a: number;
  b?: number;
}
let c = new C();
c.a = 12;
c.a = undefined; // error, 'undefined' no es asignable a 'number'
c.b = 13;
c.b = undefined; // ok
c.b = null; // error, 'null' no es asignable a 'number | undefined'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Escribir guardias y aserciones
&lt;/h2&gt;

&lt;p&gt;Dado que los tipos anulables se implementan con una unión, debe usar un protector de tipo para deshacerse de él null. Afortunadamente, este es el mismo código que escribirías en JavaScript:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function f(sn: string | null): string {
  if (sn == null) {
    return "default";
  } else {
    return sn;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;La eliminación de &lt;code&gt;null&lt;/code&gt; es bastante obvia aquí, pero también puede usar operadores &lt;code&gt;terser&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function f(sn: string | null): string {
  return sn || "default";
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Type Aliases
&lt;/h2&gt;

&lt;p&gt;Los tipos Aliases son similares a las interfaces pero pueden nombrar tipos primitivos, tuplas y cualquier otro tipo que se tendria que escribir a mano&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type Name = string;
type NameResolver = () =&amp;gt; string;
type NameOrResolver = Name | NameResolver;

function getName(n: NameOrResolver): Name {
  if (typeof n === "string") {
    return n;
  } else {
    return n();
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;También podemos hacer que un tipo Aliases se refiera a sí mismo en una propiedad:&lt;/p&gt;

&lt;p&gt;type Tree = {&lt;br&gt;
  value: T;&lt;br&gt;
  left: Tree;&lt;br&gt;
  right: Tree;&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;Junto con los tipos de intersección, podemos hacer algunos tipos bastante alucinantes:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type LinkedList&amp;lt;T&amp;gt; = T &amp;amp; { next: LinkedList&amp;lt;T&amp;gt; };

interface Person {
  name: string;
}

var people: LinkedList&amp;lt;Person&amp;gt;;
var s = people.name;
var s = people.next.name;
var s = people.next.next.name;
var s = people.next.next.next.name;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</description>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Enums en TypeScript</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Tue, 21 Apr 2020 19:16:28 +0000</pubDate>
      <link>https://forem.com/juandelgado06/enums-en-typescript-2d58</link>
      <guid>https://forem.com/juandelgado06/enums-en-typescript-2d58</guid>
      <description>&lt;p&gt;Las enumeraciones son una de las pocas características que tiene TypeScript que no es una extensión de JavaScript de nivel de tipo.&lt;/p&gt;

&lt;p&gt;Las enumeraciones permiten a un desarrollador definir un conjunto de constantes con nombre. El uso de enumeraciones puede hacer que sea más fácil documentar la intención o crear un conjunto de casos distintos. TypeScript proporciona enumeraciones numéricas y basadas en cadenas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numeric enums
&lt;/h2&gt;

&lt;p&gt;Primero comenzaremos con enumeraciones numéricas, que probablemente sean más familiares si viene de otros idiomas. Se puede definir una enumeración usando la palabra clave &lt;strong&gt;&lt;em&gt;enum&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Direction {
  Up = 1,
  Down,
  Left,
  Right
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Arriba, tenemos una enumeración numérica donde Up se inicializa con 1. Todos los siguientes miembros se incrementan automáticamente a partir de ese punto. En otras palabras, Direction.Up tiene el valor 1, Down tiene 2, Left tiene 3 y Right tiene 4.&lt;/p&gt;

&lt;p&gt;Si quisiéramos, podríamos dejar los inicializadores por defecto:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Direction {
  Up,
  Down,
  Left,
  Right
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Aquí, Up tendría el valor 0, Down tendría 1, etc...&lt;/p&gt;

&lt;p&gt;Usar una enumeración es simple: simplemente acceda a cualquier miembro como una propiedad fuera de la enumeración misma y declare los tipos utilizando el nombre de la enumeración:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Respuesta {
    No = 0,
    Si = 1
}

function quedate(nombre: string, mensaje: Respuesta): void {
    if (mensaje === 1) {
        console.log(`Hola ${nombre}`);
    } else {
        console.log(`Vete de aqui ${nombre}`);
    }
}

quedate("Pequeña Andreita", Respuesta.Si);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  String enums
&lt;/h2&gt;

&lt;p&gt;Las enumeraciones de cadena son un concepto similar, pero tienen algunas diferencias sutiles de tiempo de ejecución como se documenta a continuación. En una cadena de enumeración, cada miembro debe inicializarse constantemente con una cadena literal o con otro miembro de cadena de enumeración.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum Direction {
  Up = "UP",
  Down = "DOWN",
  Left = "LEFT",
  Right = "RIGHT"
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Si bien las enumeraciones de cadenas no tienen un comportamiento de incremento automático, las enumeraciones de cadenas tienen el beneficio de que se "serializan" bien. En otras palabras, si estaba depurando y tuvo que leer el valor de tiempo de ejecución de una enumeración numérica, el valor a menudo es opaco: no transmite ningún significado útil por sí solo (aunque la asignación inversa a menudo puede ayudar), las enumeraciones de cadena le permiten para dar un valor significativo y legible cuando se ejecuta su código, independientemente del nombre del miembro &lt;strong&gt;&lt;em&gt;enum&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Heterogeneous enums
&lt;/h2&gt;

&lt;p&gt;Técnicamente, las enumeraciones se pueden mezclar con parametros de cadena y numéricos, pero no está claro por qué querría hacerlo:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum BooleanLikeHeterogeneousEnum {
  No = 0,
  Yes = "YES"
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Miembros calculados y constantes
&lt;/h2&gt;

&lt;p&gt;Cada miembro de la enumeración tiene un valor asociado que puede ser constante o calculado . Un miembro de enumeración se considera constante si:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Es el primer miembro de la enumeración y no tiene inicializador, en cuyo caso se le asigna el valor 0:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum E {
  X
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;No tiene un inicializador y el miembro de enumeración anterior era una constante numérica . En este caso, el valor del miembro de enumeración actual será el valor del miembro de enumeración anterior más uno.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum E1 {
  X,
  Y,
  Z
}

enum E2 {
  A = 1,
  B,
  C
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;El miembro enum se inicializa con una expresión enum constante. Una expresión enum constante es un subconjunto de expresiones TypeScript que se pueden evaluar completamente en tiempo de compilación. Una expresión es una expresión de enumeración constante si es:&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;una expresión de enumeración literal (básicamente un literal de cadena o un literal numérico)&lt;/li&gt;
&lt;li&gt;una referencia al miembro de enumeración constante previamente definido (que puede originarse en una enumeración diferente)&lt;/li&gt;
&lt;li&gt;una expresión de enumeración constante entre paréntesis&lt;/li&gt;
&lt;li&gt;uno de los +, -, ~operadores unarios aplica a la expresión enum constante&lt;/li&gt;
&lt;li&gt;+, -, *, /, %, &amp;lt;&amp;lt;, &amp;gt;&amp;gt;, &amp;gt;&amp;gt;&amp;gt;, &amp;amp;, |, ^Los operadores binarios con expresiones constantes de enumeración como operandos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;En todos los demás casos, el miembro enum se considera calculado.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum FileAccess {
  // constant members
  None,
  Read = 1 &amp;lt;&amp;lt; 1,
  Write = 1 &amp;lt;&amp;lt; 2,
  ReadWrite = Read | Write,
  // computed member
  G = "123".length
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

</description>
      <category>enums</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Unions and Intersection Types en TypeScript</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Tue, 21 Apr 2020 18:41:23 +0000</pubDate>
      <link>https://forem.com/juandelgado06/unions-and-intersection-types-en-typescript-17jm</link>
      <guid>https://forem.com/juandelgado06/unions-and-intersection-types-en-typescript-17jm</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Soy una nota nice&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A veces debemos de admitir parámetros en una funcion donde el tipo de parametro puede ser por ejemplo &lt;strong&gt;String&lt;/strong&gt; o &lt;strong&gt;Number&lt;/strong&gt; : &lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function padLef(value: string, padding: any) {
    if (typeof padding === "number") {
        return Array(padding + 1).join(" ") + value;
    }
    if (typeof padding === "string") {
        return  `${value} ${padding}`;
    }
    throw new Error(`Solo se admiten tipos de valores string o number, no se aceptan ${padding}`)
}

console.log(padLef("Hola mundo", 10));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;El problema de declarar el parametro &lt;strong&gt;padding&lt;/strong&gt; como &lt;strong&gt;any&lt;/strong&gt; es que recibe cualquier tipo de valor ya sea &lt;strong&gt;true* o hasta un **Array&lt;/strong&gt; y el compilador de Typescript lo aceptara sin problemas.&lt;/p&gt;

&lt;p&gt;Para solucionar este problema utilizaremos las uniones de Typescript, donde solo se aceptaran los tipos que se declaren en el parámetro, no hay limite de uniones puedes utilizar 2 o mas uniones si es necesario:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function padLeft(value: string, padding: string | number) {
  // ...
}

let indentedString = padLeft("Hello world", true);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;El compilador de Typescript nos dirá que no se puede aceptar valores Booleanos porque en el parametro solo aceptan valores de tipo &lt;strong&gt;string&lt;/strong&gt; o &lt;strong&gt;number&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Sindicatos discriminantes
&lt;/h2&gt;

&lt;p&gt;Una técnica común para trabajar con uniones es tener un solo campo que use tipos literales que puede usar para permitir que TypeScript reduzca el posible tipo actual. Por ejemplo, vamos a crear una unión de tres tipos que tienen un solo campo compartido.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type NetworkLoadingState = {
    state: "loading";
  };

  type NetworkFailedState = {
    state: "failed";
    code: number;
  };

  type NetworkSuccessState = {
    state: "success";
    response: {
      title: string;
      duration: number;
      summary: string;
    };
  };

  // Crea un tipo que representa sólo uno de los tipos anteriores
  // pero aún no estás seguro de cuál es.
  type NetworkState =
    | NetworkLoadingState
    | NetworkFailedState
    | NetworkSuccessState;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Todos los tipos anteriores tienen un campo llamado &lt;strong&gt;state&lt;/strong&gt;, y luego también tienen sus propios campos. Dado que el campo &lt;strong&gt;state&lt;/strong&gt; es común en todos los tipos internos &lt;strong&gt;NetworkState&lt;/strong&gt;, es seguro para su código acceder sin una verificación de existencia.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>guia</category>
    </item>
    <item>
      <title>Generics de TypeScript</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Tue, 21 Apr 2020 15:31:23 +0000</pubDate>
      <link>https://forem.com/juandelgado06/generics-de-typescript-23ge</link>
      <guid>https://forem.com/juandelgado06/generics-de-typescript-23ge</guid>
      <description>&lt;p&gt;En lenguajes como C# y Java, una de las principales herramientas de la caja de herramientas para crear componentes reutilizables son los genéricos, es decir, poder crear un posible .Esto permite a los usuarios consumir estos componentes y utilizar sus propios tipos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hola Mundo con Generics
&lt;/h2&gt;

&lt;p&gt;Para empezar, hagamos el "hola mundo" de los genéricos: la función de identity. La función de la identity es una función que devolverá lo que se le pase. Puedes pensar en esto de forma similar al comando .echo&lt;/p&gt;

&lt;p&gt;Sin los genéricos, tendríamos que dar a la función de identidad un tipo específico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; function identity(arg: number): number {
    return arg;
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O, podríamos describir la función de identidad usando el tipo:any&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt; function identity(arg: any): any {
    return arg;
 }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Aunque el uso es ciertamente genérico en el sentido de que hará que la función acepte todos los tipos para el type of, en realidad estamos perdiendo la información sobre cuál era ese tipo cuando la función retorne. Si pasamos un número, la única información que tenemos es que cualquier tipo podría ser devuelto. &lt;em&gt;any arg&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;En cambio, necesitamos una forma de capturar el tipo de argumento de tal manera que también podamos usarlo para denotar lo que se está devolviendo. Aquí, usaremos una &lt;em&gt;type variable&lt;/em&gt;, un tipo especial de variable que funciona con tipos en lugar de valores.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function identity&amp;lt;T&amp;gt;(arg: T): T {
    return arg;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Ahora hemos añadido una tipo de variable a la función de identidad. Esto nos permite capturar el tipo que el usuario proporciona (por ejemplo), para poder usar esa información más tarde. Aquí, usamos de nuevo como el tipo de retorno. En la inspección, ahora podemos ver que el mismo tipo se utiliza para el argumento y el tipo de retorno. Esto nos permite traficar ese tipo de información en un lado de la función y en el otro.&lt;/p&gt;

&lt;p&gt;Decimos que esta versión de la función es genérica, ya que funciona sobre una serie de tipos. A diferencia de la utilización , también es tan precisa (es decir, no pierde ninguna información) como la primera función que utilizó números para el argumento y devuelve &lt;em&gt;type. identity any identity&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Una vez que hemos escrito la función de identidad genérica, podemos llamarla de una de dos maneras. La primera forma es pasar todos los argumentos, incluyendo el tipo de argumento, a la función:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let output = identity&amp;lt;string&amp;gt;("myString");  // El tipo de salida será 'string'
console.log(output);
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Aquí nos fijamos explícitamente como uno de los argumentos de la llamada a la función, denotando el uso de los argumentos de alrededor en lugar de .&lt;em&gt;T string &amp;lt;&amp;gt; ()&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;La segunda forma es también quizás la más común. Aquí usamos el tipo de inferencia de argumento, es decir, queremos que el compilador establezca el tipo de argumento por nosotros automáticamente basado en el tipo de argumento que pasamos en: &lt;em&gt;T&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let output = identity("myString");  // El tipo de salida será 'string'
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Fíjense que no tuvimos que pasar explícitamente el tipo en los corchetes angulares (); el compilador sólo miró el valor , y estableció su tipo. Mientras que la inferencia de los argumentos de tipo puede ser una herramienta útil para mantener el código más corto y más legible, puede ser necesario pasar explícitamente los argumentos de tipo como hicimos en el ejemplo anterior cuando el compilador falla en la inferencia del tipo, como puede suceder en ejemplos más complejos.&lt;em&gt;&amp;lt;&amp;gt; "myString" T&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trabajando con Variables de Tipo Genérico
&lt;/h2&gt;

&lt;p&gt;Cuando comiences a usar genéricos, notarás que cuando creas funciones genéricas, el compilador hará que uses correctamente cualquier parámetro tecleado genéricamente en el cuerpo de la función. Es decir, que realmente tratas estos parámetros como si pudieran ser cualquier tipo de identidad.&lt;/p&gt;

&lt;p&gt;Tomemos nuestra función de antes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function identity&amp;lt;T&amp;gt;(arg: T): T {
    return arg;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;¿Y si queremos registrar también la longitud del argumento en la consola con cada llamada? Podríamos estar tentados a escribir esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function loggingIdentity&amp;lt;T&amp;gt;(arg: T): T {
    console.log(arg.length);  // Error: T doesn't have .length
    return arg;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Digamos que en realidad hemos pretendido que esta función funcione en matrices de más que directamente. Ya que estamos trabajando con matrices, el número de miembros debería estar disponible. Podemos describirlo como si creáramos matrices de otros tipos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function loggingIdentity&amp;lt;T&amp;gt;(arg: T[]): T[] {
    console.log(arg.length);  // La matriz tiene una longitud, así que no hay más errores.
    return arg;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Puedes leer el tipo de como "la función genérica toma un parámetro  y un argumento que es un array de s, y devuelve un array de s". Si pasamos una serie de números, obtendríamos una serie de números de vuelta. Esto nos permite utilizar nuestra variable de tipo genérico como parte de los tipos con los que estamos trabajando, en lugar de todo el tipo, dándonos una mayor flexibilidad.&lt;/p&gt;

&lt;p&gt;Podemos escribir el ejemplo de la muestra de esta manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function loggingIdentity&amp;lt;T&amp;gt;(arg: Array&amp;lt;T&amp;gt;): Array&amp;lt;T&amp;gt; {
    console.log(arg.length);  // La matriz tiene una longitud, así que no hay más errores.
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Escribiendo una interfaz genérica
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface GenericIdentityFn {
    &amp;lt;T&amp;gt;(arg: T): T;
}

function identity&amp;lt;T&amp;gt;(arg: T): T {
    return arg;
}

let myIdentity: GenericIdentityFn = identity;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Clases Genéricas
&lt;/h2&gt;

&lt;p&gt;Una clase genérica tiene una forma similar a una interfaz genérica. Las clases genéricas tienen una lista de parámetros de tipo genérico entre corchetes angulares () siguiendo el nombre de la clase.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class GenericNumber&amp;lt;T&amp;gt; {
    zeroValue: T;
    add: (x: T, y: T) =&amp;gt; T;
}

let myGenericNumber = new GenericNumber&amp;lt;number&amp;gt;();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Este es un uso bastante literal de la clase, pero es posible que haya notado que nada está restringiendo a usar solo el tipo. Podríamos haber usado o incluso objetos más complejos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;let stringNumeric = new GenericNumber&amp;lt;string&amp;gt;();
stringNumeric.zeroValue = "";
stringNumeric.add = function(x, y) { return x + y; };

console.log(stringNumeric.add(stringNumeric.zeroValue, "test"));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Al igual que con la interfaz, colocar el parámetro type en la propia clase nos permite asegurarnos de que todas las propiedades de la clase están trabajando con el mismo tipo.&lt;/p&gt;

</description>
      <category>generics</category>
      <category>typescript</category>
      <category>javascript</category>
      <category>ecmascript</category>
    </item>
    <item>
      <title>(MEGA) Diseño y Programación Orientada a Objetos en C+</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Fri, 03 Apr 2020 17:15:56 +0000</pubDate>
      <link>https://forem.com/juandelgado06/mega-diseno-y-programacion-orientada-a-objetos-en-c-36mk</link>
      <guid>https://forem.com/juandelgado06/mega-diseno-y-programacion-orientada-a-objetos-en-c-36mk</guid>
      <description>&lt;p&gt;La programación orientada a objetos (OOP) es una estructura de programación en la que los programas se organizan en torno a objetos en oposición a la acción y la lógica. Esta es esencialmente una filosofía de diseño que utiliza un conjunto diferente de lenguajes de programación como C#. Entender los conceptos de OOP puede ayudar a tomar decisiones sobre cómo debe diseñar una aplicación y qué lenguaje usar.&lt;/p&gt;

&lt;p&gt;Todo en OOP se coloca junto como "objetos" autosostenibles. Un objeto es una combinación de variables, funciones y datos que realiza un conjunto de actividades relacionadas. Cuando el objeto realiza esas actividades, define el comportamiento del objeto. Además, un objeto es una instancia de una clase. Además, C# ofrece soporte completo para OOP incluyendo herencia, encapsulación, abstracción y polimorfismo.&lt;/p&gt;

&lt;p&gt;¿Que aprenderás en este curso?&lt;br&gt;
En este curso sobre desarrollo de software con C# orientado a objetos aprenderás a construir software utilizando buenas prácticas de programación orientada a objetos, identificar puntos de mejora en los distintos módulos de una aplicación, realizar diagramas UML de las clases del sistema y aplicar los cinco principios SOLID de diseño orientado a objetos.&lt;/p&gt;

&lt;p&gt;ENCUENTRALO AQUI Y DESCARGALO GRATIS: &lt;a href="https://codepici-blog.site/udemy-diseno-y-programacion-orientada-a-objetos-en-c/"&gt;https://codepici-blog.site/udemy-diseno-y-programacion-orientada-a-objetos-en-c/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>curso</category>
      <category>c</category>
      <category>progracion</category>
    </item>
    <item>
      <title>Curso JavaScript desde cero</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Mon, 21 Oct 2019 02:14:19 +0000</pubDate>
      <link>https://forem.com/juandelgado06/curso-javascript-desde-cero-144f</link>
      <guid>https://forem.com/juandelgado06/curso-javascript-desde-cero-144f</guid>
      <description>&lt;p&gt;En este curso aprenderás los fundamentos de este gran lenguaje de programación que se utiliza en toda la web. Javascript es el único lenguaje con el que se puedes programar desde el Frondend y el Backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué aprender JavaScript?
&lt;/h2&gt;

&lt;p&gt;Un﻿﻿ lenguaje para dominarlos a todos, tanto frontend, como backend, como aplicaciones móviles y de escritorio.&lt;br&gt;
Es fácil de empezar a desarrollar. Es el lenguaje más activo en este momento, con una comunidad cada vez más grande.Uno de los lenguajes ﻿más solicitados en el mundo laboral.﻿Nos ofrece esta la posibilidad de desarrollar videojuegos mediante diferentes motores﻿﻿.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué﻿﻿﻿﻿﻿﻿﻿ aprenderás﻿﻿﻿ en el curso?
&lt;/h2&gt;

&lt;p&gt;Aprenderas el lenguaje en su versión más reciente y aprenderás a crear un juego estilo Mario Bros. &lt;/p&gt;

&lt;h2&gt;
  
  
  Temario :
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Historia&lt;/li&gt;
&lt;li&gt;Variables y tipos&lt;/li&gt;
&lt;li&gt;Funciones&lt;/li&gt;
&lt;li&gt;Arrays&lt;/li&gt;
&lt;li&gt;Diccionarios&lt;/li&gt;
&lt;li&gt;Objetos&lt;/li&gt;
&lt;li&gt;Prototipos&lt;/li&gt;
&lt;li&gt;High-order functions&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Aqui puedes entontrar el curso y lo puedes descarga gratis &lt;a href="https://codepici-blog.site/keepcoding-curso-java-script-desde-cero/"&gt;miralo aquí&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Espero y te sirva!! 🤓💻&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Guía rápida de Yarn</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Tue, 15 Oct 2019 15:06:38 +0000</pubDate>
      <link>https://forem.com/juandelgado06/guia-rapida-de-yarn-5alj</link>
      <guid>https://forem.com/juandelgado06/guia-rapida-de-yarn-5alj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Yarn&lt;/strong&gt; es un gestor de paquetes rápido, confiable y seguro, es una excelente alternativa a npm ya que &lt;strong&gt;yarn&lt;/strong&gt; es mucho mas rápido porque almacena en cache los paquetes descargados y realiza operaciones en paralelo para maximizar la utilización de recursos. En este post te voy a mostrar las cosas mas importantes que debes de saber, como descargarlo y como utilizarlo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación
&lt;/h2&gt;

&lt;p&gt;Te mostrare dos maneras de instalar &lt;strong&gt;Yarn&lt;/strong&gt;, estas son :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deberás de tener Instalado &lt;a href="https://nodejs.org/es/"&gt;Node.js&lt;/a&gt; para poder utilizarlo&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Descargando el Instalar de Window&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Win&lt;/strong&gt;: &lt;a href="https://yarnpkg.com/latest.msi"&gt;Descargar Instalador&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Esta es la manera mas rápida y fácil de instalar &lt;strong&gt;Yarn&lt;/strong&gt;, ejecuta en tu consola o terminal lo siguiente :&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;npm install --global yarn&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ahora comprueba que &lt;strong&gt;Yarn&lt;/strong&gt; se instalo correctamente ejecutando el siguiente comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Si todo salio bien deberá de aparecerte la versión mas reciente de &lt;strong&gt;Yarn&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Como Utilizarlo
&lt;/h2&gt;

&lt;p&gt;Después de instalar &lt;strong&gt;Yarn&lt;/strong&gt; puedes empezar a utilizarlo ejecutando un simple comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn init&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Puedes utilizar &lt;strong&gt;yarn&lt;/strong&gt; incluso si ya estabas trabajando con &lt;strong&gt;npm&lt;/strong&gt;, lo único que debes de hacer es borrar el archivo &lt;strong&gt;&lt;em&gt;package-lock.json&lt;/em&gt;&lt;/strong&gt; para que &lt;strong&gt;yarn&lt;/strong&gt; trabaje sin problemas&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Instalar todas las dependencias de un proyecto:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;yarn&lt;/code&gt; o &lt;code&gt;yarn install&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Instalar dependencias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;yarn add [package] - ejemplo: yarn add vue&lt;/code&gt;&lt;/li&gt;
&lt;li&gt; &lt;code&gt;yarn add [package]@[version] - ejemplo: yarn add vue@[2.6.8]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yarn add [package] --dev - ejemplo: yarn add vue --dev&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Actualizar dependías:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn upgrade [package] - ejemplo: yarn upgrade vue&lt;/code&gt;&lt;/p&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Eliminar dependías:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn remove[package] - ejemplo: yarn remove vue&lt;/code&gt;&lt;/p&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y listo eso es todo por este post, ya aprendiste como poder utilizar &lt;strong&gt;Yarn&lt;/strong&gt; en tus proyectos de una manera rápida y fácil. Cualquier duda o sugerencia la puedes dejar en los comentarios.&lt;/p&gt;

&lt;p&gt;Actualmente estoy trabajando en la construcción de un Blog personal, lo estoy desarrollando con Gridsome un generador de sitios estáticos y obviamente con Vue. Me gustaría recibir unas opiniones de como luce mi Blog y que mas podría añadirle, si me quieres ayudar me puedes dejar un comentario, seria de gran ayuda. Este es mi Blog  &lt;a href="https://codepici-blog.site/"&gt;CodePici&lt;/a&gt;&lt;/p&gt;

</description>
      <category>yarn</category>
      <category>npm</category>
    </item>
    <item>
      <title>My Colors 🐱‍🏍</title>
      <dc:creator>Juan Delgado</dc:creator>
      <pubDate>Mon, 02 Sep 2019 13:51:14 +0000</pubDate>
      <link>https://forem.com/juandelgado06/my-colors-3o9i</link>
      <guid>https://forem.com/juandelgado06/my-colors-3o9i</guid>
      <description>&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/DeadBeckham/embed/YzKrWbL?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>css</category>
      <category>scs</category>
    </item>
  </channel>
</rss>
