Undefined примитивный неопределенный тип

Примитивный тип undefined указывает на то, что значение не определено. Тип данных undefined указывается с помощью ключевого слова undefined (не путать со свойством глобального объекта undefined, которое представляет единственное значение типа Undefined).

let identifier: undefined = undefined; // undefined, указанный после оператора двоеточия, это имеющийся только в TypeScript псевдоним (alias) для глобального типа Undefined. 

В то время как undefined, указанный после оператора присваивания, это единственное значение типа Undefined. Во время выполнения объявленные, но не инициализированные переменные, поля и свойства класса, а также параметры имеют значение undefined. Также значение undefined является результатом вызова методов или функций, которые не возвращают значения.

Тип undefined является подтипом всех типов, что делает его совместимым со всеми остальными типами.

class TypeSystem {
  static any: any = undefined; // Ok
  static number: number = undefined; // Ok
  static string: string = undefined; // Ok
  static boolean: boolean = undefined; // Ok
  static null: null = undefined; // Ok
  static undefined: undefined = undefined; // Ok
}

Может возникнуть вопрос, почему тип null, который не имеет непосредственного отношения к типу undefined, совместим с ним? На данный момент, этот вопрос так и остается неразгаданным.

В то время как тип данных undefined совместим со всеми типами, помимо него самого, с ним совместимы лишь null и any.

TypeSystem.undefined = TypeSystem.any; // Ok
TypeSystem.undefined = TypeSystem.number; // Error
TypeSystem.undefined = TypeSystem.string; // Error
TypeSystem.undefined = TypeSystem.boolean; // Error
TypeSystem.undefined = TypeSystem.null; // Ok

Тогда, когда тип данных undefined указывается не явно, компилятор устанавливает тип any.

let identifier = undefined; // identifier: any

При активном флаге –strictNullChecks, тип undefined является подтипом только одного типа any. Поэтому ему в качестве значения, помимо самого себя, можно присвоить только тип any.

class TypeSystem {
  static any: any = undefined; // Ok
  static number: number = undefined; // Error
  static string: string = undefined; // Error
  static boolean: boolean = undefined; // Error
  static null: null = undefined; // Error
  static undefined: undefined = undefined; // Ok
}
 
TypeSystem.undefined = TypeSystem.any; // Ok
TypeSystem.undefined = TypeSystem.number; // Error
TypeSystem.undefined = TypeSystem.string; // Error
TypeSystem.undefined = TypeSystem.boolean; // Error
TypeSystem.undefined = TypeSystem.null; // Error

При активном флаге –strictNullChecks, при условии, что в качестве значения выступает значение undefined, вывод типов определяет принадлежность к типу undefined.

let identifier = undefined; // identifier: undefined

Тип undefined идентичен по своей работе с одноимённым типом из JavaScript.