What Does "+?" Mean in TypeScript?

Introduced in TypeScript 2.8, if the ? modifier is prefixed with + (i.e. +?), it means that the "?" modifier is added to a mapped type, making all properties optional.

If the ? modifier has no + or - prefix, then it is the same as if the ? modifier was prefixed with + (i.e. +?).

For example, using "+?", the Partial utility type can be implemented like so:

type Partial<Type> = { [Property in keyof Type]+?: Type[Property] };

This is the same as the following:

type Partial<Type> = { [Property in keyof Type]?: Type[Property] };

These types map all keys of type "Type" and make them optional.

You can, of course, make use of +? in various other ways. Consider for example the following, where the custom utility type takes all the properties from the type "Type" and changes their values to be optional and makes them readonly:

// TypeScript 2.8+
type ReadonlyPartial<T> = {
    readonly [P in keyof T]+?: T[P]
};

This could, for instance, be used like so:

// TypeScript 2.8+
type Todo = {
    title: string;
    description: string;
};

type ArchivedTodo = ReadonlyPartial<Todo>;

const task1: ArchivedTodo = { title: 'Do the dishes' };

The "ArchivedTodo" type in this example, makes all properties of the "Todo" type optional and readonly, which means that if you try to (re)assign any property, it would throw an error:

// ...
// Error: Cannot assign to 'description' because it is a read-only property.
task1.description = 'Make them squeaky clean';

This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.