Translate

jueves, 25 de junio de 2020

Intersección de tipos en Typescript

Poco he hablado de Typescript, la verdad que fruto de mi ignorancia, no me llamo la atención este lenguaje y me parecia que aportaba poco o nada al mundo de los lenguajes. Y me equivoque feo.

Typescript tiene un conjunto de características por demás interesantes, que voy a ver en este post y en una serie de post que voy a escribir (si no me aburro) 

Ahora vamos a hablar de Intersección de tipos en Typescript.

Un tipo de intersección combina múltiples tipos en uno. Esto le permite agregar tipos existentes para obtener un solo tipo que tenga todas las características que necesita. Por ejemplo, Person & Serializable & Loggable es Person, Serializable y Loggable. Eso significa que un objeto de este tipo tendrá todos los miembros de los tres tipos.

Los tipos de intersección son utilizados mayormente para mixins y otros conceptos que no encajan en el molde clásico orientado a objetos. (¡Hay muchos de estos en JavaScript!) Aquí hay un ejemplo simple que muestra cómo crear un mixin:

function extend<First, Second>(first: First, second: Second): First & Second {
    const result: Partial<First & Second> = {};
    for (const prop in first) {
        if (first.hasOwnProperty(prop)) {
            (result as First)[prop] = first[prop];
        }
    }
    for (const prop in second) {
        if (second.hasOwnProperty(prop)) {
            (result as Second)[prop] = second[prop];
        }
    }
    return result as First & Second;
}

class Person {
    constructor(public name: string) { }
}

interface Loggable {
    log(name: string): void;
}

class ConsoleLogger implements Loggable {
    log(name) {
        console.log(`Hello, I'm ${name}.`);
    }
}

const jim = extend(new Person('Jim'), ConsoleLogger.prototype);
jim.log(jim.name);

Puff, super potente!!