官术网_书友最值得收藏!

Adding types

With a static type system, we can restrict our makePerson function in quite a few ways. Here's an example using ReasonML, the language that we're using in this book to learn type-driven development:

/* src/Ch01/Ch01_Demo.re */
type person = {id: int, name: string};
let makePerson(id, name) = {id, name};

Here, we define a new data type, person, and a function that creates a value of the type given the required arguments. We have one more line in the preceding code than we do in the JavaScript code, but in exchange, we get the following guarantees:

  • The caller cannot pass in null or undefined arguments
  • The caller cannot pass in the wrong types of arguments
  • The caller cannot mutate the result value of the function

Notice in the previous example that we didn't have to declare the argument or types for the makePerson function. This is because ReasonML has great type inference that automatically understands that int, string, and person must be the only possible types allowed for those parts of the function.

ReasonML will compile the previous code into the following JavaScript:

// src/Ch01/Ch01_Demo.bs.js
function makePerson(id, name) { return [id, name]; }

As you can see, the preceding code looks almost exactly like the JavaScript we wrote earlier—the main difference is that Reason's JavaScript compiler turns records (which we'll explore later) into JavaScript arrays to take advantage of their speed.

This is just a glimpse of what static types can do to your codebase. In the coming chapters, we'll have a look at many more practical applications.

主站蜘蛛池模板: 平利县| 珠海市| 碌曲县| 喀喇| 昔阳县| 巩义市| 县级市| 冷水江市| 墨竹工卡县| 马尔康县| 泰宁县| 郯城县| 西充县| 墨脱县| 保德县| 井陉县| 延庆县| 方山县| 象山县| 嘉鱼县| 平和县| 虎林市| 乌审旗| 随州市| 安吉县| 栾城县| 琼结县| 思南县| 嘉鱼县| 镇江市| 临漳县| 塔河县| 青海省| 都江堰市| 洪湖市| 根河市| 喜德县| 安丘市| 仁怀市| 隆化县| 独山县|