SlideShare a Scribd company logo
Flow or Type - how
to React to that?
Domagoj Cerjan
Kresimir Antolic
WHAT TO EXPECT?
Nothing revolutionary.
Hints and cases where *THIS* can help you!
Enough for you to start believing in the TYPE.
THE PROBLEM
● Familiar with these?
● What is the second argument of that function?
● I removed a function from a module, what code used it and where will it break?
OUR LORD AND SAVIOUR…*
* Not really but it helps A LOT.
● A safeguard preventing us from assigning apples to oranges
● A tool which helps to avoid ‘undefined is not a function’ or ‘cannot read property x of
undefined’ errors
● Gives a sense of hope and security in huge codebases
● Makes refactoring a little less heart attack prone
● Makes code more clear and explicit
A Type System!
IN REACT?!
… Not exactly.
● Around the React ecosystem… Yeah
● Not tied directly but it makes our life easier
● Defining input for your components and describing your data
API DATA
TRANSFORM
DATA
API DATA
TRANSFORM
DATA
COMBiNE
TRANSFORM
UI
REACT
COMPONENT
LOCAL
DATA
INTERACTION!
MODIFY
FUNCTION
CALL
DATA
OK.. WHAT THEN?
Flow
● Type-checking preprocessor bolted
onto JS
● More oriented towards FP
● Requires a type annotation removal
step before JS code can be consumed
(usually via @babel/preset-flow)
Typescript
● Actual language with its own
compiler
● More oriented towards OOP
● Has enums (it is a different
language)
● Requires a compilation step to
produce runnable JS code (via tsc)
Type System{s}?
Flow
● Prioritizes soundness - it rejects all
invalid code and some valid
● Type-related bugs do not slip through
● Objects, Interfaces and Functions are
structurally typed
● Classes are nominally typed (ie two
differently named classes having exact
same shape are different)
Typescript
● Prioritizes completeness - accepts
all valid code and some invalid
● Type-related bugs might slip
through
● Objects and Interfaces are
structurally typed
● Classes, Functions and somewhat
Enums are nominally typed
Type System{s}? - Continued
OK OK...
WHAT TO EXPECT?
Making sure an apple is an apple
Types
let call: number = 'maybe';
// Type '"maybe"' is not assignable to type 'number'
call = 2;
class Apple { private name: string; }
class Orange { private name: string; }
let thing: Apple;
thing = new Apple();
thing = new Orange();
// Type 'Orange' is not assignable to type 'Apple'.
// Types have separate declarations of a private property 'name'.
Typescript
let call: number = 'maybe';
// Cannot assign 'maybe' to call because string [1] is incompatible with number [2].
call = 2;
class Apple { _name: string; }
class Orange { _name: string; }
let thing: Apple;
thing = new Apple();
thing = new Orange();
// Cannot assign new Orange() to thing because Orange [1] is incompatible with Apple [2].
Flow
Describing contents in the box
Interfaces/Types
type PokemonType = 'water' | 'fire' | 'electric';
interface IPokemon {
name: string;
type: PokemonType[];
}
interface IProps {
list: IPokemon[];
}
interface IState {
isExpanded: boolean;
}
export class PokemonList extends React.PureComponent<IProps, IState> {
state = { isExpanded: false };
render() {
const { list } = this.props;
return list ? (<div>{list.map((p) => <div>{p.name}</div>)}</div>) : null;
}
}
Typescript
type PokemonType = 'water' | 'fire' | 'electric';
interface IPokemon {
name: string;
type: PokemonType[];
}
interface IProps {
list: IPokemon[];
}
interface IState {
isExpanded: boolean;
}
export class PokemonList extends PureComponent<IProps, IState> {
state = { isExpanded: false };
render() {
const { list } = this.props;
return list ? (<div>{list.map((p) => <div>{p.name}</div>)}</div>) : null;
}
}
Flow
Where type systems shine
Inference
class Apple { private name: string; }
class Orange { private name: string; }
const fruitBox = [new Orange(), new Orange(), new Apple()]
const makeOrangeJuice = (oranges: Orange[]): string =>
`Orange juice (${oranges.length})dl`;
makeOrangeJuice(fruitBox);
// Type 'Apple' is not assignable to type 'Orange'.
// Types have separate declarations of a private property 'name'.
Typescript
class Apple { _name: string; }
class Orange { _name: string; }
const fruitBox = [new Orange(), new Orange(), new Apple()]
const makeOrangeJuice = (oranges: Orange[]): string =>
`Orange juice (${oranges.length})dl`;
makeOrangeJuice(fruitBox);
// Cannot call makeOrangeJuice with fruitBox bound to oranges because Apple [1] is incompatible with Orange [2] in
array element.
Flow
:any is the enemy, believe in type inference
● Using :any type turns type inference off, any is bad, don’t be like any
● We don’t want to type types manually everywhere
● Humans make mistakes often, some developers do also
● Type inference systems usually don’t, but when they do, they do it consistently
● Do not assume types, let type inference do that for you!
● Relying on type inference mechanisms allows us to think less and code more
Organizing your boxes
Structuring your app
export class Pokemon {
static readonly type: string = 'electric';
public height: number = 0.5;
protected pokemonIdx: number = 0;
private name: string = 'pikachu';
constructor() {
console.log(this.name);
}
}
Typescript
export class Pokemon {
static +type: string = 'electric';
height: number = 0.5;
pokemonIdx: number = 0;
_name: string = 'pikachu';
constructor() {
console.log(this._name);
}
}
Flow
Working with the codebase
Stick, stones, wood, lava..
Flow
● IDE integration is lacking
compared to Typescript
● Slow, though improving a lot with
every new release
● Outstanding command line tools
● ESLint with flow-type plugin
Typescript
● Great IDE integration (Idea, VSCode...)
● Fast
● Excellent code-completion facilities
● Ok-ish command line tools
● Parallelised type checking
● TSLint (though lacking in comparison
with ESLint)
Working with the codebase
Working well with others?
● Both flow and typescript offer facilities to define library typings
○ Flow via *.flow.js files
○ Typescript via *.d.ts files
● Most commonly used libraries (lodash, react, redux…) have well-tested
and defined typings which provide both code completions and type-safety
● You can always extend, override or write yours
It's leviosa not leviosa
Advanced usages
Advanced usages
● Code generation!
○ Gives type safety on multiple levels
● Generic types
● Nominal vs Structural typing
● Type unions and intersections
GREAT - LET’S MOVE TO TYPES!
When to migrate?
When to migrate to either Typescript or Flow
● Big crucial project
● High people turnover rate
● Aiming to increase robustness of the project codebase
● OOP oriented - Typescript
● FP oriented - Flow
When not to think about it
● Small and simple project
Issues?
● Flow - opt in , TS - have to write everything..
● 3rd party typings - But sometimes… those typings leave a lot to be desired
● TS - if things are not easily typed.. Maybe you didn’t structure your code well
NO MORE ERRORS, NEVER?
Bad things...
● Type systems do not solve all of your mistakes, they only prevent some from happening
● They introduce complexity
● More programming knowledge is needed (Types? What are those?)
● You still need to know JS
● They don't make JS more performant
● Can lead to over-engineering
● Illusion of security (mistyped libraries, abusing any type)
OTHER SOLUTIONS?
● Elm - a Haskell inspired purely functional typed language that compiles down to JS
● Purescript - a Haskell inspired purely functional statically typed language that compiles down to JS
● Livescript - a Haskell, F# and clojure inspired functional statically typed language that also compiles
down to JS
● Dart - Google’s attempt at replacing JS - a more classical optionally-typed language that, you
guessed it, compiles down to JS
● Haxe - a strictly typed general purpose multi-paradigm language that also happens to also target JS
● All of that is great but it introduces new concepts, a new language and a new set of problems which
could be problematic for onboarding new people not familiar to them
Other typed solutions
REMIND ME AGAIN WHY
SHOULD I DO THIS?
Why?
● Refactoring
● Codebase robustness
● Helps with high people turnover rate
● Ease of development (code completion)
● Auto documentation - “what type is that second argument of a function from
over there?!?”
● Readability, static code analysis - catch errors early!
JUST TYPE IT.
THANKS!
@kantolic
@dcerjan

More Related Content

What's hot (20)

PDF
JavaScript Tutorial For Beginners | JavaScript Training | JavaScript Programm...
Edureka!
 
ODP
10 Things I Hate About Scala
Meir Maor
 
PDF
Why Java Sucks and C# Rocks (Final)
jeffz
 
PPT
Introduction to Javascript
Amit Tyagi
 
PPTX
pebble - Building apps on pebble
Aniruddha Chakrabarti
 
PDF
Xtend - better java with -less- noise
Neeraj Bhusare
 
PDF
Applicative style programming
José Luis García Hernández
 
PDF
JavaScript Programming
Sehwan Noh
 
PDF
8 introduction to_java_script
Vijay Kalyan
 
PDF
Functional programming with Java 8
Talha Ocakçı
 
PPTX
Functional programming with Java 8
LivePerson
 
PPTX
Functional programming in TypeScript
binDebug WorkSpace
 
PDF
JavaScript: Core Part
維佋 唐
 
PPT
The JavaScript Programming Language
Raghavan Mohan
 
PDF
C# Programming: Fundamentals
Mahmoud Abdallah
 
PDF
Javascript
Vibhor Grover
 
PPTX
Introduction to functional programming with java 8
JavaBrahman
 
PDF
Effective Scala (JavaDay Riga 2013)
mircodotta
 
PDF
Introduction to Dart
RameshNair6
 
JavaScript Tutorial For Beginners | JavaScript Training | JavaScript Programm...
Edureka!
 
10 Things I Hate About Scala
Meir Maor
 
Why Java Sucks and C# Rocks (Final)
jeffz
 
Introduction to Javascript
Amit Tyagi
 
pebble - Building apps on pebble
Aniruddha Chakrabarti
 
Xtend - better java with -less- noise
Neeraj Bhusare
 
Applicative style programming
José Luis García Hernández
 
JavaScript Programming
Sehwan Noh
 
8 introduction to_java_script
Vijay Kalyan
 
Functional programming with Java 8
Talha Ocakçı
 
Functional programming with Java 8
LivePerson
 
Functional programming in TypeScript
binDebug WorkSpace
 
JavaScript: Core Part
維佋 唐
 
The JavaScript Programming Language
Raghavan Mohan
 
C# Programming: Fundamentals
Mahmoud Abdallah
 
Javascript
Vibhor Grover
 
Introduction to functional programming with java 8
JavaBrahman
 
Effective Scala (JavaDay Riga 2013)
mircodotta
 
Introduction to Dart
RameshNair6
 

Similar to Flow or Type - how to React to that? (20)

PDF
Introduction to TypeScript
André Pitombeira
 
PPTX
SubmitJS: Is react + redux + typescript a good combination? Dmytro Beseda
Binary Studio
 
PDF
Introduction to typescript
Mario Alexandro Santini
 
PPTX
Type script is awesome
KeithMurgic
 
PPTX
Introduction to TypeScript
KeithMurgic
 
PDF
James Baxley - Statically typing your GraphQL app
React Conf Brasil
 
PDF
Types For Frontend Developers
Jesse Williamson
 
PPTX
Type script - advanced usage and practices
Iwan van der Kleijn
 
PDF
Flow
zupzup.org
 
PDF
Power Leveling your TypeScript
Offirmo
 
PDF
Static types on javascript?! Type checking approaches to ensure healthy appli...
Arthur Puthin
 
PPTX
Getting started with typescript
C...L, NESPRESSO, WAFAASSURANCE, SOFRECOM ORANGE
 
PPTX
Typescript: Beginner to Advanced
Talentica Software
 
PPTX
Static Type Checking with FlowJs
Unfold UI
 
PDF
Back to the Future with TypeScript
Aleš Najmann
 
PDF
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
Heejong Ahn
 
PDF
Programming TypeScript Making your JavaScript applications scale Boris Cherny
kholiheijne
 
PDF
Clean & Typechecked JS
Arthur Puthin
 
PDF
Milano JS Meetup - Gabriele Petronella - Codemotion Milan 2016
Codemotion
 
PDF
Practical TypeScript
ldaws
 
Introduction to TypeScript
André Pitombeira
 
SubmitJS: Is react + redux + typescript a good combination? Dmytro Beseda
Binary Studio
 
Introduction to typescript
Mario Alexandro Santini
 
Type script is awesome
KeithMurgic
 
Introduction to TypeScript
KeithMurgic
 
James Baxley - Statically typing your GraphQL app
React Conf Brasil
 
Types For Frontend Developers
Jesse Williamson
 
Type script - advanced usage and practices
Iwan van der Kleijn
 
Power Leveling your TypeScript
Offirmo
 
Static types on javascript?! Type checking approaches to ensure healthy appli...
Arthur Puthin
 
Getting started with typescript
C...L, NESPRESSO, WAFAASSURANCE, SOFRECOM ORANGE
 
Typescript: Beginner to Advanced
Talentica Software
 
Static Type Checking with FlowJs
Unfold UI
 
Back to the Future with TypeScript
Aleš Najmann
 
TypeScript와 Flow: 
자바스크립트 개발에 정적 타이핑 도입하기
Heejong Ahn
 
Programming TypeScript Making your JavaScript applications scale Boris Cherny
kholiheijne
 
Clean & Typechecked JS
Arthur Puthin
 
Milano JS Meetup - Gabriele Petronella - Codemotion Milan 2016
Codemotion
 
Practical TypeScript
ldaws
 
Ad

Recently uploaded (20)

PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PPTX
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
Agentic AI lifecycle for Enterprise Hyper-Automation
Debmalya Biswas
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Achieving Consistent and Reliable AI Code Generation - Medusa AI
medusaaico
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
The Project Compass - GDG on Campus MSIT
dscmsitkol
 
Ad

Flow or Type - how to React to that?

  • 1. Flow or Type - how to React to that? Domagoj Cerjan Kresimir Antolic
  • 3. Nothing revolutionary. Hints and cases where *THIS* can help you! Enough for you to start believing in the TYPE.
  • 5. ● Familiar with these? ● What is the second argument of that function? ● I removed a function from a module, what code used it and where will it break?
  • 6. OUR LORD AND SAVIOUR…* * Not really but it helps A LOT.
  • 7. ● A safeguard preventing us from assigning apples to oranges ● A tool which helps to avoid ‘undefined is not a function’ or ‘cannot read property x of undefined’ errors ● Gives a sense of hope and security in huge codebases ● Makes refactoring a little less heart attack prone ● Makes code more clear and explicit A Type System!
  • 9. … Not exactly. ● Around the React ecosystem… Yeah ● Not tied directly but it makes our life easier ● Defining input for your components and describing your data
  • 12. Flow ● Type-checking preprocessor bolted onto JS ● More oriented towards FP ● Requires a type annotation removal step before JS code can be consumed (usually via @babel/preset-flow) Typescript ● Actual language with its own compiler ● More oriented towards OOP ● Has enums (it is a different language) ● Requires a compilation step to produce runnable JS code (via tsc) Type System{s}?
  • 13. Flow ● Prioritizes soundness - it rejects all invalid code and some valid ● Type-related bugs do not slip through ● Objects, Interfaces and Functions are structurally typed ● Classes are nominally typed (ie two differently named classes having exact same shape are different) Typescript ● Prioritizes completeness - accepts all valid code and some invalid ● Type-related bugs might slip through ● Objects and Interfaces are structurally typed ● Classes, Functions and somewhat Enums are nominally typed Type System{s}? - Continued
  • 14. OK OK... WHAT TO EXPECT?
  • 15. Making sure an apple is an apple Types
  • 16. let call: number = 'maybe'; // Type '"maybe"' is not assignable to type 'number' call = 2; class Apple { private name: string; } class Orange { private name: string; } let thing: Apple; thing = new Apple(); thing = new Orange(); // Type 'Orange' is not assignable to type 'Apple'. // Types have separate declarations of a private property 'name'. Typescript
  • 17. let call: number = 'maybe'; // Cannot assign 'maybe' to call because string [1] is incompatible with number [2]. call = 2; class Apple { _name: string; } class Orange { _name: string; } let thing: Apple; thing = new Apple(); thing = new Orange(); // Cannot assign new Orange() to thing because Orange [1] is incompatible with Apple [2]. Flow
  • 18. Describing contents in the box Interfaces/Types
  • 19. type PokemonType = 'water' | 'fire' | 'electric'; interface IPokemon { name: string; type: PokemonType[]; } interface IProps { list: IPokemon[]; } interface IState { isExpanded: boolean; } export class PokemonList extends React.PureComponent<IProps, IState> { state = { isExpanded: false }; render() { const { list } = this.props; return list ? (<div>{list.map((p) => <div>{p.name}</div>)}</div>) : null; } } Typescript
  • 20. type PokemonType = 'water' | 'fire' | 'electric'; interface IPokemon { name: string; type: PokemonType[]; } interface IProps { list: IPokemon[]; } interface IState { isExpanded: boolean; } export class PokemonList extends PureComponent<IProps, IState> { state = { isExpanded: false }; render() { const { list } = this.props; return list ? (<div>{list.map((p) => <div>{p.name}</div>)}</div>) : null; } } Flow
  • 21. Where type systems shine Inference
  • 22. class Apple { private name: string; } class Orange { private name: string; } const fruitBox = [new Orange(), new Orange(), new Apple()] const makeOrangeJuice = (oranges: Orange[]): string => `Orange juice (${oranges.length})dl`; makeOrangeJuice(fruitBox); // Type 'Apple' is not assignable to type 'Orange'. // Types have separate declarations of a private property 'name'. Typescript
  • 23. class Apple { _name: string; } class Orange { _name: string; } const fruitBox = [new Orange(), new Orange(), new Apple()] const makeOrangeJuice = (oranges: Orange[]): string => `Orange juice (${oranges.length})dl`; makeOrangeJuice(fruitBox); // Cannot call makeOrangeJuice with fruitBox bound to oranges because Apple [1] is incompatible with Orange [2] in array element. Flow
  • 24. :any is the enemy, believe in type inference ● Using :any type turns type inference off, any is bad, don’t be like any ● We don’t want to type types manually everywhere ● Humans make mistakes often, some developers do also ● Type inference systems usually don’t, but when they do, they do it consistently ● Do not assume types, let type inference do that for you! ● Relying on type inference mechanisms allows us to think less and code more
  • 26. export class Pokemon { static readonly type: string = 'electric'; public height: number = 0.5; protected pokemonIdx: number = 0; private name: string = 'pikachu'; constructor() { console.log(this.name); } } Typescript
  • 27. export class Pokemon { static +type: string = 'electric'; height: number = 0.5; pokemonIdx: number = 0; _name: string = 'pikachu'; constructor() { console.log(this._name); } } Flow
  • 28. Working with the codebase Stick, stones, wood, lava..
  • 29. Flow ● IDE integration is lacking compared to Typescript ● Slow, though improving a lot with every new release ● Outstanding command line tools ● ESLint with flow-type plugin Typescript ● Great IDE integration (Idea, VSCode...) ● Fast ● Excellent code-completion facilities ● Ok-ish command line tools ● Parallelised type checking ● TSLint (though lacking in comparison with ESLint) Working with the codebase
  • 30. Working well with others? ● Both flow and typescript offer facilities to define library typings ○ Flow via *.flow.js files ○ Typescript via *.d.ts files ● Most commonly used libraries (lodash, react, redux…) have well-tested and defined typings which provide both code completions and type-safety ● You can always extend, override or write yours
  • 31. It's leviosa not leviosa Advanced usages
  • 32. Advanced usages ● Code generation! ○ Gives type safety on multiple levels ● Generic types ● Nominal vs Structural typing ● Type unions and intersections
  • 33. GREAT - LET’S MOVE TO TYPES!
  • 34. When to migrate? When to migrate to either Typescript or Flow ● Big crucial project ● High people turnover rate ● Aiming to increase robustness of the project codebase ● OOP oriented - Typescript ● FP oriented - Flow When not to think about it ● Small and simple project
  • 35. Issues? ● Flow - opt in , TS - have to write everything.. ● 3rd party typings - But sometimes… those typings leave a lot to be desired ● TS - if things are not easily typed.. Maybe you didn’t structure your code well
  • 36. NO MORE ERRORS, NEVER?
  • 37. Bad things... ● Type systems do not solve all of your mistakes, they only prevent some from happening ● They introduce complexity ● More programming knowledge is needed (Types? What are those?) ● You still need to know JS ● They don't make JS more performant ● Can lead to over-engineering ● Illusion of security (mistyped libraries, abusing any type)
  • 39. ● Elm - a Haskell inspired purely functional typed language that compiles down to JS ● Purescript - a Haskell inspired purely functional statically typed language that compiles down to JS ● Livescript - a Haskell, F# and clojure inspired functional statically typed language that also compiles down to JS ● Dart - Google’s attempt at replacing JS - a more classical optionally-typed language that, you guessed it, compiles down to JS ● Haxe - a strictly typed general purpose multi-paradigm language that also happens to also target JS ● All of that is great but it introduces new concepts, a new language and a new set of problems which could be problematic for onboarding new people not familiar to them Other typed solutions
  • 40. REMIND ME AGAIN WHY SHOULD I DO THIS?
  • 41. Why? ● Refactoring ● Codebase robustness ● Helps with high people turnover rate ● Ease of development (code completion) ● Auto documentation - “what type is that second argument of a function from over there?!?” ● Readability, static code analysis - catch errors early!