Types: Introduction

In conjunction with the typechecker, the Hack language's typing capabilities is the cornerstone for every other Hack feature that is available. The primary motivation for the development of the Hack language was to be able to explicitly type various parts of your code, such that the code could be analyzed for type consistency and possible errors.

int(34)
int(28)
int(2)
Catchable fatal error: Argument 1 passed to Hack\UserDocumentation\Types\Intro\Examples\PreHack\bar() must be an instance of Hack\UserDocumentation\Types\Intro\Examples\PreHack\A, Hack\UserDocumentation\Types\Intro\Examples\PreHack\Z given in /data/users/joelm/user-documentation/guides/hack/20-types/01-introduction-examples/pre-hack.php on line 33

The above example is a perfectly valid program that will run on HHVM (except a fatal that will occur in the last var_dump). However, it is unclear as to the intent of the programmer in many cases. For example, did the programmer really want to allow A::foo() to accept string-like ints. Of course, mitigation can occur through the use of checks like is_int() or exception throwing.

int(34)
Catchable fatal error: Argument 3 passed to Hack\UserDocumentation\Types\Intro\Examples\Hack\bar() must be an instance of int, string given in /data/users/joelm/user-documentation/guides/hack/20-types/01-introduction-examples/hack.php.type-errors on line 31

Now we can see that the intent was to have only ints passed. And while the program will still run just like in the previous example, users of this API will now know what is expected. Combine adding these explicit types to methods and properties with the Hack typechecker, you have a real strong foundation for safe, dynamic programming.

To get a better feel for what types you can use in your code, and where and how to place your explicit type annotations, check out: