Immediate download Pro TypeScript: Application-Scale JavaScript Development 2nd Edition Steve Fenton ebooks 2024
Immediate download Pro TypeScript: Application-Scale JavaScript Development 2nd Edition Steve Fenton ebooks 2024
com
https://textbookfull.com/product/pro-typescript-application-
scale-javascript-development-2nd-edition-steve-fenton/
OR CLICK BUTTON
DOWNLOAD NOW
https://textbookfull.com/product/pro-typescript-application-scale-
javascript-development-second-edition-fenton/
textboxfull.com
https://textbookfull.com/product/essential-typescript-4-from-beginner-
to-pro-2nd-edition-adam-freeman/
textboxfull.com
https://textbookfull.com/product/essential-typescript-from-beginner-
to-pro-1st-edition-adam-freeman/
textboxfull.com
https://textbookfull.com/product/essential-typescript-4-from-beginner-
to-pro-second-edition-adam-freeman/
textboxfull.com
Angular Development with Typescript Second Edition Yakov
Fain
https://textbookfull.com/product/angular-development-with-typescript-
second-edition-yakov-fain/
textboxfull.com
https://textbookfull.com/product/protein-downstream-processing-design-
development-and-application-of-high-2nd-edition/
textboxfull.com
https://textbookfull.com/product/pro-jquery-in-oracle-application-
express-wesley-scott/
textboxfull.com
Pro TypeScript
Application-Scale JavaScript Development
—
Second Edition
—
Steve Fenton
Pro TypeScript
Application-Scale JavaScript
Development
Second Edition
Steve Fenton
Pro TypeScript: Application-Scale JavaScript Development
Steve Fenton
Basingstoke, United Kingdom
ISBN-13 (pbk): 978-1-4842-3248-4 ISBN-13 (electronic): 978-1-4842-3249-1
https://doi.org/10.1007/978-1-4842-3249-1
Library of Congress Control Number: 2017961729
Copyright © 2018 by Steve Fenton
This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the material is
concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction
on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation,
computer software, or by similar or dissimilar methodology now known or hereafter developed. Exempted from this
legal reservation are brief excerpts in connection with reviews or scholarly analysis or material supplied specifically
for the purpose of being entered and executed on a computer system, for exclusive use by the purchaser of the work.
Duplication of this publication or parts thereof is permitted only under the provisions of the Copyright Law of the
Publisher's location, in its current version, and permission for use must always be obtained from Springer. Permissions
for use may be obtained through RightsLink at the Copyright Clearance Center. Violations are liable to prosecution
under the respective Copyright Law.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with every
occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an editorial fashion
and to the benefit of the trademark owner, with no intention of infringement of the trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified
as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication, neither
the authors nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be
made. The publisher makes no warranty, express or implied, with respect to the material contained herein.
Cover image designed by Freepik
Managing Director: Welmoed Spahr
Editorial Director: Todd Green
Acquisitions Editor: Gwenan Spearing
Development Editor: Laura Berendson
Technical Reviewer: Rich O’Kelly, Martin Milsom, Dan Horrocks-Burgess, Jamie Wright
Coordinating Editor: Nancy Chen
Copy Editor: Karen Jameson
Compositor: SPi Global
Indexer: SPi Global
Artist: SPi Global
Distributed to the book trade worldwide by Springer Science+Business Media New York,
233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail
orders-ny@springer-sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC
and the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc).
SSBM Finance Inc is a Delaware corporation.
For information on translations, please e-mail rights@apress.com, or visit http://www.apress.com/
rights-permissions.
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales web
page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to readers on
GitHub via the book's product page, located at www.apress.com/9781484232484. For more detailed information,
please visit http://www.apress.com/source-code.
Printed on acid-free paper
For Rebecca, Lily, Deborah, Victoria, and Mum
Contents
■
■Chapter 1: TypeScript Language Features������������������������������������������������������������� 1
JavaScript Is Valid TypeScript������������������������������������������������������������������������������������������� 2
Variables��������������������������������������������������������������������������������������������������������������������������� 4
Constants������������������������������������������������������������������������������������������������������������������������� 6
Types�������������������������������������������������������������������������������������������������������������������������������� 6
Type Annotations������������������������������������������������������������������������������������������������������������������������������������ 7
Primitive Types��������������������������������������������������������������������������������������������������������������������������������������� 9
Object and Dynamic Types�������������������������������������������������������������������������������������������������������������������� 10
Enumerations��������������������������������������������������������������������������������������������������������������������������������������� 10
Union Types������������������������������������������������������������������������������������������������������������������������������������������ 13
Literal Types������������������������������������������������������������������������������������������������������������������������������������������ 14
Intersection Types��������������������������������������������������������������������������������������������������������������������������������� 15
Arrays��������������������������������������������������������������������������������������������������������������������������������������������������� 15
Tuple Types������������������������������������������������������������������������������������������������������������������������������������������� 17
Dictionary Types����������������������������������������������������������������������������������������������������������������������������������� 18
Mapped Types��������������������������������������������������������������������������������������������������������������������������������������� 19
Type Assertions������������������������������������������������������������������������������������������������������������������������������������� 20
Type Guards������������������������������������������������������������������������������������������������������������������������������������������ 21
Discriminated Unions��������������������������������������������������������������������������������������������������������������������������� 23
v
■ Contents
Operators������������������������������������������������������������������������������������������������������������������������ 24
Increment and Decrement�������������������������������������������������������������������������������������������������������������������� 24
Binary Operators����������������������������������������������������������������������������������������������������������������������������������� 25
Bitwise Operators��������������������������������������������������������������������������������������������������������������������������������� 26
Logical Operators��������������������������������������������������������������������������������������������������������������������������������� 26
Type Operators�������������������������������������������������������������������������������������������������������������������������������������� 30
Destructuring���������������������������������������������������������������������������������������������������������������������������������������� 30
Spread Operator����������������������������������������������������������������������������������������������������������������������������������� 34
Functions������������������������������������������������������������������������������������������������������������������������ 35
Optional Parameters����������������������������������������������������������������������������������������������������������������������������� 36
Default Parameters������������������������������������������������������������������������������������������������������������������������������� 37
Rest Parameters����������������������������������������������������������������������������������������������������������������������������������� 38
Overloads���������������������������������������������������������������������������������������������������������������������������������������������� 38
Specialized Overload Signatures���������������������������������������������������������������������������������������������������������� 39
Arrow Functions����������������������������������������������������������������������������������������������������������������������������������� 41
Function Currying��������������������������������������������������������������������������������������������������������������������������������� 42
Interfaces����������������������������������������������������������������������������������������������������������������������� 44
Classes��������������������������������������������������������������������������������������������������������������������������� 47
Constructors����������������������������������������������������������������������������������������������������������������������������������������� 47
Access Modifiers���������������������������������������������������������������������������������������������������������������������������������� 49
Properties and Methods����������������������������������������������������������������������������������������������������������������������� 49
Class Heritage�������������������������������������������������������������������������������������������������������������������������������������� 51
Abstract Classes����������������������������������������������������������������������������������������������������������������������������������� 53
Scope���������������������������������������������������������������������������������������������������������������������������������������������������� 54
Type Information����������������������������������������������������������������������������������������������������������������������������������� 56
Generics������������������������������������������������������������������������������������������������������������������������� 58
Generic Functions��������������������������������������������������������������������������������������������������������������������������������� 58
Generic Interfaces�������������������������������������������������������������������������������������������������������������������������������� 59
Generic Classes������������������������������������������������������������������������������������������������������������������������������������ 60
Type Constraints����������������������������������������������������������������������������������������������������������������������������������� 61
vi
■ Contents
TypeScript Futures��������������������������������������������������������������������������������������������������������� 61
Summary������������������������������������������������������������������������������������������������������������������������ 62
Key Points���������������������������������������������������������������������������������������������������������������������� 62
■
■Chapter 2: Code Organization������������������������������������������������������������������������������ 63
Namespaces������������������������������������������������������������������������������������������������������������������� 64
Modules�������������������������������������������������������������������������������������������������������������������������� 68
Module Re-Exporting���������������������������������������������������������������������������������������������������������������������������� 70
Default Exports������������������������������������������������������������������������������������������������������������������������������������� 70
Exports Object�������������������������������������������������������������������������������������������������������������������������������������� 71
Module Loading������������������������������������������������������������������������������������������������������������������������������������ 71
Summary������������������������������������������������������������������������������������������������������������������������ 81
Key Points���������������������������������������������������������������������������������������������������������������������� 82
■
■Chapter 3: The Type System�������������������������������������������������������������������������������� 83
Type Systems����������������������������������������������������������������������������������������������������������������� 83
Optional Static Types������������������������������������������������������������������������������������������������������ 84
Structural Typing������������������������������������������������������������������������������������������������������������ 86
Type Erasure������������������������������������������������������������������������������������������������������������������� 88
Type Inference���������������������������������������������������������������������������������������������������������������� 89
Best Common Type������������������������������������������������������������������������������������������������������������������������������� 90
Contextual Types����������������������������������������������������������������������������������������������������������������������������������� 91
Widened Types�������������������������������������������������������������������������������������������������������������������������������������� 91
When to Annotate��������������������������������������������������������������������������������������������������������������������������������� 91
Duplicate Identifiers������������������������������������������������������������������������������������������������������� 92
Type Checking���������������������������������������������������������������������������������������������������������������� 93
vii
■ Contents
Ambient Declarations����������������������������������������������������������������������������������������������������� 95
Declaration Files����������������������������������������������������������������������������������������������������������������������������������� 96
Definitely Typed������������������������������������������������������������������������������������������������������������������������������������ 97
Summary������������������������������������������������������������������������������������������������������������������������ 97
Key Points���������������������������������������������������������������������������������������������������������������������� 97
■
■Chapter 4: Object Orientation in TypeScript�������������������������������������������������������� 99
Object Orientation in TypeScript����������������������������������������������������������������������������������� 100
Open Recursion���������������������������������������������������������������������������������������������������������������������������������� 100
Encapsulation������������������������������������������������������������������������������������������������������������������������������������� 102
Delegation������������������������������������������������������������������������������������������������������������������������������������������ 104
Polymorphism������������������������������������������������������������������������������������������������������������������������������������� 106
Mixins��������������������������������������������������������������������������������������������������������������������������� 121
TypeScript Mixins������������������������������������������������������������������������������������������������������������������������������� 121
When to Use Mixins���������������������������������������������������������������������������������������������������������������������������� 123
Restrictions����������������������������������������������������������������������������������������������������������������������������������������� 123
Real Mixins����������������������������������������������������������������������������������������������������������������������������������������� 125
Summary���������������������������������������������������������������������������������������������������������������������� 126
Key Points�������������������������������������������������������������������������������������������������������������������� 127
viii
■ Contents
■
■Chapter 5: Understanding the Runtime������������������������������������������������������������� 129
Runtime Features��������������������������������������������������������������������������������������������������������� 129
Scope��������������������������������������������������������������������������������������������������������������������������� 131
Callbacks�������������������������������������������������������������������������������������������������������������������������������������������� 134
Passing Functions as Arguments������������������������������������������������������������������������������������������������������� 137
Promises��������������������������������������������������������������������������������������������������������������������������������������������� 138
Events��������������������������������������������������������������������������������������������������������������������������� 147
TypeScript’s Custom-Event Mechanism��������������������������������������������������������������������������������������������� 149
Event Phases�������������������������������������������������������������������������������������������������������������������������������������� 151
Summary���������������������������������������������������������������������������������������������������������������������� 156
Key Points�������������������������������������������������������������������������������������������������������������������� 157
■
■Chapter 6: Running TypeScript in a Browser����������������������������������������������������� 159
The Anatomy of a Web Browser����������������������������������������������������������������������������������� 159
Reflows and Frames Per Second�������������������������������������������������������������������������������������������������������� 160
The Interesting Components��������������������������������������������������������������������������������������������������������������� 162
Network������������������������������������������������������������������������������������������������������������������������ 170
AJAX��������������������������������������������������������������������������������������������������������������������������������������������������� 170
WebSockets���������������������������������������������������������������������������������������������������������������������������������������� 173
Real-Time Communications��������������������������������������������������������������������������������������������������������������� 173
ix
■ Contents
Storage������������������������������������������������������������������������������������������������������������������������� 174
Session Storage���������������������������������������������������������������������������������������������������������������������������������� 174
Local Storage�������������������������������������������������������������������������������������������������������������������������������������� 175
Storage Restrictions��������������������������������������������������������������������������������������������������������������������������� 176
IndexedDB������������������������������������������������������������������������������������������������������������������������������������������ 176
Storage Roundup�������������������������������������������������������������������������������������������������������������������������������� 183
Geolocation������������������������������������������������������������������������������������������������������������������ 183
Sensors������������������������������������������������������������������������������������������������������������������������ 185
Battery Status������������������������������������������������������������������������������������������������������������������������������������� 185
Proximity Sensor�������������������������������������������������������������������������������������������������������������������������������� 187
Light Sensor��������������������������������������������������������������������������������������������������������������������������������������� 188
Motion and Orientation����������������������������������������������������������������������������������������������������������������������� 188
Other Device Sensors������������������������������������������������������������������������������������������������������������������������� 189
Sensor Roundup��������������������������������������������������������������������������������������������������������������������������������� 189
Web Workers���������������������������������������������������������������������������������������������������������������� 190
Packaging Your Program���������������������������������������������������������������������������������������������� 192
Summary���������������������������������������������������������������������������������������������������������������������� 192
Key Points�������������������������������������������������������������������������������������������������������������������� 192
■
■Chapter 7: Running TypeScript on a Server������������������������������������������������������� 195
Install Node������������������������������������������������������������������������������������������������������������������ 195
Creating a New Project������������������������������������������������������������������������������������������������� 196
NPM������������������������������������������������������������������������������������������������������������������������������ 196
Simple Node Program�������������������������������������������������������������������������������������������������� 199
Request Information����������������������������������������������������������������������������������������������������� 200
Using Express to Write Applications����������������������������������������������������������������������������� 201
Simple Express Program�������������������������������������������������������������������������������������������������������������������� 202
Multiple Routes����������������������������������������������������������������������������������������������������������������������������������� 203
Handling Errors����������������������������������������������������������������������������������������������������������������������������������� 203
Express Book Project�������������������������������������������������������������������������������������������������������������������������� 205
Summary���������������������������������������������������������������������������������������������������������������������� 216
Key Points�������������������������������������������������������������������������������������������������������������������� 216
x
■ Contents
■
■Chapter 8: Exceptions, Memory, and Performance�������������������������������������������� 217
Exceptions�������������������������������������������������������������������������������������������������������������������� 217
Throwing Exceptions�������������������������������������������������������������������������������������������������������������������������� 218
Exception Handling����������������������������������������������������������������������������������������������������������������������������� 219
Memory������������������������������������������������������������������������������������������������������������������������ 224
Releasing Resources�������������������������������������������������������������������������������������������������������������������������� 224
Garbage Collection����������������������������������������������������������������������������������������������������������������������������� 225
Performance����������������������������������������������������������������������������������������������������������������� 228
Summary���������������������������������������������������������������������������������������������������������������������� 232
Key Points�������������������������������������������������������������������������������������������������������������������� 232
■
■Chapter 9: Using JavaScript Libraries��������������������������������������������������������������� 233
Creating Type Definitions���������������������������������������������������������������������������������������������� 234
Creating a TypeScript Application with Knockout������������������������������������������������������������������������������� 235
Silencing the Compiler����������������������������������������������������������������������������������������������������������������������� 237
Iteratively Improving Type Definitions������������������������������������������������������������������������������������������������� 238
Summary���������������������������������������������������������������������������������������������������������������������� 255
Key Points�������������������������������������������������������������������������������������������������������������������� 256
xi
■ Contents
■
■Appendix 1: JavaScript Quick Reference���������������������������������������������������������� 257
Variables����������������������������������������������������������������������������������������������������������������������� 257
Functions���������������������������������������������������������������������������������������������������������������������� 258
Conditional Statements������������������������������������������������������������������������������������������������ 259
Loops���������������������������������������������������������������������������������������������������������������������������� 260
Strings�������������������������������������������������������������������������������������������������������������������������� 261
Promises���������������������������������������������������������������������������������������������������������������������� 262
Summary���������������������������������������������������������������������������������������������������������������������� 263
■
■Appendix 2: TypeScript Compiler���������������������������������������������������������������������� 265
Getting Help������������������������������������������������������������������������������������������������������������������ 265
Sample File������������������������������������������������������������������������������������������������������������������ 265
Common Flags������������������������������������������������������������������������������������������������������������� 266
Module Kind���������������������������������������������������������������������������������������������������������������������������������������� 266
ECMAScript Target Version����������������������������������������������������������������������������������������������������������������� 268
Generate Declarations������������������������������������������������������������������������������������������������������������������������ 269
Remove Comments����������������������������������������������������������������������������������������������������������������������������� 269
Combined Output�������������������������������������������������������������������������������������������������������������������������������� 269
xii
■ Contents
■
■Appendix 3: Bitwise Flags��������������������������������������������������������������������������������� 273
Bit Flags Explained������������������������������������������������������������������������������������������������������� 274
Bitwise Operations������������������������������������������������������������������������������������������������������� 274
■
■Appendix 4: Coding Katas��������������������������������������������������������������������������������� 277
Performing a Kata�������������������������������������������������������������������������������������������������������� 278
Example: The Fizz Buzz Kata���������������������������������������������������������������������������������������� 279
Common Coding Kata Rules����������������������������������������������������������������������������������������� 279
Summary���������������������������������������������������������������������������������������������������������������������� 280
Index��������������������������������������������������������������������������������������������������������������������� 281
xiii
About the Author
xv
Acknowledgments
A book is enjoyable when you work with the right people, and those people are Gwenan Spearing at Apress
and my smart technical reviewers Rich O’Kelly, Martin Milsom, Dan Horrocks-Burgess, and Jamie Wright.
I am incredibly grateful to Nancy Chen for being so patient with my sporadic writing habits, last-minute
changes, and vague estimates.
This second edition would not have been possible without the contributions of all the smart people that
helped create the first book; Mark Jones, Mark Rendle, Basarat Ali Syed, Christine Ricketts, Boris Yankov,
Diullei Gomes, Masahiro Wakame, Jason Jarrett, Bart van der Schoor, John Reilly, Igor Oleinikov, Luke
Hoban, Jonathan Turner, and of course - Ryan Cavanaugh.
I am also grateful to all of my amazing colleagues, past and present, who inspire me to keep learning
and growing.
xvii
Introduction
Atwood’s Law: any application that can be written in JavaScript will eventually be written
in JavaScript.
—Jeff Atwood
TypeScript is a language created and maintained by Microsoft, and released under an open-source Apache
2.0 License (2004). The language is focused on making the development of JavaScript programs scale to
many thousands of lines of code. In fact, Microsoft has written both the Azure Management Portal (1.2
million lines of code) and the Visual Studio Code editor (300,000 lines of code) in TypeScript. The language
attacks the large-scale JavaScript programming problem by offering better design-time tooling, compile-
time checking, and dynamic module loading at runtime.
As you might expect from a language created by Microsoft, there is excellent support for TypeScript
within Visual Studio, but plenty of other development tools have also added support for the language,
including VS Code, WebStorm, Eclipse, Sublime Text, Vi, Atom, IntelliJ, and Emacs among others. The
widespread support from these tools as well as the permissive open-source license makes TypeScript a
viable option outside of the traditional Microsoft ecosystem.
The TypeScript language is a typed superset of JavaScript, which is compiled to plain JavaScript in
the flavor of your choosing. This makes programs written in TypeScript highly portable as they can run
on almost any machine — in web browsers, on web servers, and even in native applications on operating
systems that expose a JavaScript API, such as WinJS.
The language features found in TypeScript can be divided into three categories based on their
relationship to JavaScript (see Figure 1). The first two sets are related to versions of the ECMA-262
ECMAScript Language Specification, which is the official specification for JavaScript. The ECMAScript 5
specification forms the basis of TypeScript and supplies the largest number of features in the language.
Subsequent versions of the ECMAScript specification are rolled into TypeScript releases, often as early
previews that feature down-level compilation to older versions of the specication. The third and final set of
language features includes items that are not planned to become part of the ECMAScript standard, such as
generics and type annotations. All the additional features of TypeScript can be output to a number of widely
supported versions of JavaScript.
TypeScript has several native frameworks, including Angular, Ionic, RxJs 5, and Dojo 2. Additionally,
because TypeScript is such a close relative of JavaScript, you can consume the myriad of existing libraries
and frameworks written in JavaScript; Aurelia, Backbone, Bootstrap, Durandal, jQuery, Knockout,
Modernizr, PhoneGap, Prototype, Raphael, React, Underscore, Vue, and many more are all usable in
TypeScript programs. Correspondingly, once your TypeScript program has been compiled it can be
consumed from any JavaScript program too.
TypeScript's similarity to JavaScript is beneficial if you already have experience with JavaScript or other
C-like languages. The similarity also aids the debugging process as the generated JavaScript correlates
closely to the original TypeScript code. Source maps can also be generated to aid debugging, with browser
developer tools displaying your TypeScript code during in-browser debugging.
xix
■ Introduction
If you still need to be convinced about using TypeScript or need help convincing others, I summarize
the benefits of the language as well as the problems it can solve in the following sections. I also include an
introduction to the components of TypeScript and some of the alternatives. If you would rather get started
with the language straight away, you can skip straight to Chapter 1.
Structure
This book is organized into ten chapters and four appendices.
Chapter 1: TypeScript Language Features: describes the language features in
detail, from simple type annotations to important structural elements, with
stand-alone examples of how to use each one.
Chapter 2: Code Organization: clarifies how code can be organized, loaded, and
packaged with a view to growing your program to millions of lines of code.
Chapter 3: The Type System: explains the details of working within TypeScript's
structural type system and describes the details on type erasure, type inference,
and ambient declarations.
xx
■ Introduction
xxi
■ Introduction
The language consists of the new syntax, keywords, and type annotations. As a programmer, the
language will be the component you will become most familiar with. Understanding how to supply type
information is an important foundation for the other components because the compiler and language
service are most effective when they understand the complex structures you use within your program.
The compiler performs the type erasure and code transformations that convert your TypeScript code
into JavaScript. It will emit warnings and errors if it detects problems and can perform additional tasks such
as combining the output into a single file, generating source maps, and more.
The language service provides type information that can be used by development tools to supply
autocompletion, type hinting, refactoring options, and other creative features based on the type information
that has been gathered from your program.
Compile or Transpile?
The term transpiling has been around since the last century, but there is some confusion about its meaning.
In particular, there has been some confusion between the terms compilation and transpilation. Compilation
describes the process of taking source code written in one language and converting it into another language.
Transpilation is a specific kind of compilation and describes the process of taking source code written in one
language and transforming it into another language with a similar level of abstraction. So, you might compile
a high-level language into an assembly language, but you would transpile TypeScript to JavaScript as they
are similarly abstracted.
Other common examples of transpilation include C++ to C, CoffeeScript to JavaScript, Dart to
JavaScript, and PHP to C++.
xxii
■ Introduction
Despite its popularity, it hasn't received much respect from developers — possibly because it contains
many snares and traps that can entangle a large program much like the tar pit pulling the mammoth to
its death, as described by Fred Brooks (1975). If you are a professional programmer working with large
applications written in JavaScript, you will almost certainly have rubbed up against problems once your
program chalked up a few thousand lines. You may have experienced naming conflicts, substandard
programming tools, complex modularization, unfamiliar prototypal inheritance that makes it hard to reuse
common design patterns easily, and difficulty keeping a readable and maintainable code base. TypeScript
solves problems such as these.
Because JavaScript has a C-like syntax, it looks familiar to most programmers. This is one of JavaScript's
key strengths, but it is also the cause of many surprises, especially in the following areas:
• Prototypal inheritance
• Equality and type juggling
• Management of modules
• Scope
• Lack of types
Typescript solves or eases these problems in several ways. Each of these topics is discussed in this
introduction.
Prototypal Inheritance
Prototype-based programming is a style of object-oriented programming that is mainly found in interpreted
dynamic languages. It was first used in a language called Self, created by David Ungar and Randall Smith in
1986, but it has been used in a selection of languages since then. Of these prototypal languages, JavaScript
is by far the most widely known, although this has done little to bring prototypal inheritance into the
mainstream. Despite its validity, prototype-based programming is somewhat esoteric; class-based object
orientation is far more commonplace and will be familiar to most programmers.
TypeScript solves this problem by adding classes, namespaces, modules, and interfaces. This allows
programmers to transfer their existing knowledge of objects and code structure from other languages,
including implementing interfaces, inheritance, and code organization. Classes and modules are an early
preview of JavaScript proposals and because TypeScript can compile to earlier versions of JavaScript, it
allows you to use these features independent of support for the newer ECMAScript specifications. All these
features are described in detail in Chapter 1.
xxiii
■ Introduction
// result is 20
const result = strTen * 2;
TypeScript gracefully solves this problem by introducing type checking, which can provide warnings
at design and compile time to pick up potential unintended juggling. Even in cases where it allows implicit
type coercion, the result will be assigned the correct type. This prevents dangerous assumptions from going
undetected. This feature is covered in detail in Chapter 3.
The introduction of types in TypeScript does not preclude the use of dynamic types. You can choose
when to use types, and when to go without them. TypeScript does not force you to do anything, it is just
there to help.
Management of Modules
If you have worked with JavaScript, it is likely that you will have come across a dependency problem. Some
of the common problems include the following:
• Forgetting to add a script tag to a web page
• Adding scripts to a web page in the wrong order
• Finding out you have added scripts that aren't used
There is also a series of issues you may have come across if you are using tools to combine your scripts
into a single file to reduce network requests or if you minify your scripts to lower bandwidth usage.
• Combining scripts into a single script in the wrong order
• Finding out that your chosen minification tool doesn't understand single-line
comments
• Trying to debug combined and minified scripts
You may have already solved some of these issues using module loading, as the pattern is gaining
traction in the JavaScript community. However, TypeScript makes module loaders the default way of
working and allows your modules to be compiled to suit the most prevalent module loading styles without
requiring changes to your code. The details of module loading in web browsers are covered in Chapter 6 and
on the server in Chapter 7.
Scope
In most modern C-like languages, the curly braces create a new context for scope. A variable declared inside a
set of curly braces cannot be seen outside of that block. JavaScript has bucked this trend traditionally by being
functionally scoped, which means blocks defined by curly braces have no effect on scope. Instead, variables are
scoped to the function they are declared in, or the global scope if they are not declared within a function. There
can be further complications caused by the accidental omission of the var keyword within a function, thus
promoting the variable into the global scope. More complications are caused by variable hoisting, resulting in
all variables within a function behaving as if they were declared at the top of the function.
xxiv
■ Introduction
The introduction of the const and let variable declarations have gone some way to solving this
problem, and if you are starting from a clean sheet you can avoid the older var variable declaration
altogether.
Despite some tricky surprises with scope, JavaScript does provide a powerful mechanism that wraps
the current lexical scope around a function declaration to keep values to hand when the function is later
executed. These closures are one of the most powerful features in JavaScript.
TypeScript eases scope problems by warning you about implicit global variables, provided you avoid
adding variables to the global scope. This safety net is demonstrated in Listing 2.
Lack of Types
The problem with JavaScript isn't that it has no types, because each variable does have a type; it is just that
the type can be changed by each assignment. A variable may start off as a string, but an assignment can
change it to a number, an object, or even a function. The real problem here is that the development tools
cannot be improved beyond a reasonable guess about the type of a variable. If the development tools don’t
know the types, the autocompletion and type hinting is often too general to be useful.
By formalizing type information, TypeScript allows development tools to supply specific contextual
help that otherwise would not be possible.
TypeScript is not a crutch any more than JSLint is a crutch. It doesn’t hide JavaScript (as
CoffeeScript tends to do).
—Ward Bell
TypeScript remains largely faithful to JavaScript. The TypeScript specification adds many language features,
but it doesn't attempt to change the ultimate style and behavior of the JavaScript language. It is just as
important for TypeScript programmers to embrace the idiosyncrasies of the runtime as it is for JavaScript
programmers. The aim of the TypeScript language is to make large-scale JavaScript programs manageable
and maintainable. No attempt has been made to twist JavaScript development into the style of C#, Java,
Ruby, Python, or any other language (although it has taken inspiration from many languages).
Prerequisites
To benefit from the features of TypeScript, you'll need access to an integrated development environment that
supports the syntax and compiler. The examples in this book were written using Visual Studio 2017, but you
can use VS Code, WebStorm/PHPStorm, Eclipse, Sublime Text, Vi, Emacs, or any other development tools
that support the language; you can even try many of the simpler examples on the TypeScript Playground
provided by Microsoft. I often use the TypeScript Playground when answering questions on the language.
xxv
■ Introduction
From the Visual Studio 2013 Spring Update (Update 2), TypeScript is a first-class language in Visual
Studio. Prior to this, an additional extension needed to be installed. Although the examples in this book are
shown in Visual Studio, you can use any of the development tools that were listed above. In particular, Visual
Studio Code is a free cross-platform editor with native TypeScript support - so you can write your TypeScript
code on any machine you have on hand, regardless of the operating system.
It is also worth downloading and installing Node (which is required to follow many of the examples) as
it will allow you to access the Node Package Manager and the thousands of modules and utilities available
through it. For example, you can use task runners such as Grunt and Gulp to watch your TypeScript files and
compile them automatically each time you change them if your development tools don't do this for you.
Node is free and can be downloaded for multiple platforms from the official Node website.
https://nodejs.org/
To avoid being greatly sidetracked, I have avoided using any task runners to perform additional
operations outside of Visual Studio, but once you have mastered TypeScript you will almost certainly want
to add a task runner, such as Gulp or Grunt, to your development workflow. I have referenced some web
dependencies from the node_modules folder in the examples in this book; but on a real-world project I
would use a task runner to lift and shift the website dependencies into a different folder that I would be
happy to deploy to a web server. The node_modules folder often contains a great deal of files that I would not
deploy to a web server.
TypeScript Alternatives
TypeScript is not the only alternative to writing to plain JavaScript.
The strongest TypeScript alternative is Babel, a compiler that exposes the latest ECMAScript features
with plugins for down-level compilation and polyfills to make your program work in current browsers. The
aim of the Babel project is to make the latest features available much sooner than they otherwise would be,
but Babel doesn't introduce compile-time type checking. Babel also features in many TypeScript workflows,
where Babel is executed after the TypeScript compiler, rather than using TypeScript to perform the down-
level compilation. You can read about Babel on the official website:
https://babeljs.io/
For a number of years, CoffeeScript was a popular alternative with a terse syntax that compiles to
sensible JavaScript code. CoffeeScript doesn't offer many of the additional features that TypeScript offers,
such as static type checking. It is also a very different language to JavaScript, which means you need to
translate snippets of code you find online into CoffeeScript to use them. In 2017, however, CoffeeScript
reached the top three "most dreaded languages" in the Stack Overflow developer survey (next to VBA, and
Visual Basic 6). In the same survey, TypeScript landed in the top three most loved languages. You can find
out more about CoffeeScript on the official website:
http://coffeescript.org/
Another alternative is Google's Dart language. Dart has much in common with TypeScript. It is class-
based, object oriented, and offers optional types that can be checked by a static checker. Dart was originally
conceived as a replacement for JavaScript, and was only intended to be compiled to JavaScript to provide
wide support in the short term while native support for Dart was added to browsers.
It seems unlikely at this stage that Dart will get the kind of browser support that JavaScript has won,
so the compile-to-JavaScript mechanism will likely remain core to Dart's future in the web browser. The
decision by Google to adopt TypeScript for the Angular project may be indicative of their commitment to
Dart, although it is still described as a long-term project. You can read about Dart on the official website for
the language:
https://www.dartlang.org/
xxvi
■ Introduction
There are also converters that will compile from most languages to JavaScript, including C#, Ruby, Java,
and Haskell. These may appeal to programmers who are uncomfortable stepping outside of their primary
programming language.
It is also worth bearing in mind that for small applications and web page widgets, you can defer the
decision and write the code in plain JavaScript. With TypeScript in particular, there is no penalty for starting
in JavaScript as you can simply paste your JavaScript code into a TypeScript file later on to make the switch.
Equally, there is little penalty for writing small programs in TypeScript, especially if you already have a
workflow in place to generate combined or minified files each time you save your application.
Summary
TypeScript is an application-scale programming language that provides early access to proposed new
JavaScript features and powerful additional features like static type checking. You can write TypeScript
programs to run in web browsers or on servers and you can reuse code between browser and server
applications.
TypeScript solves many problems in JavaScript, but it respects the patterns and implementation of the
underlying JavaScript language, for example, the ability to have dynamic types.
You can use many integrated development environments with TypeScript, with several providing first-
class support including type checking and autocompletion that will improve your productivity and help
eliminate mistakes at design time.
Key Points
• TypeScript is a language, a compiler, and a language service.
• You can paste existing JavaScript into your TypeScript program.
• Compiling from TypeScript to JavaScript is known specifically as transpiling.
• TypeScript is not the only alternative way of writing JavaScript, but it has gained
incredible traction in its first five years.
xxvii
CHAPTER 1
What if we could strengthen JavaScript with the things that are missing for large scale
application development, like static typing, classes [and] modules... that’s what TypeScript
is about.
—Anders Hejlsberg
TypeScript is a superset of JavaScript. That means that the TypeScript language includes the entire JavaScript
language plus a collection of useful additional features. This contrasts with the various subsets of JavaScript
and the various linting tools that seek to reduce the available features to create a smaller language with
fewer surprises. This chapter will introduce you to the extra language features, starting with simple type
annotations and progressing to more advanced features and structural elements of TypeScript. This chapter
doesn’t cover every feature included in the ECMAScript language specification, so if you need a refresher on
JavaScript, take a look at Appendix 1.
One important thing to remember is that all the standard control structures found in JavaScript are
immediately available within a TypeScript program. This includes the following:
• Control flows
• Data types
• Operators
• Subroutines
The basic building blocks of your program will come from JavaScript, including if statements, switch
statements, loops, arithmetic, logical tests, and functions. This is one of the key strengths of TypeScript — it
is based on a language (and a family of languages) that is already familiar to a vast and varied collection
of programmers. JavaScript is thoroughly documented not only in the ECMA-262 specification, but also in
books, on developer network portals, forums, and question-and-answer websites. When features are added
to JavaScript, they will also appear in TypeScript.
The TypeScript compiler is typically updated with new JavaScript features early in their specification.
Most of the features are available before browsers support them. In many cases, you can use the features in
your TypeScript program as the compiler will convert them into code that targets the older versions of the
ECMAScript standard.
Each of the language features discussed in this chapter has short, self-contained code examples that put
the feature in context. For the purposes of introducing and explaining features, the examples are short and
to the point; this allows the chapter to be read end to end. However, this also means you can refer back to the
chapter as a reference later on. Once you have read this chapter, you should know everything you will need
to understand the more complex examples described throughout the rest of the book.
■■Caution The only exceptions to the “all JavaScript is valid TypeScript” rule are the with statement and
vendor-specific extensions, until they are formally added to the ECMAScript specification. You could technically
still use the with statement, but all statements within the block would be unchecked.
The JavaScript with statement in Listing 1-1 shows two examples of the same routine. Although the
first calls Math.PI explicitly, the second uses a with statement, which adds the properties and functions of
Math to the current scope. Statements nested inside the with statement can omit the Math prefix and call
properties and functions directly, for example, the PI property or the floor function.
At the end of the with statement, the original lexical scope is restored, so subsequent calls outside of the
with block must use the Math prefix.
// Using with
const radius2 = 4;
with (Math) {
const area2 = PI * radius2 * radius2;
}
2
Chapter 1 ■ TypeScript Language Features
The with statement was not allowed in strict mode in ECMAScript 5 and later versions of ECMAScript
use strict mode by default for classes and modules. TypeScript treats with statements as an error and will
treat all types within the with statement as dynamic types. This is due to the following:
• The fact it is disallowed in strict mode.
• The general opinion that the with statement is dangerous.
• The practical issues of determining the identifiers that are in scope at compile time.
So, with these minor exceptions to the rule in mind, you can place any valid JavaScript into a TypeScript
file and it will be valid TypeScript. As an example, here is the area calculation script transferred to a
TypeScript file.
■■Note The ECMAScript 6 specification, also known as “ES6 Harmony,” represented a substantial change to
the JavaScript language. The specification has been divided into annual chunks, released as ECMAScript 2015,
ECMAScript 2016, and so on.
In Listing 1-2, the statements are just plain JavaScript, but in TypeScript the variables radius and area
will both benefit from type inference. Because radius is initialized with the value 4, it can be inferred that
the type of radius is number. With just a slight increase in effort, the result of multiplying Math.PI, which is
known to be a number, with the radius variable that has been inferred to be a number, it is possible to infer
the type of area is also a number.
With type inference at work, assignments can be checked for type safety. Figure 1-1 shows how an
unsafe assignment is detected when a string is assigned to the radius variable. There is a more detailed
explanation of type inference in Chapter 3. For now, rest assured that type inference is a good thing, and it
will save you a lot of effort.
3
Chapter 1 ■ TypeScript Language Features
Variables
TypeScript variables must follow the JavaScript naming rules. The identifier used to name a variable must
satisfy the following conditions.
The first character must be one of the following:
• an uppercase letter
• a lowercase letter
• an underscore
• a dollar sign
• a Unicode character from categories—Uppercase letter (Lu), Lowercase letter (Ll),
Title case letter (Lt), Modifier letter (Lm), Other letter (Lo), or Letter number (Nl)
Subsequent characters follow the same rule and additionally allow the following:
• numeric digits
• a Unicode character from categories—Non-spacing mark (Mn), Spacing combining
mark (Mc), Decimal digit number (Nd), or Connector punctuation (Pc)
• the Unicode characters U+200C (Zero Width Non-Joiner) and U+200D
(Zero Width Joiner)
You can test a variable identifier for conformance to the naming rules using the JavaScript variable
name validator by Mathias Bynens.
http://mothereff.in/js-variables
■■Note The availability of some of the more exotic characters can allow some interesting identifiers.
You should consider whether this kind of variable name causes more problems than it solves. For example,
this is valid JavaScript: const = 'Dignified';
Variables declared with const or let are block scoped, whereas variables declared with the older var
keyword are function scoped. If you omit these keywords, you are implicitly (and perhaps accidentally)
declaring the variable in the global scope. It is advisable to reduce the number of variables you add to the
global scope, as they are at risk of name collisions. You can avoid the global scope by declaring variables
local to their use, such as within functions, modules, namespaces, classes, or a simple set of curly braces if
you are using the block-scoped keywords.
When you limit the scope of a variable, it means it cannot be manipulated from outside of the scope of
which it was created. The scope follows a nesting rule that allows a variable to be used in the current scope,
and in inner nested scopes – but not outside. In other words, you can use variables declared in the current
scope and variables from wider scopes. See Listing 1-3.
4
Chapter 1 ■ TypeScript Language Features
{
let blockScope = 2;
{
let nestedBlockScope = 3;
TypeScript catches scope violations and will warn you when you attempt to access a variable that is
declared in a narrower scope. You can help the compiler to help you by avoiding a valid, but often accidental
coding style of reusing a name in a different scope. In Listing 1-4, the logging statements work correctly, with
both firstName variables being preserved separately. This means the original variable is not overwritten by
the nested variable with the same name.
{
let firstName = 'Tudor';
// Output:
// Name 1: Tudor
// Name 2: Chris
If in place of the let keyword the var keyword had been used, both logging statements would show the
name “Tudor,” as shown in Listing 1-5. Despite both variables appearing to be a separate declaration, only
one variable named firstName exists, and it is overwritten by the nested scope.
5
Exploring the Variety of Random
Documents with Different Content
The time came when Dr. Mateer had a shop equipped to do a
great variety of work; and though not on a large scale, yet big
enough to meet his needs. Already in 1886 in a letter to his brother
William he said: “In order to repair apparatus, and in order to make
many simpler articles, I have fitted up quite a complete workshop,
entirely at my own expense. I have invested in the shop, in tools and
materials quite one thousand dollars. I keep a workman at my own
cost, whom I have trained so that he can do most ordinary kinds of
work. There are a great many small articles we can make here more
cheaply than we can buy them. There are, however, many articles
we cannot make, especially those that involve glass or the use of
special machinery, or special skill.” That shop continued to grow, and
the variety of its output increased. Writing of this, Mrs. Ada Mateer
says:
To tell this part of the story of Dr. Mateer’s life satisfactorily, I must
begin with the first general missionary conference, held at Shanghai
in May, 1877. For two years previous he had served on a committee
to prepare the way for the meeting, and in this capacity he had
rendered much valuable assistance. At that conference he read a
paper in which he elaborately discussed the subject of “The Relation
of Protestant Missions to Education.” The meeting was regarded as
successful, and a second was called, to assemble at Shanghai, in
May, 1890. It was at this conference that the movement for a revision
of the Bible in Chinese took actual measures toward realization.
For the sake of any readers not well informed as to the Chinese
language, a few preliminary statements concerning it may be
desirable here. In a very broad and general sense it may be said that
as to elements, one tongue prevails throughout China proper; but
that there is also much important variation in this general tongue.
First of all, it needs lo be noted that the language takes on two
principal forms,—the classic, or Wen-li, and the spoken, or
Mandarin. The classic has come down through the centuries from
the times of Confucius and Mencius, and remains comparatively the
same as it is found in the writings of those sages. This is accepted
as the model for all writing; and for that reason Chinese students
have been required to spend the greater part of their time in
memorizing those ancient books, so that they might not only absorb
their teaching, but also especially that they might be able to
reproduce their style. The classic Chinese is stilted and so
condensed that in comparison with it a telegram would seem diffuse;
and though many of the characters are the same as those used in
writing the spoken language, yet the meaning and often the sound of
characters is so different that an illiterate person would not
understand it on hearing it read. The spoken language, on the other
hand, may be compared with English as to its use. Good English is
very much the same throughout the countries where it is the
vernacular, and though it takes on local dialects, it remains
everywhere intelligible. So, broadly speaking, is it also as to the
spoken Chinese in a large part of the empire. From the Yangtse up
into Manchuria, though the pronunciations differ very much, the
colloquial if put into writing is understood. In other words, with
differences of dialect and pronunciation it is the speech of perhaps
three hundred millions of people. The regions excepted lie along the
coast from Shanghai down, and inland south of the Yangtse, where
the distinct tongues are numerous and are largely unintelligible
except in their own localities.
It has been the rule in China that a mandarin must not be a native
of the province where he holds office; and, of course, it is essential
that he should be acquainted with the speech which constitutes the
lingua franca. Perhaps for this reason it is called Mandarin. But down
to the time when missionary publications rendered it common in
print, it was not employed in that mode. All books, business or
government documents, the one newspaper of the country, which
was the court gazette, and all letters were in the higher or, as it is
called, the Wen-li form, the only exception being some novels, and
even these were streaked with Wen-li. This, however, ran through
gradations,—from the highest, which is so condensed and so bristles
with erudite allusions that only a trained scholar can understand it,
down to a modification which is so easy that with a slight alteration of
particles it is almost the same as the Mandarin.
During the long period of the nineteenth century preceding the
meeting of the second general missionary conference, a number of
translations of the Scriptures, some of them of the whole, and some
of parts, had been made, and had come more or less into use. The
men who did this pioneer work deserve to be held in perpetual
esteem, especially in view of the difficulties under which they
labored. Among the missionaries who sat in that conference there
was no disposition to withhold this honor, or to disparage the value of
these early translations; but there was so widely prevalent among
them and their associates at that time on the field a conviction that
no existing version was satisfactory, that they recognized it as a duty
to take up the subject, and to initiate steps looking to the production
of a better. An informal consultation as to this was held by a few
men, a couple of days before the conference assembled; but
inasmuch as Dr. Mateer had not been invited, he did not attend.
Another consultation was held the following day, and because of his
great interest in the subject of a Bible revision, he attended without
an invitation. The views expressed clearly indicated that there was a
general agreement that a revision was desirable, but it also was
made very plain that beyond this there was a wide divergence of
opinion. We will allow one of his letters to a representative of the
American Bible Society, under date of May 26, 1890, to tell the next
step in this great undertaking:
The differences are not great, and where they exist, the
versions will serve Chinese students as a sort of commentary.
There are a multitude of questions in Biblical interpretation
which no translation can settle once for all. Moreover, ninety-
nine out of a hundred of those who use the Mandarin will
never look at any other translation. Two versions in perfect
accord seem like a fine product, but it is difficult of realization.
An attempt at reconciling the present versions would develop
many difficulties. A Mandarin sentence especially is not easy
to tamper with. The change of a single word would often
dislocate a long sentence, and necessitate retranslation and
adjustment to the context.
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
textbookfull.com