- 
                Notifications
    You must be signed in to change notification settings 
- Fork 108
Type Inference, written in TypeScript
        Daryl Tan edited this page Apr 12, 2020 
        ·
        7 revisions
      
    We need a language to describe types, just like ESTree is a language to describe programs. So we need a meta-type, to distinguish the different types. Let us call these meta-types kinds. All types collectively are considered members of Type.
- Primitive types:
{ "kind" : "primitive",
  "name" : "number"
}{ "kind" : "primitive",
  "name" : "integer"
}Type inferencers are allowed and encouraged to infer integer types whenever possible.
{ "kind" : "primitive",
  "name" : "bool"
}{ "kind" : "primitive",
  "name" : "undefined"
}- Type variables:
{ "kind" : "variable",
  "name" : string
 }- Function types:
{ "kind" : "function",
  "argumentTypes" : Type []
  "resultType" :  Type
}- List types:
{ "kind" : "list",
  "elementType" : Type
}- Pair types:
{ "kind" : "pair",
  "headType" : Type,
  "tailType" : Type
}To represent inferred types, let's put them on the "inferredType" field:
1 + 1represented as
{
"type": "BinaryExpression",
"inferredType": { "kind" : "primitive", "name" : "number" },
"start": 0,
"end": 5,
"left": {
  "type": "Literal",
  "inferredType": { "kind" : "primitive", "name" : "number" },
  "start": 0,
  "end": 1,
  "value": 1,
  "raw": "1"
},
"operator": "+",
"right": {
  "type": "Literal",
  "inferredType": { "kind" : "primitive", "name" : "number" },
  "start": 4,
  "end": 5,
  "value": 1,
  "raw": "1"
}
}