This document discusses type systems and type inference. It defines a type system as a set of rules governing data types in a program. It classifies fundamental type system properties such as type safety, static vs dynamic type checking, and type inference. Type safety ensures programs behave safely by preventing errors. Static type checking verifies safety at compile time while dynamic checking is at runtime. Type inference automatically detects data types and is featured in functional programming languages. The document contrasts explicit type annotation versus inferred types.