Skip to content

TypeScript provides several utility types to facilitate common type transformations. These utilities are available globally.

Awaited<Type>

Released: 4.5

This type is meant to model operations like await in async functions, or the .then() method on Promises - specifically, the way that they recursively unwrap Promises.

Example
ts
type 
A
=
Awaited
<
Promise
<string>>;
type
B
=
Awaited
<
Promise
<
Promise
<number>>>;
type
C
=
Awaited
<boolean |
Promise
<number>>;

Partial<Type>

Released:
2.1

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.

Example
ts
interface Todo {
  
title
: string;
description
: string;
} function
updateTodo
(
todo
: Todo,
fieldsToUpdate
:
Partial
<Todo>) {
return { ...
todo
, ...
fieldsToUpdate
};
} const
todo1
= {
title
: "organize desk",
description
: "clear clutter",
}; const
todo2
=
updateTodo
(
todo1
, {
description
: "throw out trash",
});

Required<Type>

Released:
2.8

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

Example
ts
interface Props {
  
a
?: number;
b
?: string;
} const
obj
: Props = {
a
: 5 };
const obj2:
Required
<Props> = {
a
: 5 };
Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.

Readonly<Type>

Released:
2.1

Constructs a type with all properties of Type set to readonly, meaning the properties of the constructed type cannot be reassigned.

Example
ts
interface Todo {
  
title
: string;
} const
todo
:
Readonly
<Todo> = {
title
: "Delete inactive users",
};
todo
.title = "Hello";
Cannot assign to 'title' because it is a read-only property.

This utility is useful for representing assignment expressions that will fail at runtime (i.e. when attempting to reassign properties of a frozen object).

Object.freeze
ts
function freeze<Type>(obj: Type): Readonly<Type>;

Record<Keys, Type>

Released:
2.1

Constructs an object type whose property keys are Keys and whose property values are Type. This utility can be used to map the properties of a type to another type.

Example
ts
type 
CatName
= "miffy" | "boris" | "mordred";
interface CatInfo {
age
: number;
breed
: string;
} const
cats
:
Record
<
CatName
, CatInfo> = {
miffy
: {
age
: 10,
breed
: "Persian" },
boris
: {
age
: 5,
breed
: "Maine Coon" },
mordred
: {
age
: 16,
breed
: "British Shorthair" },
};
cats
.
boris
;

Pick<Type, Keys>

Released:
2.1

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

Example
ts
interface Todo {
  
title
: string;
description
: string;
completed
: boolean;
} type
TodoPreview
=
Pick
<Todo, "title" | "completed">;
const
todo
:
TodoPreview
= {
title
: "Clean room",
completed
: false,
};
todo
;

Omit<Type, Keys>

Released:
3.5

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

Example
ts
interface Todo {
  
title
: string;
description
: string;
completed
: boolean;
createdAt
: number;
} type
TodoPreview
=
Omit
<Todo, "description">;
const
todo
:
TodoPreview
= {
title
: "Clean room",
completed
: false,
createdAt
: 1615544252770,
};
todo
;
type
TodoInfo
=
Omit
<Todo, "completed" | "createdAt">;
const
todoInfo
:
TodoInfo
= {
title
: "Pick up kids",
description
: "Kindergarten closes at 5pm",
};
todoInfo
;

Exclude<UnionType, ExcludedMembers>

Released:
2.8

Constructs a type by excluding from UnionType all union members that are assignable to ExcludedMembers.

Example
ts
type 
T0
=
Exclude
<"a" | "b" | "c", "a">;
type
T1
=
Exclude
<"a" | "b" | "c", "a" | "b">;
type
T2
=
Exclude
<string | number | (() => void), Function>;
type
Shape
=
| {
kind
: "circle";
radius
: number }
| {
kind
: "square";
x
: number }
| {
kind
: "triangle";
x
: number;
y
: number };
type
T3
=
Exclude
<
Shape
, {
kind
: "circle" }>;

Extract<Type, Union>

Released:
2.8

Constructs a type by extracting from Type all union members that are assignable to Union.

Example
ts
type 
T0
=
Extract
<"a" | "b" | "c", "a" | "f">;
type
T1
=
Extract
<string | number | (() => void), Function>;
type
Shape
=
| {
kind
: "circle";
radius
: number }
| {
kind
: "square";
x
: number }
| {
kind
: "triangle";
x
: number;
y
: number };
type
T2
=
Extract
<
Shape
, {
kind
: "circle" }>;

NonNullable<Type>

Released:
2.8

Constructs a type by excluding null and undefined from Type.

Example
ts
type 
T0
=
NonNullable
<string | number | undefined>;
type
T1
=
NonNullable
<string[] | null | undefined>;

Parameters<Type>

Released:
3.1

Constructs a tuple type from the types used in the parameters of a function type Type.

For overloaded functions, this will be the parameters of the last signature; see Inferring Within Conditional Types.

Example
ts
declare function 
f1
(
arg
: {
a
: number;
b
: string }): void;
type
T0
=
Parameters
<() => string>;
type
T1
=
Parameters
<(
s
: string) => void>;
type
T2
=
Parameters
<<
T
>(
arg
:
T
) =>
T
>;
type
T3
=
Parameters
<typeof
f1
>;
type
T4
=
Parameters
<any>;
type
T5
=
Parameters
<never>;
type
T6
=
Parameters
<string>;
Type 'string' does not satisfy the constraint '(...args: any) => any'.
type
T7
=
Parameters
<Function>;
Type 'Function' does not satisfy the constraint '(...args: any) => any'. Type 'Function' provides no match for the signature '(...args: any): any'.

ConstructorParameters<Type>

Released:
3.1

Constructs a tuple or array type from the types of a constructor function type. It produces a tuple type with all the parameter types (or the type never if Type is not a function).

Example
ts
type 
T0
=
ConstructorParameters
<ErrorConstructor>;
type
T1
=
ConstructorParameters
<FunctionConstructor>;
type
T2
=
ConstructorParameters
<RegExpConstructor>;
class
C
{
constructor(
a
: number,
b
: string) {}
} type
T3
=
ConstructorParameters
<typeof
C
>;
type
T4
=
ConstructorParameters
<any>;
type
T5
=
ConstructorParameters
<Function>;
Type 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'. Type 'Function' provides no match for the signature 'new (...args: any): any'.

ReturnType<Type>

Released:
2.8

Constructs a type consisting of the return type of function Type.

For overloaded functions, this will be the return type of the last signature; see Inferring Within Conditional Types.

Example
ts
declare function 
f1
(): {
a
: number;
b
: string };
type
T0
=
ReturnType
<() => string>;
type
T1
=
ReturnType
<(
s
: string) => void>;
type
T2
=
ReturnType
<<
T
>() =>
T
>;
type
T3
=
ReturnType
<<
T
extends
U
,
U
extends number[]>() =>
T
>;
type
T4
=
ReturnType
<typeof
f1
>;
type
T5
=
ReturnType
<any>;
type
T6
=
ReturnType
<never>;
type
T7
=
ReturnType
<string>;
Type 'string' does not satisfy the constraint '(...args: any) => any'.
type
T8
=
ReturnType
<Function>;
Type 'Function' does not satisfy the constraint '(...args: any) => any'. Type 'Function' provides no match for the signature '(...args: any): any'.

InstanceType<Type>

Released:
2.8

Constructs a type consisting of the instance type of a constructor function in Type.

Example
ts
class 
C
{
x
= 0;
y
= 0;
} type
T0
=
InstanceType
<typeof
C
>;
type
T1
=
InstanceType
<any>;
type
T2
=
InstanceType
<never>;
type
T3
=
InstanceType
<string>;
Type 'string' does not satisfy the constraint 'abstract new (...args: any) => any'.
type
T4
=
InstanceType
<Function>;
Type 'Function' does not satisfy the constraint 'abstract new (...args: any) => any'. Type 'Function' provides no match for the signature 'new (...args: any): any'.

NoInfer<Type>

Released:
5.4

Blocks inferences to the contained type. Other than blocking inferences, NoInfer<Type> is identical to Type.

Example
ts
function createStreetLight<C extends string>(
  colors: C[],
  defaultColor?: NoInfer<C>
) {
  // ...
}

createStreetLight(["red", "yellow", "green"], "red"); // OK
createStreetLight(["red", "yellow", "green"], "blue"); // Error

ThisParameterType<Type>

Released:
3.3

Extracts the type of the this parameter for a function type, or unknown if the function type has no this parameter.

Example
ts
function 
toHex
(
this
: Number) {
return this.
toString
(16);
} function
numberToString
(
n
:
ThisParameterType
<typeof
toHex
>) {
return
toHex
.
apply
(
n
);
}

OmitThisParameter<Type>

Released:
3.3

Removes the this parameter from Type. If Type has no explicitly declared this parameter, the result is simply Type. Otherwise, a new function type with no this parameter is created from Type. Generics are erased and only the last overload signature is propagated into the new function type.

Example
ts
function 
toHex
(
this
: Number) {
return this.
toString
(16);
} const
fiveToHex
:
OmitThisParameter
<typeof
toHex
> =
toHex
.
bind
(5);
console
.
log
(
fiveToHex
());

ThisType<Type>

Released:
2.3

This utility does not return a transformed type. Instead, it serves as a marker for a contextual this type. Note that the noImplicitThis flag must be enabled to use this utility.

Example
ts
type 
ObjectDescriptor
<
D
,
M
> = {
data
?:
D
;
methods
?:
M
&
ThisType
<
D
&
M
>; // Type of 'this' in methods is D & M
}; function
makeObject
<
D
,
M
>(
desc
:
ObjectDescriptor
<
D
,
M
>):
D
&
M
{
let
data
: object =
desc
.
data
|| {};
let
methods
: object =
desc
.
methods
|| {};
return { ...
data
, ...
methods
} as
D
&
M
;
} let
obj
=
makeObject
({
data
: {
x
: 0,
y
: 0 },
methods
: {
moveBy
(
dx
: number,
dy
: number) {
this.
x
+=
dx
; // Strongly typed this
this.
y
+=
dy
; // Strongly typed this
}, }, });
obj
.
x
= 10;
obj
.
y
= 20;
obj
.
moveBy
(5, 5);

In the example above, the methods object in the argument to makeObject has a contextual type that includes ThisType<D & M> and therefore the type of this in methods within the methods object is { x: number, y: number } & { moveBy(dx: number, dy: number): void }. Notice how the type of the methods property simultaneously is an inference target and a source for the this type in methods.

The ThisType<T> marker interface is simply an empty interface declared in lib.d.ts. Beyond being recognized in the contextual type of an object literal, the interface acts like any empty interface.

Intrinsic String Manipulation Types

Uppercase<StringType>

Lowercase<StringType>

Capitalize<StringType>

Uncapitalize<StringType>

To help with string manipulation around template string literals, TypeScript includes a set of types which can be used in string manipulation within the type system. You can find those in the Template Literal Types documentation.