类型 'null' 不能分配给类型 'T'

Ali*_*Ali 51 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);
Run Code Online (Sandbox Code Playgroud)

我收到语法错误

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

我期待这个编译,因为T可能是null.

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

Mur*_*göz 102

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

public static bar<T>(x: T): T | null
Run Code Online (Sandbox Code Playgroud)

或者你可以输入 nullas any例如

 return null as any;
Run Code Online (Sandbox Code Playgroud)


Ham*_*fri 24

自从3.9.5版本,打字稿强制执行strictNullChecksnumbers,并strings只是仅举几例。例如,下面的代码在编译时会抛出错误:

let x: number = null;
Run Code Online (Sandbox Code Playgroud)

为避免此错误,您有两个选择:

  • 删除检查并不能解决如何修复它的问题。这就像从烟雾报警器中取出电池一样。 (25认同)
  • 使用“any”本质上是删除类型检查,所以是的,这不是一个好的解决方案。将其声明为`number | null` 如果你需要具体。 (2认同)

Oma*_* RB 18

你可以把

return null!;
Run Code Online (Sandbox Code Playgroud)

这对我有用

  • 介意对此进行更多解释吗? (6认同)
  • 我认为这是因为你用 ! 断言类型 象征。有时您可以使用此符号来断言您有一个值,例如,当您有一个可能尚未初始化的类时,您可以使用 class!.something 告诉编译器您确定它已被初始化。你可能会得到一个运行时错误 (2认同)