Types

circle-info

Types can be inferred from values, but only at the variable declaration.

circle-exclamation

Type being inferred from the value:

let str = "This is a string"; // string

A variable declared with no type will by default be of any type.

let str; // any

Built-in primitive types includes:

  • boolean

  • string

  • number: Representing integers and floats.

  • undefined

  • null

  • any

  • unknown

  • never

  • void

  • bigint

  • symbol

Common built-in JS Objects:

  • Date

  • Error

  • Array or []

  • Map

  • Set

  • Regexp

  • Promise

Type Literals:

  • Object: { field: number }

  • Function: (arg: number) => number

  • Arrays: Array<number> or number[]

  • Tuple: [number, number]

any

Very flexible and can accept any type.

triangle-exclamation

Variable of any type may also receive different types values at any point.

unknown

Represents any value and while it is similar to any type, it is much safer because it's not legal to do anything with an unknown value.

This is useful when describing function types because you can describe functions that accept any value without having any values in your function body.

never

It is a return type, meaning that it never returns a value.

This should mean that the function either throws an exception or terminates execution of the program.

void

Represents the return value of functions which don't return a value.

Tuples

Are not a "type" per say, but it is a way to use the [] type, enforcing a size and adding values change constrains.

type

  • Used for type definitions, usually to reduce repetition.

  • It can be amost the same as interface, but it cannot be extendend.

  • They may not be extended but types can be merged.

interface

circle-info

Types interface comparison checks can be faster.

  • Can be extended by declaring it multiple times, or merged with other interfaces.

  • Used to describe object shapes.

  • Can have function definitions. (Great to describe classes or contracts)

You can merge different interface into a type:

Extend it with extends:

It is also possible to extend via merging when the interfaces have the same name:

You can ensure a class conforms to an interface via implements.

Are a feature which allows for describing a value which could be one of a set of possible named constants.

It is NOT a type-level addition, but something added to the language and runtime.

Function Type

A way to declare the Function structure types (parameters and return).

You can generically say a variable is a function.

Or you can explicitly define it's params and return types.

Union Type

Describes a type which is one of many options. (These options are may be types or values)

circle-info

Great for reducing and restricting the variable value options.

Template Union Types

A template string can be used to combine and manipulate text inside the type system.

Intersection Types

A way to merge/extend types. (&), as seen above.

Partial

Constructs a type with all properties of Type set to optional. This utility will return a type that represents all subsets of a given type. (So that you dont have to use ?:)

Required

Constructs a type consisting of all properties of Type set to required.

Pick

Constructs a type by picking the set of properties Keys (string literal or union of string literals) from Type.

Omit

Constructs a type by picking all properties from Type and then removing Keys (String literal or union of string literals).

Conditional Types

Acts as if statements inside the type system. Created via generics, and then commonly used to reduce the number of options in a Type Union.

Generic Types

Are types that will hold a generic type, so that this type can change at runtime.

Will be the name inside <>, this name can be anything. (Conventionally it is used as T or R)

You can specify one or more generic types.

You may specify a default type for the generic if nothing was informed. (Otherwise Typescript will require you to specify a type)

You can constrain what types are accepted into the generic parameter with the extends keyword.

Mapped Types

Acts like a map statement for the type system, allowing an input type to change the structure of the new type.

Type Assertions

When you have information about the type of a value that Typescript can't know about.

circle-info

Are removed by the compiler and don't affect the runtime behaviour of the code.

Sometimes this rule can be too conservative and will disallow more complex coercions that might be valid.

If this happens you can use two assertions, first to any or unkonwn then to the desired type.

Last updated