Hey, all! We all use () => void
in typescript when we want to declare a function without arguments.
But do you know that this declaration can lead to bugs on runtime?
Let's consider the next example:
const verify = (address?: string) => address?.toLowerCase()
const verifyEmpty: () => void = verify
const onClick: (event: object) => void = verifyEmpty
onClick({ this: 'is not a string'})
In the example above we assign verify
function with optional argument to the function without arguments. And then reassign verifyEmpty
to onClick
.
But verify
and onClick
functions have different signatures of arguments: verify
accepts a string, while onClick
an object.
Does typescript allow this assignment through the third function verifyEmpty
without arguments?
Yes! And on runtime we'll get the error:
address.toLowerCase is not a function
.
Check it out on playground
So, how can we avoid that? How can we explicitly say, that function should have zero arguments?
The solution is pretty simple.
Let's just replace () => void
with (...args: undefined[]) => void;
:
const verify = (address?: string) => address?.toLowerCase()
const verifyEmpty: (...args: undefined[]) => void = verify
const onClick: (event: object) => void = verifyEmpty
onClick({ this: 'is not a string'})
Now, the typescript tells us that verifyEmpty
can't be assigned to onClick
function: playground. The code won't compile and you won't see annoying bug on runtime.
Thanks for reading, hope it will help someone!
Happy coding and stay safe!
Top comments (1)
Great article, you got my follow, keep writing!