Использует ли Typescript (или планирует ли он) поддерживать безопасную навигацию оператора ?.
т
var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;
Кроме того, существует ли более распространенное имя для этого оператора (для него не всегда сложно использовать Google).
Я не могу найти никакой ссылки на него в TypeScript спецификация языка.
Что касается вызова этого оператора в CoffeeScript, он называется экзистенциальным оператором (в частности, "вариантом доступа" экзистенциального оператора).
Из Документация CoffeeScript для операторов:
Вариант доступа экзистенциального оператора
?.
может использоваться для вставки нулевых ссылок в цепочке свойств. Используйте его вместо точки доступа.
в тех случаях, когда базовое значение может быть null или undefined.
Таким образом, вариант варианта доступа экзистенциального оператора представляется правильным способом обращения к этому оператору; и TypeScript в настоящее время не поддерживает его (хотя другие выразили желание этой функции).
Не так хорошо, как сингл?, но он работает:
var thing = foo && foo.bar || null;
Вы можете использовать как можно больше && как вам нравится:
var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;
На github есть открытый запрос функции, где вы можете озвучить свое мнение/желание: https://github.com/Microsoft/TypeScript/issues/16
Мне было интересно прочитать об этом операторе, короткая нулевая проверка довольно крутая, особенно с длинной цепочкой.
TypeScript не поддерживает его, главным образом потому, что JavaScript не имеет этой функции. TypeScript в его текущей форме есть JavaScript плюс некоторые функции ECMAScript 6, а также несколько дополнительных функций (к которым, к примеру, скоро будут добавлены дженерики).
Таким образом, доступны все java-скрипты 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;
(this.loop || {}).nativeElement
говоря, что Property 'nativeElement' does not exist on type '{}'. any
this.loop
typeof angular.io/api/core/ElementRef
{}
, либо 2) использовать утверждение типа, чтобы заставить компилятор замолчать.
Изменить: Я обновил ответ благодаря комментарию fracz.
TypeScript 2.0 выпущен !.
Это не то же самое, что ?.
(безопасный навигатор на С#)
См. этот ответ для получения более подробной информации:
https://stackoverflow.com/questions/38874928/operator-in-typescript-after-object-method
Это говорит только компилятору, что значение не равно null или undefined. Это будет не, если значение равно null или undefined.
TypeScript Оператор ненулевого утверждения
// Compiled with --strictNullChecks
function validateEntity(e?: Entity) {
// Throw exception if e is null or invalid entity
}
function processEntity(e?: Entity) {
validateEntity(e);
let s = e!.name; // Assert that e is non-null and access name
}
?
потому что он утверждает, что значение определено. ?
как ожидается, молча провалится / оценит как ложное. Во всяком случае, приятно знать.
Как только я не смог найти ничего подобного в TypeScript, Я использую следующую функцию:
export function o<T>(someObject: T, defaultValue: T = {} as T) : T {
if (typeof someObject === 'undefined' || someObject === null)
return defaultValue;
else
return someObject;
}
использование выглядит следующим образом:
o(o(o(o(test).level1).level2).level3
плюс, вы можете установить значение по умолчанию:
o(o(o(o(o(test).level1).level2).level3, "none")
Он отлично работает с IntelliSense в Visual Studio.
elvis<T>
;-)
Мы создали этот метод util при работе над Phonetradr, который может предоставить вам безопасный доступ к глубоким свойствам с помощью Typescript:
/**
* Type-safe access of deep property of an object
*
* @param obj Object to get deep property
* @param unsafeDataOperation Function that returns the deep property
* @param valueIfFail Value to return in case if there is no such property
*/
export function getInSafe<O,T>(obj: O, unsafeDataOperation: (x: O) => T, valueIfFail?: any) : T {
try {
return unsafeDataOperation(obj)
} catch (error) {
return valueIfFail;
}
}
//Example usage:
getInSafe(sellTicket, x => x.phoneDetails.imeiNumber, '');
//Example from above
getInSafe(foo, x => x.bar.check, null);
return this.entry.fields.featuredImage.fields.file.url;
var thing = foo?.bar
- это то же самое, чтоvar thing = (foo) ? foo.bar : null
? Другими словами, если (foo), то foo.bar, иначе null.println company?.address?.street?.name
гдеcompany
,address
илиstreet
могут быть нулевыми, что означает, что оператор возвращаетnull
.