Tengo este método genérico.
class Foo { public static bar<T>(x: T): T { ... if(x === null) return null; //<------- syntax error ... } } ... //somewhere const x = Foo.bar<number | null>(1);me sale el error de sintaxis
TS2322: el tipo 'null' no se puede asignar al tipo 'T'.
Espero que esto se compile porque T podría ser null .
cual es la forma correcta de resolver este problema
Debe declarar el tipo de devolución como null o desactivar los controles estrictos de Null en su strictNullChecks
public static bar<T>(x: T): T | null o puede escribir nulo as any por ejemplo
return null as any;Propondría aquí sobrecargas de funciones para eliminar el caso nulo de los argumentos que no aceptan valores NULL. Considerar:
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 Entonces la implementación tiene tipo T | null , pero gracias a la sobrecarga de tipos que nunca son nulos, tenemos el tipo de retorno de T , por lo que sin la posibilidad nula.
Desde la versión 3.9.5, TypeScript aplica strictNullChecks en numbers y strings , solo por nombrar algunos. Por ejemplo, el siguiente código generará un error durante la compilación:
let x: number = null;Para evitar este error tienes dos opciones:
strictNullChecks=false en tsconfig.json .any : let x: any = null;En lugar de null , asigne undefined a las variables.
Puedes poner
return null!;funcionó para mí