Contextual Type
Type inference also works in “the other direction” in some cases in TypeScript. This is known as “contextual typing”. Contextual typing occurs when the type of an expression is implied by its location. For example:
window.onmousedown = function(mouseEvent) { console.log(mouseEvent.buton); //<- Error };
For the code above to give the type error, the TypeScript type checker used the type of the Window.onmousedown
function to infer the type of the function expression on the right hand side of the assignment. When it did so, it was able to infer the type of the mouseEvent
parameter. If this function expression were not in a contextually typed position, the mouseEvent
parameter would have type any
, and no error would have been issued.
If the contextually typed expression contains explicit type information, the contextual type is ignored. Had we written the above example:
window.onmousedown = function(mouseEvent: any) { console.log(mouseEvent.buton); //<- Now, no error is given };
The function expression with an explicit type annotation on the parameter will override the contextual type. Once it does so, no error is given as no contextual type applies.
Contextual typing applies in many cases. Common cases include arguments to function calls, right hand sides of assignments, type assertions, members of object and array literals, and return statements. The contextual type also acts as a candidate type in best common type. For example:
function createZoo(): Animal[] { return [new Rhino(), new Elephant(), new Snake()]; }
In this example, best common type has a set of four candidates: Animal
, Rhino
, Elephant
, and Snake
. Of these, Animal
can be chosen by the best common type algorithm.
Please login to continue.