Blog
Silicon Graphics made awesome computers
A long time ago, I used to work as a video editor and motion graphics artist. In those days, Silicon Graphics made the most incredible hardware which ran all the best and most advanced software for creating visual effects.
I never got to work with any of these machines but I always loved the way they looked. I wish someone brings back this design aesthetic. I’m kinda bored with how all computers look now days.
You have Apple’s, extreme simplicity on one side and crazy liquid cooled flashing LED clear case on the other. What Silicon Graphics did looked modern, fun and clean.
User-defined type guards in TypeScript
Decided to write this blog post because I couldn’t find any documentation or online examples like the one I’m sharing here. Every example I’ve seen the user-defined type guard is used to replace the whole type definition and not specific properties.
Here’s the code without type guard.
interface Config {
foo: string;
bar: string;
}
class Thing {
name: string;
config?: Config;
constructor(name: string, config?: Config) {
this.name = name;
this.config = config;
}
// 👀 returning boolean, will change on next example
hasConfig(): boolean {
if (this.config) {
return true;
}
return false;
}
}
let firstThing = new Thing("Apple", { foo:"one", bar: "two" });
if (firstThing.hasConfig()) {
// #1 - Here firstThing.config is `Config | undefined`
console.log(firstThing.config.foo);
}
if (firstThing.config) {
// #2 - Here firstThing.config is `Config`
console.log(firstThing.config.foo);
}
On #1 firstThing.config
. is Config | undefined
even though we know it can’t be undefined
because our hasConfig
method made sure the value is truthy.
On #2 firstThing.config
is Config
as expected.
So in order to help TypeScript detect the correct type we can use a type predicate as the return type.
interface Config {
foo: string;
bar: string;
}
class Thing {
name: string;
config?: Config;
constructor(name: string, config?: Config) {
this.name = name;
this.config = config;
}
// 👀 notice the return type
hasConfig(): this is { config: Config } {
if (this.config) {
return true;
}
return false;
}
}
let firstThing = new Thing("Apple", { foo:"one", bar: "two" });
if (firstThing.hasConfig()) {
// Now firstThing.config is `Config`
console.log(firstThing.config.foo);
}
Now firstThing.config
is Config
as expected. Have in mind that even though the type guard says this is { config: Config }
, TypeScript will merge this type with the original type definition of Thing
.
Thanks to the nice folks at the TypeScript Discord who helped me solve this issue. Hope this helps more people.
The Scanimate
Amo este tipo de equipo análogo para video.
Aprendí editar video con equipos de esta generación y la verdad es que los extraño mucho. Recuerdo claramente el sonido de las VTR haciendo “rewind” y “pre-roll” para comenzar a grabar donde habías puesto el mark in. Recuerdo los switchers y controles de efectos.
Fue una época muy divertida y de aprender mucho.
Don’t use functions as callbacks unless they’re designed for it
The Mac Malware of 2020
Intercept and modify requests with this browser extension
Apple’s M1 Chip Benchmarks focused on the real-world programming
El Whistleblower

Otro excelente episodio de este podcast que se ha vuelto uno de mis favoritos. En Puerto Rico nos hacen falta mas “whistleblowers” y leyes que los protejan.