This book develops a type theory, studies its properties, and explains its uses in computer science. The book focuses in particular on how the study of type theory may offer a powerful and uniform language for programming, program specification and development, and logical reasoning. The type theory developed here reflects a conceptual distinction between logical propositions and computational data types. Starting from an introduction of the basic concepts, the author explains the meaning and use of the type-theoretic language with proof-theoretic justifications, and discusses various issues in the study of type theory. The practical use of the language is illustrated by developing an approach to specification and data refinement in type theory, which supports modular development of specification, programs, and proofs. Students and researchers in computer science and logic will welcome this exciting new book.