Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I'm in complete agreement that RTFM is something that you'll have to do, but us humans aren't good at being constantly vigilant.

Types are an additional layer on top, that can help provide context and information which is often difficult to get across in "plain english" in documentation, and they have the added benefit of being machine readable and verifiable so that a mistake that us humans make or an instance where we forget an edge case is more likely to be caught.

Before I used Flow, the documentation above a function like that would probably look something like this:

    /**
     * [normal docs here about what it does and where it's used]
     * 
     * keyExtractor is a function that will be called for each element in both the
     * new and old array, and it should return a string key that will uniquely
     * identify the element so that the combined array can be de-duplicated.
     */
It's not impossible to write out, and to be honest it probably wouldn't hurt to still add some of that into the function even if it's typed, but it's a lot more writing to get the point across, and it can be ambiguous, can easily become "desynced" with the code itself, and won't show up in IDE tooling when going to use the function (or if it does, it won't be easily parsable like a small type would be).

I'm not saying types let you use a function without knowing anything about what it does or how it's written, but that it makes it easier to just remember the basic ideas and it lets the type system catch some mistakes or problems, while also providing some additional "documentation".

>That's entirely Flow's fault.

Don't worry, I was wrong anyway! Even without typedefs it will error if you pass in arrays of 2 different types. But I believe some type systems will try to infer that the function is generic and can take either, and without explicitly defining the type constraints, will over-genericise (is that a word?) the function to allow it to allow more than the user expected it to.

A good type system in programming is both an additional safety net as well as a guiding hand. It doesn't replace documentation, but augments it, and makes it better, and can bail you out if you get it wrong (sometimes). I once heard types referred to as a "checksum" for your function. It can feel like you are just re-stating the obvious, but the compiler will verify that the implementation and the types are in agreement, and that helps prevent some kinds of bugs.



Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: