const id = myMap.has(key) ? myMap.get(key) : "defaultValue"
if (id.includes("stuff")) { // Compiler complains saying "Object is possibly undefined"
Я не понимаю, как этот объект может быть неопределенным. Если у него есть ключ, он получает значение. Если это не так, результатом будет "defaultValue". Это должно охватывать все случаи, почему это жалуется?
@JaredSmith Я стараюсь избегать использования постфиксного оператора !
, потому что хочу, чтобы компилятор выполнял свою работу, но если myMap
определяется мной со списком констант и никогда не будет содержать undefined
, то, может быть, этот вариант использования оправдан?
It should cover all cases
Это не так:
const myMap = new Map<string, any>();
myMap.set("stuff", undefined);
const id = myMap.has(key) ? myMap.get(key) : "defaultValue";
id.includes("default"); // BOOM!
Обратите внимание, что лучше не станет, если мы избежим any
. Вы всегда можете вызвать его с неизвестным строковым ключом во время выполнения, который знает компилятор, и у него нет возможности проверить, что доступ всегда действителен.
Я пытаюсь избежать использования постфиксного оператора! потому что я хочу, чтобы компилятор делал свою работу, но если myMap определяется мной со списком констант и никогда не будет содержать undefined, то, может быть, этот вариант использования оправдан?
Если оно действительно константное, то используйте объект вместо карты и тогда вам вообще не придется делать условную проверку (какой должен будет лишним, если данные действительно константные). Вы правы, что использование постфиксного оператора — плохая привычка. Если это не совсем константа, вы можете просто сделать это, что безопасно: id?.includes("stuff")
const myMap = new Map(); myMap.set("stuff", undefined);
. Ну,myMap
определенно имеет этого ключа, и значение действительноundefined
.