Skip to content

Latest commit

 

History

History
155 lines (106 loc) · 4.71 KB

LEEME.md

File metadata and controls

155 lines (106 loc) · 4.71 KB

guarantee-type

Garantiza los tipos de las respuestas

extending npm-version build coverage outdated-deps

idioma: castellano también disponible en: inglés

Objetivo

Cuando en Typescript llegamos al momento de tener todos nuestros sistemas fuertemente tipados aparecen situaciones donde es difícil evitar el uso de any.

Por ejemplo cuando levantamos datos de LocalStorage, los transferimos a través de la red o los levantamos de la base de datos y nuestro ORM no es fuertemente tipado en las respuestas, lo que obtenemos es un objeto any.

type Person = {
    name: string,
    age?: number,
    active: boolean, 
    due: Date
};

function print(person: Person){
    // ...
};

print(JSON.parse(localStorage['person1'])) // 💩 receiving any

// Using https://node-postgres.com/
const res = await client.query('SELECT $1::text as message', ['Hello world!'])
console.log(res.rows[0].messagggge)  // 💩 receiving undefined because the typo

Actualmente Typescript no impide asignar any a un tipo determinado. Sería bueno tener una manera de que lo detecte, pero independientemente de eso necesitamos una manera de validar y setear los tipos de forma fuertemente tipada.

import { guarantee, is, GuaranteedType } from "guarantee-type";

var descriptionPerson = is.object({
    name: is.string,
    age: is.optional.number,
    active: is.boolean,
    due: is.class(Date)    // for Date class only you can write is.Date
});

type Person = GuaranteedType<typeof descriptionPerson>;

function print(person: Person){
    // ...
};

print(guarantee(descriptionPerson, JSON.parse(localStorage['person1']))); // 👍 ok, type guaranteed!

// Using https://node-postgres.com/
const res = await client.query('SELECT $1::text as message', ['Hello world!'])
console.log(guarantee( is.object({message: is.string}), res.rows[0]).messagggge)  // 👍 ok, typo detected!

Profundizando

El mecanismo is para describir los tipos es una abreviación. Las descripciones se pueden escribir y transmitir en un objeto que puede codificarse en formato JSON. Por ejemplo la descripción descriptionPerson puede esciribirse directamente en un objetos simple:

var descriptionPerson = { 
    object: {
        name: { string: {} },
        age: { optional: { number: {} },
        active: { boolean: {} },
        due: { class: Date }
    }
};

Licencia

MIT