Typescript поддерживает? оператор? (И как это называется?)

85

Использует ли Typescript (или планирует ли он) поддерживать безопасную навигацию оператора ?.

т

var thing = foo?.bar
// same as:
var thing = (foo) ? foo.bar : null;

Кроме того, существует ли более распространенное имя для этого оператора (для него не всегда сложно использовать Google).

  • 0
    Я не знаком с этим оператором, но вы имели в виду, что var thing = foo?.bar - это то же самое, что var thing = (foo) ? foo.bar : null ? Другими словами, если (foo), то foo.bar, иначе null.
  • 0
    @ Mathew Да. Другой пример: println company?.address?.street?.name где company , address или street могут быть нулевыми, что означает, что оператор возвращает null .
Показать ещё 8 комментариев
Теги:

7 ответов

43
Лучший ответ

Я не могу найти никакой ссылки на него в TypeScript спецификация языка.

Что касается вызова этого оператора в CoffeeScript, он называется экзистенциальным оператором (в частности, "вариантом доступа" экзистенциального оператора).

Из Документация CoffeeScript для операторов:

Вариант доступа экзистенциального оператора ?. может использоваться для вставки нулевых ссылок в цепочке свойств. Используйте его вместо точки доступа . в тех случаях, когда базовое значение может быть null или undefined.

Таким образом, вариант варианта доступа экзистенциального оператора представляется правильным способом обращения к этому оператору; и TypeScript в настоящее время не поддерживает его (хотя другие выразили желание этой функции).

  • 12
    msgstr "вариант доступа экзистенциального оператора". Естественно. Так броско, что почти невозможно забыть. :). Спасибо за очень тщательный ответ.
  • 0
    @MartyPitt Конечно! Я согласен, я хотел бы видеть а) более широкое принятие такого оператора (C #, пожалуйста!) И б) более подходящее имя (у оператора "безопасной навигации" из вашего связанного поста в блоге есть приятное звучание).
Показать ещё 5 комментариев
64

Не так хорошо, как сингл?, но он работает:

var thing = foo && foo.bar || null;

Вы можете использовать как можно больше && как вам нравится:

var thing = foo && foo.bar && foo.bar.check && foo.bar.check.x || null;
  • 23
    && оценивает, пока утверждение верно. Если это правда, он возвращает последнее значение. Если это false, он возвращает первое значение, которое оценивается как false. Это может быть 0, ноль, ложь и т. Д. || возвращает первое значение, которое оценивается как true.
  • 19
    Не работает, если бар определен, но оценивается как ложное (например, логическое ложное или ноль).
28

На github есть открытый запрос функции, где вы можете озвучить свое мнение/желание: https://github.com/Microsoft/TypeScript/issues/16

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;
  • 1
    интересно, но в моем случае (this.loop || {}).nativeElement говоря, что Property 'nativeElement' does not exist on type '{}'. any this.loop typeof angular.io/api/core/ElementRef
  • 0
    @Kuncevic - вам нужно либо ... 1) предоставить совместимое значение по умолчанию вместо {} , либо 2) использовать утверждение типа, чтобы заставить компилятор замолчать.
Показать ещё 4 комментария
9

Изменить: Я обновил ответ благодаря комментарию 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
}
  • 4
    Не такой как ? потому что он утверждает, что значение определено. ? как ожидается, молча провалится / оценит как ложное. Во всяком случае, приятно знать.
  • 0
    ООО Спасибо. Позвольте мне редактировать!
Показать ещё 2 комментария
6

Как только я не смог найти ничего подобного в 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.

  • 1
    Это именно то, что я искал! Работает в машинописи 2.1.6.
  • 2
    или вы можете назвать это elvis<T> ;-)
Показать ещё 1 комментарий
2

Мы создали этот метод 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);
  • 0
    Здорово!! Есть ли какие-то предостережения? У меня есть класс-оболочка с примерно 20 геттерами для записи, каждый из которых имеет следующий тип возврата - и все поля должны быть проверены на нулевое значение return this.entry.fields.featuredImage.fields.file.url;
  • 0
    Единственное предостережение, возможно, может повлиять на производительность, но я не квалифицирован, чтобы говорить о том, как различные JITers справляются с этим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню