Type 'string or null' is not assignable to type string (TS)

avatar

Borislav Hadzhiev

Mon Mar 07 20224 min read

Type 'string or null' is not assignable to type string (TS) #

The "Type 'string | null' is not assignable to type string" error occurs when a possibly null value is assigned to something that expects a string. To solve the error, use a non-null assertion 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 | null; } const emp: Employee = { id: 1, name: 'Tom', }; // ⛔️ Error: Type 'string | null' is // not assignable to type 'string'. // Type 'null' is not assignable to type 'string'.ts(2322) const name: string = emp.name;

The name property in the Employee interface has a type of string | null.

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

TypeScript is basically telling us that the emp.name property might have a value of null, 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 | null; } const emp: Employee = { id: 1, name: 'Tom', }; // 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.

This is very similar to a type assertion and should only be used when you're absolutely sure that the value is of the expected type.

index.ts
interface Employee { id: number; name: string | null; } const emp: Employee = { id: 1, name: 'Tom', }; const name: string = emp.name as string; // 👈️ type assertion console.log(name); // 👉️ "Tom"

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.

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

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

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

If the property is not equal to null, 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 null.

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

index.ts
interface Employee { id: number; name: string | null; } const emp: Employee = { id: 1, name: 'Tom', }; const name: string = emp.name ?? ''; console.log(name); // 👉️ "Tom"

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 | null; } const emp: Employee = { id: 1, name: 'Tom', }; const name: string = emp.name || ''; console.log(name); // 👉️ "Tom"

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 | null; } const emp: Employee = { id: 1, name: 'Tom', }; let name = ''; if (emp.name !== null) { name = emp.name; } console.log(name); // 👉️ "Tom"

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 null and assign the name variable to the corresponding value.

The cause of the "Type 'string | null' is not assignable to type string" error is that the types of the values on the left an right hand sides are not compatible.

So depending on your use case, you could solve the error by updating the type of the value to the left or right and making them compatible.

index.ts
interface Employee { id: number; name: string | null; } const emp: Employee = { id: 1, name: 'Tom', }; // 👇️ const name: string | null const name: string | null = emp.name; console.log(name); // 👉️ "Tom"

We explicitly set the type of the name variable to be string | null, which is the same type as the type of the name property in the Employee interface.

Use the search field on my Home Page to filter through my more than 1,000 articles.