打字稿代码有效,但抛出对象可能是未定义的错误

时间:2020-08-26 12:05:35

标签: typescript visual-studio-code typescript-3.6

我正在尝试在我的Typescript类中实现队列结构。我有一个队列课程。

class Queue implements IQueue {

private storage: number[] = [];

constructor(private capacity: number = 3) {}

enqueue(rssi: number){
    if(this.size() == this.capacity) throw new Error("Has reached max capacity");
    this.storage.push(rssi);        
}

dequeue(): number | undefined{
    return this.storage.shift();

}

size(): number{
    return this.storage.length;
}

signalMean(): number{
    var mean: number = 0;
    this.storage.forEach(rssi => mean = mean + rssi);
    return mean;
}

}

所以我尝试初始化队列:

var init = new Queue(3);

并在此处使用它

if(signals.get(sender.id) == undefined) signals.set(sender.id, init); 

当我尝试添加以下代码时:

  if(signals.get(sender.id)?.size() < signals.get(sender.id).capacity) {
        signals.get(sender.id).enqueue(sender.signal);
    } else {
        signals.get(sender.id).dequeue();
        signals.get(sender.id).enqueue(sender.signal);
    }

我得到的对象可能是'undefined'。错误,尽管我用if(signals.get(sender.id) == undefined) signals.set(sender.id, init);行检查并初始化了它。

但是当我使用日志控制它时,它可以工作...如何解决此问题?

1 个答案:

答案 0 :(得分:0)

if(signals.get(sender.id)?. size()

问题是,使用safe-access-operator(?)告诉编译器,signals.get(sender.id)?.size()可能是未定义的。结果,您可以将此不确定的值与<运算符进行比较。最简单的解决方法是删除安全访问操作员并分别处理不存在的情况。