Это определено в спецификации необязательной цепочки ECMAScript, поэтому, вероятно, нам следует обратиться к необязательной цепочке, когда мы обсудим это. Вероятная реализация:
const result = a?.b?.c;
Суть этого в том, что команда TypeScript ждет ужесточения спецификации ECMAScript, поэтому их реализация в будущем может быть непоколебимой. Если бы они внедрили что-то сейчас, в конечном итоге потребовались бы серьезные изменения, если бы ECMAScript переопределил их спецификацию.
См. Дополнительную спецификацию цепочки
Там, где что-то никогда не будет стандартным JavaScript, команда TypeScript может реализовать по своему усмотрению, но для будущих дополнений ECMAScript они хотят сохранить семантику, даже если они предоставляют ранний доступ, как и для многих других функций.
Короткие сокращения
Таким образом, доступны все классные операторы JavaScripts, включая преобразования типов, такие как ...
var n: number = +myString; // convert to number
var b: bool = !!myString; // convert to bool
Ручное решение
Но вернемся к вопросу. У меня есть тупой пример того, как вы можете сделать подобное в JavaScript (и, следовательно, в TypeScript), хотя я определенно не предполагаю, что это изящная функция, которая вам действительно нужна.
(foo||{}).bar;
Так что, если foo
есть undefined
результат , undefined
и если foo
определена и имеет свойство с именем , bar
который имеет значение, в результате чего значение.
Я положил пример на JSFiddle .
Это выглядит довольно схематично для более длинных примеров.
var postCode = ((person||{}).address||{}).postcode;
Функция цепи
Если вы отчаянно нуждаетесь в более короткой версии, пока спецификация находится в стадии разработки, в некоторых случаях я использую этот метод. Он вычисляет выражение и возвращает значение по умолчанию, если цепочка не может быть удовлетворена или заканчивается null / undefined (обратите внимание, что !=
здесь важно, мы не хотим использовать, так !==
как мы хотим немного положительного жонглирования здесь).
function chain<T>(exp: () => T, d: T) {
try {
let val = exp();
if (val != null) {
return val;
}
} catch { }
return d;
}
let obj1: { a?: { b?: string }} = {
a: {
b: 'c'
}
};
// 'c'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {
a: {}
};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = {};
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));
obj1 = null;
// 'Nothing'
console.log(chain(() => obj1.a.b, 'Nothing'));