Type 'null' is not assignable to type 'T'

Typescript

Typescript Problem Overview


I have this generic method

class Foo { 
     public static bar<T>(x: T): T {
         ...
         if(x === null)
             return null; //<------- syntax error
         ...
     }
 }


... //somewhere
const x = Foo.bar<number | null>(1);

I'm getting the syntax error

> TS2322: Type 'null' is not assignable to type 'T'.

I'm expecting this to compile because T could be null.

what is the proper way to solve this problem

Typescript Solutions


Solution 1 - Typescript

You have to declare the return type as null or turn off strictNullChecks in your tsconfig

public static bar<T>(x: T): T | null

or you could type null as any e.g.

 return null as any;

Solution 2 - Typescript

Since version 3.9.5, TypeScript enforces strictNullChecks on numbers and strings just to name a few. For example, the following code will throw an error during compilation:

let x: number = null;

To avoid this error you have two options:

  • Set strictNullChecks=false in tsconfig.json.
  • Declare your variable type as any:
    let x: any = null;
    

Solution 3 - Typescript

You can put

return null!;

It worked for me

Solution 4 - Typescript

I would propose here function overloads in order to remove null case for arguments being non-nullable. Consider:

class Foo { 
    public static bar<T>(x: T): T // overload
    public static bar(x: null): null // overload
    public static bar<T>(x: T) {
        if (x === null) {
            return null;
        } else
            return x;
     }
 }

const x = Foo.bar(1 as number); // x is number, never a null
const y = Foo.bar(null); // its null
const z = Foo.bar('s' as string | null); // its string | null

So the implementation has type T | null but thanks to overload for types which are never null we have return type of T so without the null possibility.

Solution 5 - Typescript

Instead of null assign undefined to the variables.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAli FarisView Question on Stackoverflow
Solution 1 - TypescriptMurat KaragözView Answer on Stackoverflow
Solution 2 - TypescriptHamfriView Answer on Stackoverflow
Solution 3 - TypescriptOmar RBView Answer on Stackoverflow
Solution 4 - TypescriptMaciej SikoraView Answer on Stackoverflow
Solution 5 - TypescriptRamin ArView Answer on Stackoverflow