Typescript 强制使用空值

Typescript 强制使用空值,typescript,Typescript,我想要一个可以是数字或null的变量。这一点是在某些时候重置变量(通过将其设置为null)。问题是,如果我用类型number | null声明变量,我不能像使用数字一样使用它,因为我知道它是一个数字 代码如下: class Test { start: number | null = null; handler(e: Event) { if (this.start === null) { this.start = Date.now();

我想要一个可以是数字或null的变量。这一点是在某些时候重置变量(通过将其设置为null)。问题是,如果我用类型
number | null
声明变量,我不能像使用数字一样使用它,因为我知道它是一个数字

代码如下:

class Test {
    start: number | null = null;

    handler(e: Event) {
        if (this.start === null) {
            this.start = Date.now();
        }

        let time = Date.now() - this.start;
        if (time < 1000) {
            this.start = null;
        }
        // ...
    }
}
类测试{
开始:数字|空=空;
处理程序(e:事件){
if(this.start==null){
this.start=Date.now();
}
让time=Date.now()-this.start;
如果(时间<1000){
this.start=null;
}
// ...
}
}

编译器说
this.start
“可能为空”。我怎么能说它是对的?否则,我的模式就是问题所在吗?我是否应该改为使用布尔属性
hasStarted
使
start
始终是一个数字(或未定义的btw)?

start:number | null
更改为
start?:number
,让编译器知道它有时可能为null,并且您将处理它

您使用的是什么版本的TypeScript?在3.3.3中,我没有看到这个错误。事实上,即使在2.4.1中,我也没有看到这个错误。在任何情况下,您都可以断言该值不为null,例如
Date.now()-this.start考虑编辑您的代码以构成一个完整的代码,以便其他人可以帮助您。就目前情况而言,没有显示任何此类错误。这实际上并没有回答问题。类型声明很好;OP想知道如何避免“可能为空”警告。另外,
start?:number
实际上意味着
start:number |未定义
,而不是
start:number | null
,这是一个重要的区别。(不是我的反对票,顺便说一句)是的,这就是你避免警告的方式。要么这样,要么压制他们。但是,如果你对警告感到惊讶,为什么你一开始就使用TS呢?如果您希望Typescript不具备Typescript的优点,那么它已经存在,并且被称为Javascript。OP所说的警告将出现在
Date.now()-this.start
(您必须删除它上面的
If(this.start==null)
,以重现警告,因为OP的代码示例可能不完整)。这个答案根本没有提到这个警告,实际上会在
This.start=null
行引入一个新的警告,因为我在前面的评论中提到了这一点。