Type 'string or undefined' is not assignable to type string

avatar

Borislav Hadzhiev

Last updated: Jul 25, 2022

banner

Photo from Unsplash

Type 'string or undefined' is not assignable to type string #

The "Type 'string | undefined' is not assignable to type string" error occurs when a possibly undefined value is assigned to something that expects a string. To solve the error, use the non-null assertion operator or a type guard to verify the value is a string before the assignment.

Here is an example of how the error occurs.

index.ts
interface Employee { id: number; name?: string; // 👈️ optional (might be undefined) salary: number; } const emp: Employee = { id: 1, name: 'James', salary: 100, }; // ⛔️ Error: Type 'string | undefined' is // not assignable to type 'string'. // Type 'undefined' is not assignable to type 'string'.ts(2322) const name: string = emp.name;

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

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

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

TypeScript is telling us that the emp.name property might have a value of undefined, which is not compatible with the type of the name variable, which only expects a string.

Here are a couple of examples of how you can solve the error.

index.ts
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'James', salary: 100, }; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const name: string = emp.name!; // 👈️ non-null assertion

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.

An alternative and much better approach is to use a type guard.

index.ts
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'James', salary: 100, }; const name: string = emp.name !== undefined ? emp.name : ''; console.log(name); // 👉️ "James"

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

If the property is not equal to undefined, it gets assigned to the name variable, otherwise we use an empty string as a fallback.

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

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: 'James', salary: 100, }; const name: string = emp.name ?? ''; console.log(name); // 👉️ "James"
The nullish coalescing operator (??) enables us to specify a fallback for when a value is null or undefined.

So, if emp.name is null or undefined, we set the name variable to an empty string.

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: 'James', salary: 100, }; const name: string = emp.name || ''; console.log(name); // 👉️ "James"

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).

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: 'James', salary: 100, }; let name = ''; // 👇️ emp.name is string or undefined here if (emp.name !== undefined) { // 👇️ emp.name is string here name = emp.name; } console.log(name); // 👉️ "James"

We used the let keyword to initialize the name variable to an empty string.

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

If nothing of the above works, you can use a type assertion.

index.ts
interface Employee { id: number; name?: string; salary?: number; } const emp: Employee = { id: 1, name: 'James', salary: 100, }; const name: string = emp.name as string; // 👈️ type assertion console.log(name); // 👉️ "James"
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.name will be a string and not to worry about it.

Conclusion #

The "Type 'string | undefined' is not assignable to type string" error occurs when a possibly undefined value is assigned to something that expects a string. To solve the error, use the non-null assertion operator or a type guard to verify the value is a string before the assignment.

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.