! оператор в машинописи после метода объекта
У меня есть объект 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')
}
}
Мой личный совет - по возможности старайтесь избегать этого оператора. Пусть компилятор выполнит статическую проверку вашего кода. Однако есть сценарии, особенно с кодом поставщика, когда использование этого оператора неизбежно.