How TypeScript can teach you web standards

Categories TypeScript

Recently my team decided to migrate all views in our Angular 1.x application to React. To me, the value of React is doubled if used together with TypeScript. I enjoy developing views when I have autocompleted and static checks for the view model, used in the view. I also can safely rename elements of the view model, which I prefer doing often and after I have already worked with the model and realized what the best name could be. Moreover, JSX in TypeScript is also statically checked, so you can not make mistake there as well. All these merits are impossible in Angular 1.x and Angular 2. Both have special DSLs for describing views and of course those DSL are not as powerful as TypeScript when it comes to static type checks.

But what I have discovered is that TypeScript can even teach you web standards. These standards are not very consistent but we still have to use them correctly. Let me give you few examples.

First, TypeScript can teach you JavaScript itself and save you from silly errors. Look at this code and try to answer the questions (--strictNullChecks):

function f(x: number | null)
    if (typeof x === 'null') {
        let y = x;  // what is the type of y?
    } else {
        let z = x;  // what is the type of z?

After you gave it some thought, here is the answer: the type of y is never and type of z is number | null. If you answered correctly, you are great JavaScript developer with exceptional memory. The type never is given to y because that line will never execute. This is because of JavaScript’s design flaw which defines this expression to be true: typeof null === 'object'. Having learned this, now, what are the types of y and z in the following snippet?

function f(x: number | null)
    if (typeof x === 'object') {
        let y = x;  // what is type of y?
    } else {
        let z = x;  // what is type of z?

Well, you are totally right, y is null, because 'typeof null === 'object' is true. And since true part of the if statement has dealt with null, the type of z is just a number.

Now, let’s have a look at a second example, now TypeScript will tech us something about DOM API. Have a look at the following code, which does not compile (it used to handle React button click event):

function handleClick(e: React.MouseEvent)
    let value =; // Error: Property 'value' does not exist on type 'EventTarget'

What??? This way official React’s page teaches us to access values from the event targets!

React docs snapshot

When we first encountered this problem, we decided there was a bug in TypeScript type definitions for React (those are installed with npm install --save-dev @types/react). But later we discovered, those type definitions actually have another property for SyntheticEvent (type of target), named currentTarget, whose type is different:

Hmmm, let’s see what dumentation has to say about currentTarget:

Identifies the current target for the event, as the event traverses the DOM. It always refers to the element to which the event handler has been attached, as opposed to which identifies the element on which the event occurred.

While target is

A reference to the object that dispatched the event. It is different from event.currentTarget when the event handler is called during the bubbling or capturing phase of the event.

So are we interested in the value of the element where we placed an event handler or in the element, which dispatched the event? target is the origin of the event, which no one really cares about, it might be a span inside a link, for example, while currentTarget is something you should very much care about, as this is the element, to which you have attached your event handler. See more discussion on this topic here . We have learned this only because TypeScript caused us to dig deeper into targets and see the difference. Without it, we would have used target and wait for problems to come (someone might place child element to the element we were listening to and target would become this child element!). So, thanks, TypeScript and those great people who write type definitions for lessons :-).


3 thoughts on “How TypeScript can teach you web standards

  1. Thanks for the article. But you did not describe the solution to the problem. I am using react with typescript and still getting this silly error: Property ‘value’ does not exist on type ‘EventTarget.
    If I remove the type if the event handler method: handleKeyPressed(e) { …}
    typescript still complains that the argument ‘e’ must have a declared type. When I declare the type as KeyPressedEvent like this: handleKeyPressed(e: KeyPressedEvent), then typescript would complain that is not a good expression (‘value’ does not exist on type ‘EventTarget’. What is the solution? This is just crazy…

  2. I also used the type KeyboardEvent in the event handler:
    handleKeyPressed(e: KeyboardEvent) and still the same problem. Why is it so difficult to read a user has entered in a text field?

Leave a Reply

Your email address will not be published.