Interesting idea. This sounds like an issue that could potentially be solved in a more general purpose way. For example, I know it's common for a function that expects a string to take whatever parameter it recieves and coerce it into a string, as a first step, like this:
function concat(x_, y_) {
const x = String(x_)
const y = String(y_)
return x + y
}
What if, at any location where you're binding a value to a variable, you're allowed to pass the incomming value through a normalization function first, through, say, a "from" keyword (I don't like this "from" word - feel free to bikeshed it). That would make the above example equivalent to this:
function concat(x from String, y from String) {
return x + y
}
It would also allow you to automatically coerce an unknown value to an error.
try {
foo();
} catch (e from Error) {
console.log(e.stack);
}
// ... is the same as ...
try {
foo();
} catch (e_) {
let e = Error(e_)
console.log(e.stack);
}
Some more usage examples :
const normalizedDegrees = deg => deg % 360
function toRadians(deg from normalizedDegrees) {
// ...
}
const positiveNumberAssertion = value => {
if (value <= 0) throw new Error('Whoops!')
return value
}
function doOperation(x from positiveNumberAssertion) {
// ...
}
const {
index from i => i + 1,
...otherParams
} = data