我有这种通用方法
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
。
什么是解决此问题的正确方法
答案 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
。