Как запретить невалидные сравнения в if?

В TypeScript невалидные сравнения в условных операторах if можно запретить с помощью строгой проверки типов (strictNullChecks) и использования пользовательских типов данных.

Строгая проверка типов - это флаг компилятора TypeScript, который позволяет предотвратить множество ошибок связанных с присваиванием значения null или undefined. Она включается в файле tsconfig.json установкой значения "strictNullChecks" в true:

{
  "compilerOptions": {
    "strictNullChecks": true
  }
}

Это позволяет TypeScript отлавливать случаи, когда значения типа null или undefined могут быть не заданы в условном операторе if.

Например, рассмотрим такой код:

let foo: string | null = "hello";

if (foo) {
  console.log(foo.length);
}

В данном случае TypeScript не сгенерирует ошибку, так как значение переменной foo не является ни null, ни undefined.

Однако, если значение foo будет являться null или undefined, TypeScript сгенерирует ошибку:

let foo: string | null = null;

if (foo) {
  console.log(foo.length); // Ошибка: Невозможно получить свойство length у значения типа null
}

Кроме того, для более продвинутых проверок в TypeScript можно использовать пользовательские типы данных с использованием интерфейсов или типов.

Например, можно определить пользовательский тип данных с именем NotNull, который строго исключает значения null и undefined:

type NotNull<T> = T extends null | undefined ? never : T;

let foo: NotNull<string> = "hello";

if (foo) {
  console.log(foo.length);
}

let bar: NotNull<string | null> = null;

if (bar) {
  console.log(bar.length); // Ошибка: Невозможно получить свойство length у значения типа null
}

Таким образом, через использование строгой проверки типов и пользовательских типов данных в TypeScript можно запретить невалидные сравнения в условных операторах if, и это поможет предотвратить множество ошибок во время компиляции кода.