  We present a new approach to the type inference problem for dynamic
languages. Our goal is to combine \emph{logical} constraints, that is,
deterministic information from a type system, with \emph{natural} constraints,
that is, uncertain statistical information about types learnt from sources like
identifier names. To this end, we introduce a framework for probabilistic type
inference that combines logic and learning: logical constraints on the types
are extracted from the program, and deep learning is applied to predict types
from surface-level code properties that are statistically associated. The
foremost insight of our method is to constrain the predictions from the
learning procedure to respect the logical constraints, which we achieve by
relaxing the logical inference problem of type prediction into a continuous
optimisation problem. We build a tool called OptTyper to predict missing types
for TypeScript files. OptTyper combines a continuous interpretation of logical
constraints derived by classical static analysis of TypeScript code, with
natural constraints obtained from a deep learning model, which learns naming
conventions for types from a large codebase. By evaluating OptTyper, we show
that the combination of logical and natural constraints yields a large
improvement in performance over either kind of information individually and
achieves a 4% improvement over the state-of-the-art.
