typescript 类型“null”不能赋值给类型“T”

jm81lzqq  于 2022-12-27  发布在  TypeScript
关注(0)|答案(7)|浏览(486)

我有一个泛型方法

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
解决这个问题的正确方法是什么

tpgth1q7

tpgth1q71#

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

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

或者您可以键入null as any,例如

return null as any;
bjg7j2ky

bjg7j2ky2#

从版本3.9.5开始,TypeScript会在numbersstrings上强制strictNullChecks。例如,下面的代码将在编译期间抛出错误:

let x: number = null;

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

  • tsconfig.json中设置strictNullChecks=false
  • 将变量类型声明为any
let x: any = null;
pgpifvop

pgpifvop3#

你可以把

return null!;

对我很有效

oipij1gg

oipij1gg4#

我在这里建议使用函数重载来消除参数不可为空的情况。

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,但由于类型重载从不为空,因此返回类型为T,因此不存在空的可能性。

mec1mxoz

mec1mxoz5#

我也遇到过同样的问题,我发现这实际上是关于 typescript 当前的局限性。
当前无法通过检查类似value的值来缩小类似T的类型参数的范围。
参见https://stackoverflow.com/a/68898908/10694438

bq3bfh9z

bq3bfh9z6#

年份:数量;月份:编号;
构造函数(专用路由:ActivatedRoute){ }
ngOnInit(){让参数=这个.路由.快照.参数Map;此年份= +参数.get('年份')!这个月= +参数.get('月')!;
}

j13ufse2

j13ufse27#

将变量赋值为undefined,而不是null

相关问题