Hacker News new | past | comments | ask | show | jobs | submit login

arr was defined to be an array of strings. How are you pushing a boolean there?



Because you've given the function no information on whether those two "things" are related. You're saying when it gets passed into that function it can be treated as either with type widening.

I understand it may be unwanted at first glance, but this is a contrived example for demo purposes. You wouldn't really make an "add to array" function like this so specifically. You would use generics, which would solve the exact issue that is posed.

    function add<T>(item: T, dst: T[]): void {
        dst.push(item);
      }
Now you can work with any array, and it will only add items with the right type.

If you really need it to be just <Thing>, you can do this

    function add<T extends Thing>(item: T, dst: T[]): void {
        dst.push(item);
    }
Now it knows that Item and DST are related but need to be Thing.

There's not a lot of languages with unions that handle this differently. F# discriminated unions make you specify which type you're using every time. For example, this doesn't even compile.

    type Thing =
        | A of int
        | B of bool
    let arr: Thing list = [1]  // Not an A or B type!




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

Search: