Ошибка Typescript TS2532 при доступе к защищенной карте

#typescript

#typescript

Вопрос:

Typescript помечает как ошибку TS2532 оба conn.get(aa) ниже. Но оба доступа защищены, if(conn.has(aa)) поэтому я делаю вывод, что get это допустимо и не определено.

 const conn: Map<string, {from: string[]; to: string[]}> = new Map();
const aa = "aa";
if(conn.has(aa)) conn.get(aa).to.push("bb");

conn.set("aa", {from: [], to: []});
if(conn.has(aa)) conn.get(aa).to.push("bb");
  

Даже если я проверю наличие подобного:

 if(conn.has(aa) amp;amp; conn.get(aa)) conn.get(aa).to.push("bb");
  

typescript выдает ошибку на conn.get(aa) . Где скрытая проблема, которую я не вижу? Спасибо!

Комментарии:

1. Что ж, без тщательной проверки с помощью has(key) это, похоже, соответствует потоку управления typescript: const getaa = conn.get(aa); if(getaa) getaa.to.push("bb"); Это приемлемое решение?

Ответ №1:

Проблема в том, что conn.has(aa) это функция javascript, а conn.get(aa) type — функция TypeScript. Поэтому вы не можете использовать has, чтобы гарантировать, что get вернет не неопределенное значение.

Вы должны указать get после if, это не внесло бы изменений в пакет, но сообщило бы компилятору, что значение было проверено (conn.get(aa)!).to

Комментарии:

1. Теперь понятно! Я думал о какой-то связи между has и get. Таким образом, дружественное ‘!’ или проверка непосредственно get являются решением. Спасибо!