Волшебные струны - это бельмо на глазу. Мне особенно не нравится видеть их в обозначении объектных скобок для средств доступа к свойствам, например

abstract class Main {
  run() {
    const myObject = { a: 2, b: 4 };
    console.log(`Dot Notation (good): ${myObject.a}`);
    console.log(`Bracket Notation (bad): ${myObject['a']}`);
  }
}
Main.run();

Единственный вариант использования, который я могу оправдать с помощью обозначения объектных скобок, - это динамический доступ к свойствам, но мне бы не хотелось использовать такую ​​волшебную строку только для доступа к такому свойству. Невозможно гарантировать, что ваша собственность будет находиться в исходном объекте. В приведенном выше блоке кода есть 2 основные проблемы:

  1. Волшебные строки здесь не нужны, так как это делает код менее удобным в обслуживании и не самодокументируется.
  2. Нет гарантии, что доступное свойство существует в исходном объекте.

После Что насчет Боба? подход », давайте сделаем маленькие шаги и начнем рефакторинг" волшебных строк ":

abstract class Constants {
    readonly MyProperty: string = 'a';
}
abstract class Main {
  run() {
    const myObject = { a: 2, b: 4 };
    console.log(`Better: ${myObject[Constants.MyProperty]}`);
  }
}
Main.run();

Волшебная строка больше не используется, приведенный выше пример - немного лучший вариант. Это более удобное в обслуживании решение, поскольку оно создает единый источник правды и помогает продвинуться дальше по пути самодокументирующегося кода. И хотя мы обратились к бельму на глазу, связанному с магическими нитями, мы все еще не решили нашу проблему «гарантированной собственности».

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

MyClass должен показаться вам знакомым - просто класс с голыми костями. Часть этого Constants - мой способ лучше представить константы в большом веб-приложении. Вы можете получить трехуровневый шаблон организации, создав пространство имен для инкапсуляции всех констант, классов для организации строк и ваших строк static + readonly в качестве констант. Однако обратите внимание на одну тонкую разницу между MyProperty и MyUnsafeProperty. Один использует строковый тип, а другой - сильный тип, чтобы он был ключом MyClass, используя keyof.

keyof - это запрос типа Typescript, который гарантирует, что строка существует как свойство для этого объекта (обратите внимание, что это также относится к отношениям родитель-потомок). Если значение MyProperty не существует в виде поля на MyClass, Typescript выдаст вам ошибку компилятора, чтобы вы знали, что ваше значение не существует в виде поля на MyClass. Для большей безопасности мы ограничиваем второй параметр_safeNameOf ключами типа T. И на тот случай, если вам удалось подавить эту ошибку компиляции Typescript, мы все равно добавляем дополнительную проверку _safeNameOf, чтобы убедиться, что ключ действительно существует в источнике.

Это подробный способ сделать ваши средства доступа к свойствам нотации в скобках типобезопасными, но это отличный способ обеспечить безопасность типов в некоторых старых обходных путях Javascript для общих объектов.