Волшебные струны - это бельмо на глазу. Мне особенно не нравится видеть их в обозначении объектных скобок для средств доступа к свойствам, например
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 основные проблемы:
- Волшебные строки здесь не нужны, так как это делает код менее удобным в обслуживании и не самодокументируется.
- Нет гарантии, что доступное свойство существует в исходном объекте.
После Что насчет Боба? подход », давайте сделаем маленькие шаги и начнем рефакторинг" волшебных строк ":
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 для общих объектов.