Что такое рефлексия в TypeScript

Ответ

Рефлексия в TypeScript — это возможность анализировать и изменять структуру объектов во время выполнения. Однако, в отличие от языков с полной рефлексией (например, Java), TypeScript ограничен из-за компиляции в JavaScript.

Основные возможности:

  • Проверка типов через typeof, instanceof
  • Получение информации о типах через декораторы или метаданные (с emitDecoratorMetadata: true)

Пример с декораторами:

function logType(target: any, key: string) {
  const type = Reflect.getMetadata("design:type", target, key);
  console.log(`${key} type: ${type.name}`);
}

class Example {
  @logType
  public name: string = "test";
}
// Выведет: "name type: String"

Важно: рефлексия в TypeScript работает только с включенными флагами компилятора и имеет ограничения, так как типы стираются при компиляции.

Ответ 18+ 🔞

А, рефлексия в TypeScript, говоришь? Ну это такая штука, чтобы во время работы программы, как в зеркало, на свои же объекты посмотреть — что внутри, из чего состоят. Но тут, блядь, есть нюанс, ёпта!

TypeScript — он же в итоге в JavaScript превращается, а там про типы все похуй, они просто стираются, как ластиком. Получается, мы хотим рефлексии, а нам — хуй с горы. Не как в этих ваших Java, где можно всё насквозь просветить.

Но кое-что выцарапать можно, не без этого:

  • Простые проверки: typeof, instanceof — это наше всё, родное, ясное. «Ты кто такой? А, строка? Иди нахуй, работай».
  • Хитрый манёвр с декораторами: Вот тут уже интереснее, можно кое-какие метаданные о типах прилепить, если компилятору правильную кнопку нажать (emitDecoratorMetadata: true). Без этого флага — нихуя не получится, имей в виду!

Смотри, как примерно выглядит этот цирк:

function logType(target: any, key: string) {
  // А теперь, сука, достаём из тайников то, что компилятор любезно припрятал
  const type = Reflect.getMetadata("design:type", target, key);
  console.log(`${key} type: ${type.name}`);
}

class Example {
  @logType // Вешаем наш шпионский декоратор
  public name: string = "test";
}
// Выведет в консоль: "name type: String"

Видал? Тип string превратился в String. Это уже что-то! Но это работает, повторюсь, только если ты компилятор заранее подготовил, как того коня под японского императора. И то — не всё, что захочешь, увидишь. Ограничения, блядь, на каждом шагу.

Короче, инструмент есть, но он не волшебный. Хочешь полную магию — иди в C# или Java. А здесь — больше костылей и понимания, что под капотом творится. Чистый JavaScript, ёпта, со всеми вытекающими.