#typescript #optional-chaining
Вопрос:
Я работаю над приложением Angular2 и часто сталкиваюсь со следующей проблемой: у меня есть объект определенного типа , который может быть undefined
, и мне нужно присвоить свойства этого объекта нескольким переменным или другим свойствам объекта, поэтому я обычно использую необязательный оператор цепочки, чтобы проверить, существует ли такой объект:
observable$.subscribe((object: SomeInterface | undefined) => {
this.var1 = object?.prop1;
this.var2 = object?.prop2;
this.var3 = object?.prop3;
});
Но я всегда чувствую, что делаю много ненужных проверок, и я думаю, что, возможно, мне следует использовать оператор if в этом случае, например:
observable$.subscribe((object: SomeInterface | undefined) => {
if (object) {
this.var1 = object.prop1;
this.var2 = object.prop2;
this.var3 = object.prop3;
}
});
Но в этом случае я чувствую, что читать код может быть сложнее?
Поэтому, я думаю, мой вопрос в том, что более эффективно (я думаю, второй вариант?) и что лучше использовать с точки зрения читаемости кода?
Комментарии:
1. Я предпочитаю второй подход для удобства чтения. Второе также, вероятно, более эффективно, но это почти наверняка не имеет значения
2. «Я чувствую, что читать код может быть сложнее» — Что в этом сложного ?
if
3. Может быть, я привел плохой пример, но если нам нужно присвоить четвертой переменной какое-то подпространство, например
this.var4 = object.prop4.subprop1
, и так далее, чем нам нужно писать дополнительныеif
операторы, и код может стать более сложным? Или, может быть, я просто выдумываю это4. Я думаю, что один if-это нормально, но я бы не стал использовать несколько операторов if. На мой взгляд, необязательный подход к цепочке предпочтительнее, когда вы имеете дело с глубоко вложенными свойствами, которые являются независимыми. Т. е. некоторые из них могут присутствовать, а другие-нет. В случае, когда у вас есть все или ничего, именно здесь я нахожу единственную группу if более читаемой.
Ответ №1:
Определенно идите на второй подход. Одно утверждение if намного лучше, чем проверка каждой опоры.
Если вы беспокоитесь о удобочитаемости, вы можете написать это следующим образом
object amp;amp; (this.var1 = object.prop1, this.var2 = object.prop2, this.var3 = object.prop3);
Но, с моей точки зрения, читаемость та же самая.
Ответ №2:
Я знаю, что это может быть не то, что вы хотите в данном случае, но мне всегда нравится выступать за использование операторов труб RxJS.
observable$.pipe(filter(o => !!o)).subscribe((object: SomeInterface) => {
this.var1 = object.prop1;
this.var2 = object.prop2;
this.var3 = object.prop3;
});