Type 'undefined' is not assignable to type in TypeScript

avatar
Borislav Hadzhiev

Last updated: Feb 27, 2024
5 min

banner

# Type 'undefined' is not assignable to type in TypeScript

The "Type 'undefined' is not assignable to type" error occurs when a possibly undefined value is assigned to something that expects a different type.

To solve the error, use the non-null assertion operator or a type guard to verify the value is of the specific type before the assignment.

Here is an example of how the error occurs.

index.ts
interface Employee { id: number; name: string; salary?: number; // ๐Ÿ‘ˆ๏ธ optional } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; // โ›”๏ธ Error: Type 'number | undefined' is not assignable to type 'number'. // Type 'undefined' is not assignable to type 'number'.ts(2322) const salary: number = emp.salary;

type undefined is not assignable to type

The salary property is marked as optional in the Employee interface.

This means that the property can store a number or an undefined value.

The salary variable is typed as a number, so it only expects to get assigned a value that is a number.

TypeScript is basically telling us that the emp.salary property might have a value of undefined which is not compatible with the type of the salary variable which only expects a number.

# Using the non-null assertion operator to solve the error

One way to solve the error is to use the non-null assertion operator.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const salary: number = emp.salary!; // ๐Ÿ‘ˆ๏ธ non-null assertion console.log(salary); // ๐Ÿ‘‰๏ธ 100

using non null assertion operator to solve the error

The code for this article is available on GitHub

The exclamation mark is the non-null assertion operator in TypeScript.

It removes null and undefined from a type without doing any explicit type-checking.

When you use this approach, you basically tell TypeScript that this value will never be null or undefined.

# Using a type assertion to solve the error

This approach is very similar to using a type assertion.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const salary: number = emp.salary as number; console.log(salary); // ๐Ÿ‘‰๏ธ 100

using type assertion to solve the error

The code for this article is available on GitHub

Type assertions are used when we have information about the type of a value that TypeScript can't know about.

We effectively tell TypeScript that emp.salary will be a number and not to worry about it.

# Using a union type to solve the error

You could set the type of the salary variable to be number | undefined, which could solve the error depending on your use case.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; // ๐Ÿ‘‡๏ธ types now match const salary: number | undefined = emp.salary; console.log(salary); // ๐Ÿ‘‰๏ธ 100

using union type to solve the error

The code for this article is available on GitHub

The type of the salary variable now matches the type of the emp.salary property, so no error is thrown.

# Using a type guard to solve the error

An alternative approach is to use a type guard.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const salary: number = emp.salary !== undefined ? emp.salary : 0; console.log(salary); // ๐Ÿ‘‰๏ธ 100

using type guard to solve the error

We used the ternary operator to check if the salary property is not equal to undefined.

If the property is not equal to undefined, it gets assigned to the salary variable, otherwise we use the number 0 as a fallback.

This way we can be sure that the salary variable will always get assigned a number, even if emp.salary is undefined.

# Using the nullish coalescing operator (??) to solve the error

You could also use the nullish coalescing operator (??) to solve the error.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const salary: number = emp.salary ?? 0; console.log(salary); // ๐Ÿ‘‰๏ธ 100

using nullish coalescing operator to solve the error

The code for this article is available on GitHub

The nullish coalescing operator (??) enables us to specify a fallback for when a value is null or undefined.

If emp.salary is null or undefined, we set the salary variable to 0.

# Using the logical OR (||) operator to solve the error

You can also use the logical OR (||) operator in a similar way.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const salary: number = emp.salary || 0; console.log(salary); // ๐Ÿ‘‰๏ธ 100

using logical or operator to solve the error

The code for this article is available on GitHub

The logical OR (||) operator returns the value to the right if the value to the left is falsy.

This is different than the nullish coalescing operator (??) because nullish coalescing only checks for null and undefined.

The logical OR (||) operator would return the value to the right if the value to the left is any of the following: null, undefined, false, 0, "" (empty string), NaN (not a number).

# Using an if statement to solve the error

Even a simple if statement that serves as a type guard can be used to solve the error.

index.ts
interface Employee { id: number; name: string; salary?: number; } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; let salary = 0; // ๐Ÿ‘‡๏ธ emp.salary is number or undefined here if (emp.salary !== undefined) { // ๐Ÿ‘‡๏ธ emp.salary is number here salary = emp.salary; } console.log(salary); // ๐Ÿ‘‰๏ธ 100

using if statement to solve the error

The code for this article is available on GitHub

We used the let keyword to initialize the salary variable to 0.

In the if statement, we check if the emp.salary property is not equal to undefined and assign the salary variable to the corresponding value.

The "Type 'undefined' is not assignable to type" error occurs when a possibly undefined value is assigned to something that expects a different type.

index.ts
interface Employee { id: number; name: string; isProgrammer?: boolean; // ๐Ÿ‘ˆ๏ธ optional } const emp: Employee = { id: 1, name: 'Bobby Hadz', isProgrammer: true, }; // โ›”๏ธ Error: Type 'boolean | undefined' is not assignable to type 'boolean'. const isProgrammer: boolean = emp.isProgrammer;

The isProgrammer property has a type of boolean or undefined and the isProgrammer variable can only ever store a boolean value.

The divergence of the types is what causes the error.

# Using a compatible type to solve the error

You can also update the type to solve the error.

index.ts
interface Employee { id: number; name: string; salary: number; // ๐Ÿ‘ˆ๏ธ all required } const emp: Employee = { id: 1, name: 'Bobby Hadz', salary: 100, }; const salary: number = emp.salary;

using compatible type to solve the error

The code for this article is available on GitHub

The salary property in the Employee interface is no longer marked as optional, so the salary variable can have a type of number without any issues.

If you don't have access to the definition of the type, use the Required utility type to mark all properties on the type as required.

index.ts
interface Employee { id: number; name: string; salary?: number; // ๐Ÿ‘ˆ๏ธ optional property } const emp: Required<Employee> = { id: 1, name: 'Bobby Hadz', salary: 100, }; const salary: number = emp.salary;

using the required utility type

The salary property is optional, however, we wrapped the Employee type with the Required utility type, making all its properties required.

Now the salary property can no longer have a value of undefined.

# Conclusion

The solution to the "Type 'undefined' is not assignable to type" error is to make sure that the types of the values on the left-hand and right-hand sides are compatible.

The error occurs if one value could be undefined and the other cannot.

# Additional Resources

You can learn more about the related topics by checking out the following tutorials:

I wrote a book in which I share everything I know about how to become a better, more efficient programmer.
book cover
You can use the search field on my Home Page to filter through all of my articles.

Copyright ยฉ 2024 Borislav Hadzhiev