1. A method of type-checking a code segment written in a programming language comprising: translating the code segment from the programming language to one or more representations of a typed intermediate language, wherein the one or more representations of the typed intermediate language are capable of representing programs written in a plurality of different source languages, and wherein the one or more representations comprise a first object having a known type, and wherein the translating comprises: determining that the first object will be type-checked as an unknown type, and based on the determining, designating the first object as having the unknown type by dropping the known type of the first object and replacing the known type with the unknown type; and type-checking the one or more representations based on a rule set, wherein: the rule set comprises rules for type-checking the type designated as the unknown type, the unknown type indicates that an element of the representation is of a type that is not known, and the first object is type-checked as having an unknown type, based on the designating.