! оператор в машинописи после метода объекта

У меня есть объект X с методом getY() возвращение объекта Y с методом a()в машинописном тексте. Что означает выражение, подобное этому:

X.getY()!.a()

Я думаю, ! Оператор используется для проверки на ноль, но как он работает конкретно? Где определяется язык?

2 ответа

Решение

Он называется "Оператор ненулевого утверждения" и говорит компилятору, что x.getY() не является нулевым

Это новая возможность для машинописного текста 2.0, и вы можете прочитать об этом на новой странице, вот что она говорит:

Новый! Оператор выражения post-fix может использоваться, чтобы утверждать, что его операнд не равен нулю и не определен в контекстах, где средство проверки типов не может прийти к выводу об этом факте. В частности, операция х! создает значение типа x с нулевым и неопределенным исключением. Подобно утверждениям типа форм x и x как T,! ненулевой оператор утверждения просто удаляется в выдаваемом коде JavaScript.

// 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
}

редактировать

Существует проблема с документированием этой функции: Оператор подтверждения ненулевого документа (!)

Ненулевой оператор утверждения:!

  • Вы сообщаете компилятору TS, что значение переменной не
  • Используйте его, когда знаете, чего не хватает компилятору TS.

Вот тривиальный пример того, что он делает:

      let nullable1: null | number;
let nullable2: undefined | string;

let foo  = nullable1! // type foo: number
let fooz = nullable2! // type fooz: string

Он в основном удаляет null | undefined от типа


Когда мне это использовать?

Typescript уже неплохо выводит типы, например, с помощью typeguards:

      let nullable: null | number | undefined;

if (nullable) {
    const foo = nullable; // ts can infer that foo: number, since if statements checks this
}

Однако иногда мы попадаем в следующий сценарий:

      type Nullable = null | number | undefined;

let nullable: Nullable;

validate(nullable);

// Here we say to ts compiler:
// I, the programmer have checked this and foo is not null or undefined
const foo = nullable!;  // foo: number

function validate(arg: Nullable) {
    // normally usually more complex validation logic
    // but now for an example
    if (!arg) {
        throw Error('validation failed')
    }
}

Мой личный совет - по возможности старайтесь избегать этого оператора. Пусть компилятор выполнит статическую проверку вашего кода. Однако есть сценарии, особенно с кодом поставщика, когда использование этого оператора неизбежно.

Другие вопросы по тегам