как сгенерировать ошибку при деструкции несуществующего ключа - PullRequest
0 голосов
/ 25 апреля 2018

Так что я бы хотел деструктурировать объект и заставить его выдать ошибку, если один из ключей не существует.Я попробовал try catch, но это не сработало.И я бы хотел альтернативу просто if (variable === undefined)

let obj = {test : "test"}

try {
	let { test, asdf } = obj 
  console.log("worked")
}
catch (error) {
	console.error(error)
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Используйте proxy , чтобы выдать ошибку, если извлечено несуществующее свойство

let obj = {
  test: "test"
};

try 
{
    let { test, asdf} = getProxy(obj);
    console.log("worked");
} 
catch (error) 
{
    console.error(error)
}

function getProxy(obj) {
    return new Proxy(obj, { //create new Proxy object
        get: function(obj, prop) { //define get trap
            if( prop in obj )
            {
               return obj[prop];
            }
            else
            {
                throw new Error("No such property exists"); //throw error if prop doesn't exists
            }            
        }
    });
}

Демо

let obj = {
  test: "test"
};

try 
{
    let { test, asdf} = getProxy(obj);
    console.log("worked");
} 
catch (error) 
{
    console.error(error)
}

function getProxy(obj) {
    return new Proxy(obj, {
        get: function(obj, prop) {
            if( prop in obj )
            {
               return obj[prop];
            }
            else
            {
                throw new Error("No such property exists");
            }            
        }
    });
}
0 голосов
/ 25 апреля 2018

try-catch работает для runtime ошибок, перехвата исключений или ошибок, которые вы выдавали явно. Таким образом, при деструктурировании не возникает такая ошибка, когда соответствующий ключ не найден. Чтобы проверить существование, вам нужно явно создать для него проверку. Как то так,

let obj = {test : "test"}
let { test, asdf } = obj 

if(test){
 console.log('worked');
} else {
 console.log('not worked');
}

if(asdf){
 console.log('worked');
} else {
 console.log('not worked');
}

Это потому, что деструктуризация работает так же, как мы присваиваем значение объекта другому значению, например,

let obj = {test : "test"}
var test = obj.test;
var asdf = obj.asdf;

Здесь, выполнение obj.asdf даст вам undefined в asdf и не выдает никаких исключений. Таким образом, вы не можете использовать try-catch для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...