Since I met the out
keyword in C#, I’m trying to find an equivalent approach in JS.
So, please take a look at the code and leave your opinions of existing cases or suggestions of new ways to implement this.
The working version is inside this sandbox:
1 null on fail
const number_1 = tryParseNullOnFail(numberAsString);
if (null !== number_1) {
page.log(`#1 Converted '${numberAsString}' to ${number_1}`);
} else {
page.log(`Failed to convert '${numberAsString}'`);
}
2 kvp response
const { isNumber: isNumber_2, number: number_2 } = tryParseKvp(numberAsString);
if (isNumber_2) {
page.log(`#2 Converted '${numberAsString}' to ${number_2}`);
} else {
page.log(`Failed to convert '${numberAsString}'`);
}
3 by reference
const number_3 = [];
if (tryParseByReference(numberAsString, number_3)) {
page.log(`#3 Converted '${numberAsString}' to ${number_3[0]}`);
} else {
page.log(`Failed to convert '${numberAsString}'`);
}
4 condition expression
if (null != (number_4 = tryParseCondExp(numberAsString))) {
page.log(`#4 Converted '${numberAsString}' to ${number_1}`);
} else {
page.log(`Failed to convert '${numberAsString}'`);
}
5 IIFE short cercuit
const number_5 =
tryParseNullOnFail(numberAsString) ??
(() => {
page.log(`Failed to convert '${numberAsString}'`);
})();
page.log(`#5 Converted '${numberAsString}' to ${number_5}`);
6 high order function
function withTryParse(str, onSuccess, onFail) {
const number = Number(str);
isNumber(number) ? onSuccess(number) : onFail(str);
}
const onSuccess = (number_6) => {
page.log(`#6 Converted '${numberAsString}' to ${number_6}`);
};
const onFail = (str) => {
page.log(`Failed to convert '${str}'`);
};
withTryParse(numberAsString, onSuccess, onFail);
The mad professor
for (
var done = false, number_ = tryParseMad(numberAsString);
!done && null !== number_;
done = true
) {
page.log(`#* Converted '${numberAsString}' to ${number_}`);
}
10
out
parameters in C# are one way of implementing the “try get pattern”, where we may receive either nothing, or a value. So bool TryGetXxx<T>(out T value)
is a common way that that pattern is implemented in C#.
But for any language that offers discriminated unions, the Maybe<T>
type can be used instead. It either returns none
or a value. So if you can use TypeScript rather than JavaScript, then this StackOverflow answer summarises various ways this type can be created and used in TypeScript.
If you can’t use TypeScipt, then a common way of implementing a “poor man’s maybe type” is via using null
to represent none
, as per your “null on fail” option. Of course, this only works in situations where null
isn’t a valid return value, but if it isn’t this is a simple and effective solution to your requirement.
1