Beim Zugriff auf Objekte und Variablen gibt es immer wieder kleine Pitfalls. Manchmal ist das Objekt leer, wir lesen aber eine Property daraus und bekommen dann natürlich cannot read property 'x' of undefined
. Einige dieser Pitfalls sind:
Ein Monad verhält sich wie ein Container der dieses Verhalten abstrahiert und uns die Möglichkeit gibt uns mehr auf das zu fokussieren was wir wirklich tun wollen: Mit den Werten arbeiten.
Schauen wir nochmal auf die Liste und gucken welcher Monad uns wann hilft?
Die npm Library TsMonad implementiert den Maybe und Either Monad und gibt uns die Möglichkeit u.a. den Zugriff auf Properties und Methoden in Objekten elegant umzusetzen ohne vorher nervige, verschachtelte If Statements zu bauen, um die Existenz zu prüfen.
const vehicle = {
type: 'Tesla Model S',
color: 'red',
engine: {
horsepower: 386
}
}
getVehicleHorsepower(vehicle) {
if(vehicle && vehicle.engine && vehicle.engine.horsepower) {
return vehicle.engine.horsepower;
}
return 0;
}
const vehicle = {
type: 'Tesla Model 3',
color: 'black',
engine: {
horsepower: 340
}
}
getVehicleHorsepower(vehicle) {
return Maybe.just(vehicle.engine.horsepower).caseOf({
just: () => vehicle.engine.horsepower,
nothing: () => 0
})
}
const vehicle = {
type: 'Tesla Model X',
color: 'grey',
engine: {
horsepower: 420
}
}
getVehicleHorsepower(vehicle) {
if(vehicle && vehicle.engine && vehicle.engine.horsepower) {
return vehicle.engine.horsepower;
} else {
console.log('Error: No horsepower found!');
return 0;
}
}
const vehicle = {
type: 'Tesla Model 3',
color: 'black',
engine: {
horsepower: 330
},
getHorsepower: () => {
this.engine.horsepower ?
Either.left<string, number>('Error: No horsepower found!')
Either.right<string, number>(this.engine.horsepower)
}
}
getVehicleHorsepower(vehicle) {
return vehicle.getHorsepower()
.caseOf({
right: number => vehicle.engine.horsepower)
left: errorMessage => {
console.log(errorMessage);
return 0;
}
});
}
3 Dec 2018 #Typescript #Monads #tsmonad #Either #Maybe