Garantiza los tipos de las respuestas
idioma: también disponible en:
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!
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 }
}
};