<div dir="ltr">There is no way currently to reliably verify types in JS. Type annotations cannot solve this completely, especially when you have an overloaded function. A way to reliably verify types would make this far easier. So far, here are the current options with their respective caveats:<div>

<br></div><div>1. `instanceof` - This returns true for the class, but also for subclasses. This isn't always desired.</div><div><br></div><div>2. `this.contructor === Foo` - The constructor property could easily be overwritten, rendering this relatively useless.</div>

<div><br></div><div>3. `typeof` - This only is useful for literals, with the exception of `null`.</div><div><br></div><div>4. `Object.prototype.toString.call()` - This returns the correct native object type for native objects, but returns `[object Object]` for all non-native objects, rendering it effectively useless. This includes object instances created from `class Foo {}`, etc.</div>

<div><br></div><div>This proposed operator, `is`, would basically use the same algorithm for the `instanceof` operator, but instead of walking up the prototype chain iteratively, it would only check the first level of the right side. The static and runtime semantics would be equal to that of the `instanceof` operator.</div>

<div><br></div><div>It would allow for simpler overloading, simpler assertions, simpler type checks, and simpler testing.</div><div><br></div><div>Example usage:</div><div><br></div><div>    class Foo {}</div><div>    class Bar extends Foo {}</div>

<div><br></div><div>    const assert = (message, test) => {</div><div>      if (!test) {</div><div>        throw new TypeError(message);</div><div>      }</div><div>    };</div><div><br></div><div>    let obj = new Bar();</div>

<div><br></div><div>    // none of these should throw<br></div><div>    assert('obj is of type Bar', obj is Bar);</div><div>    assert('obj is not of type Foo', !(obj is Foo));</div><div><br></div><div>One big question I have is whether a different keyword should be used (`isa`, etc), given its use as a keyword synonym to `===` in many compile-to-JS languages, most notably CoffeeScript.</div>

<div><div><br></div>-- <br>Isiah Meadows
</div></div>