类型“ null”不可分配给类型“ T”

时间:2020-01-13 10:48:34

标签: typescript

我有这种通用方法

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


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

我遇到语法错误

TS2322:类型“ null”不可分配给类型“ T”。

我希望它可以编译,因为T可能是null

什么是解决此问题的正确方法

5 个答案:

答案 0 :(得分:25)

您必须在tsconfig中将返回类型声明为null或关闭strictNullChecks

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

或者您可以输入空as any,例如

 return null as any;

答案 1 :(得分:6)

在打字稿上> = 3.9.5打字稿仅对一些数字和字符串强制执行strictNullChecks。在此示例中,我将使用变量x进行演示。 让x:number = null; 会在打字稿编译期间引发错误。为避免此错误,您有两种选择:

(1) set strictNullChecks=false in tsconfig.json
(2) or declare your variable type as any. let x: any = null;

答案 2 :(得分:1)

我会在这里建议函数重载,以消除参数不可为空的空情况。考虑:

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

因此,实现的类型为T | null,但是由于对永不为null的类型进行了重载,我们返回了T的类型,所以没有null的可能性。

答案 3 :(得分:0)

你可以放

return null!;

它对我有用

答案 4 :(得分:-4)

null 分配给变量而不是 undefined