Typescript代码可以工作,但抛出的对象可能是未定义的错误

Typescript代码可以工作,但抛出的对象可能是未定义的错误,typescript,visual-studio-code,typescript-3.6,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 capac

我试图在我的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);
    }
if(signals.get(sender.id)?.size()
我得到的对象可能是“未定义的”。错误,尽管我用
if(signals.get(sender.id)==undefined)signals.set(sender.id,init)检查并初始化了它

但当我用log控制它时,它就工作了。。。如何解决此问题

if(signals.get(sender.id)?.size() 问题是,使用安全访问操作符(
)可以告诉编译器,
signals.get(sender.id)?.size()
可以是未定义的。因此,可以将此未定义的值与
进行比较
if(signals.get(sender.id)?.size()

问题是,使用安全访问操作符(
)告诉编译器,
signals.get(sender.id)?.size()
可以是未定义的。因此,您会将此未定义的值与
进行比较,我很困惑,什么对象可能是“未定义的”?从signals.get(sender.id)返回的队列假设
signals
是一个
Map
,您应该1)使用
signals.has(sender.id)
检查键是否存在,2)如果
has
返回true,那么您应该调用
get
一次并将返回的对象保存在变量中,不要使用同一个键多次调用
get
。我尝试了if(signals.has)(sender.id){并将我的if块移到了这里}但它又说了同样的话。这太奇怪了。而且我的数据总是在流动,并且发送者会立即更改。我很困惑,什么对象可能是“未定义的”?从信号返回的队列。get(sender.id)假设
信号
是一个
映射
,你应该1)使用
信号(sender.id)
要检查键是否存在,以及2)如果
has
返回true,则应调用
get
一次并将返回的对象保存在变量中,不要使用同一键多次调用
get
。我尝试了if(signals.has(sender.id)){并将if块移到此处}但它又说了同样的话。这太奇怪了。而且我的数据总是在流动,发送者也在瞬间改变。实际上,它是自动放置的。当我删除它并尝试if(lastSignals.get(message.nodeId)!=undefined&&lastSignals.has(message.nodeId)){我的if块像if(lastSignals.get(message.nodeId).size()