Skip to content

Языки программирования

10 Темы 21 Сообщения

  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 3 Темы
    4 Сообщения
    JspiJ

    Часто объединенные типы Union Type и перечисляемый тип Enum - это онди из способов обеспечения типобезопасности кода, в частности типизация ограниченного списка каких либо значений.

    Они также оба хорошо работают с современными IDE предлагая в подсказках отфильтрованные значения.

    Но бывает задаешься вопросом: что лучше использовать в той или иной ситуации?

    Разница в размере кода

    Объединенные типы не будут создавать какой либо дополнительный код.
    Вот Простой пример:

    Версия с Union Type

    type VehicleTypeUnion = 'SUV' | 'SEDAN' | 'TRUCK'; const a: VehicleTypeUnion = 'SUV'

    ->

    "use strict"; const a = 'SUV';

    Версия с Enum

    enum VehicleTypeEnum { SUV, SEDAN, TRUCK, } const b: VehicleTypeEnum = VehicleTypeEnum.SUV

    ->

    var VehicleTypeEnum; (function (VehicleTypeEnum) { VehicleTypeEnum[VehicleTypeEnum["SUV"] = 0] = "SUV"; VehicleTypeEnum[VehicleTypeEnum["SEDAN"] = 1] = "SEDAN"; VehicleTypeEnum[VehicleTypeEnum["TRUCK"] = 2] = "TRUCK"; })(VehicleTypeEnum || (VehicleTypeEnum = {})); const b = VehicleTypeEnum.SUV; Разные типы в списке значений

    перечисляемый тип обычно описывается в виде числовых значений или в виде строковых.

    // список enum VehicleType1 { SUV, SEDAN, TRUCK, BUS, MOTORCYCLE } // эквивалентный список enum VehicleType2{ SUV = 0, SEDAN = 1, TRUCK = 2, BUS = 3, MOTORCYCLE = 4 } // список со строковыми значениями enum VehicleType3{ SUV = 'SUV', SEDAN = 'SEDAN', TRUCK = 'TRUCK', BUS = 'BUS', MOTORCYCLE = 'MOTORCYCLE' }

    ->

    "use strict"; // перечисляемый тип var VehicleType1; (function (VehicleType1) { VehicleType1[VehicleType1["SUV"] = 0] = "SUV"; VehicleType1[VehicleType1["SEDAN"] = 1] = "SEDAN"; VehicleType1[VehicleType1["TRUCK"] = 2] = "TRUCK"; VehicleType1[VehicleType1["BUS"] = 3] = "BUS"; VehicleType1[VehicleType1["MOTORCYCLE"] = 4] = "MOTORCYCLE"; })(VehicleType1 || (VehicleType1 = {})); // эквивалентный тип var VehicleType2; (function (VehicleType2) { VehicleType2[VehicleType2["SUV"] = 0] = "SUV"; VehicleType2[VehicleType2["SEDAN"] = 1] = "SEDAN"; VehicleType2[VehicleType2["TRUCK"] = 2] = "TRUCK"; VehicleType2[VehicleType2["BUS"] = 3] = "BUS"; VehicleType2[VehicleType2["MOTORCYCLE"] = 4] = "MOTORCYCLE"; })(VehicleType2 || (VehicleType2 = {})); // тип со строковыми значениями var VehicleType3; (function (VehicleType3) { VehicleType3["SUV"] = "SUV"; VehicleType3["SEDAN"] = "SEDAN"; VehicleType3["TRUCK"] = "TRUCK"; VehicleType3["BUS"] = "BUS"; VehicleType3["MOTORCYCLE"] = "MOTORCYCLE"; })(VehicleType3 || (VehicleType3 = {}));

    Первый тип мы описали без инициализирующих значений, его значения инициализируются автоматически, в зависимости от порядка, поэтому порядок значений менять опасно!

    Это также накладывает ограничение, что мы не можем использовать тип с проинициализированными значениями и без:

    enum VehicleType { SUV = 'SUV', SEDAN = 'SEDAN', TRUCK = 'TRUCK', BUS = 'BUS', MOTORCYCLE }

    Выведет ошибку error TS1061: Enum member must have initializer.

    Вам придется описать тип так:

    enum VehicleType { SUV = 'SUV', SEDAN = 'SEDAN', TRUCK = 'TRUCK', BUS = 'BUS', MOTORCYCLE = 0, } Union Type

    Тут вы можете создавать объединения с другими типами значений, отличными от строк:

    type VehicleType = 'SUV' | 'SEDAN' | 'TRUCK' | 0 | [];

    Это дает вам дополнительную гибкость в определении типов. Однако такая дополнительная гибкость может привести к неожиданному поведению в коде при отсутствии четкого понимания типа переменной, которая может быть строкой, или числом, или массивом объектов и т.д.

    Перебор значений

    Перечисления - это объекты, где каждому ключу свойства может быть автоматически присвоено значение или строка на случай, если мы определим значение вручную. Следовательно, вы можете повторять значения свойств точно так же, как и любой другой объект:

    export enum VehicleType { SUV = 'SUV', SEDAN = 'SEDAN', TRUCK = 'TRUCK', BUS = 'BUS', MOTORCYCLE = 'MOTORCYCLE' } for (const type in VehicleType) { console.log(type); } Object.keys(VehicleType).forEach((key) => { console.log('key ', key); })

    Попытка сделать что-то подобное с union types приведет к ошибке при попытке выполнения кода

    type VehicleType = 'SUV' | 'SEDAN' | 'TRUCK' | 'BUS' | 'MOTORCYCLE'; for (const type in VehicleType) { // my logic in here console.log(type); } Object.keys(VehicleType).forEach((key) => { console.log('key ', key); })

    error TS2693: 'VehicleType' only refers to a type, but is being used as a value here.

    Вывод

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

  • 6 Темы
    12 Сообщения
    kirilljsK
    1. Объект Intl

    Объект Intl позволяет форматировать числа, даты и валюту с учетом разных локалей и параметров.

    Он предоставляется с множеством свойств, которые обеспечивают быстрое и безупречное форматирование данных.

    Рассмотрим пример форматирования валюты:

    let num = 100; let RupeeFormatter = new Intl.NumberFormat("en-IN", {style: "currency", currency: "INR"}) let RupeeFormatted = RupeeFormatter.format(num); console.log(RupeeFormatted) // ₹100 let USDFormatter = new Intl.NumberFormat("en-IN", {style: "currency", currency: "USD"}) let USDFormatted = USDFormatter.format(num) console.log(USDFormatted) // $100 2. Оператор ??

    Оператор ?? присваивает переменной значение по умолчанию, если она null или undefined.

    Используйте данный оператор, если сомневаетесь в существовании у объекта того или иного свойства. Если свойство отсутствует, переменной присваивается значение по умолчанию.

    Пример:

    let user = {} let name = user.name ?? "Anonymous" console.log(name) // "Anonymous" 3. Object.fromEntries()

    Метод Object.fromEntries() преобразует массив пар “ключ-значение” в объект.

    Возьмем следующий массив и создадим из него объект, как показано ниже:

    let arr = [["name", "Alice"], ["age", 25]] let obj = Object.fromEntries(arr); console.log(obj) // {name: "Alice", age: 25} 4. Array.flat()

    Метод Array.flat() преобразует вложенный массив в один единственный.

    Поскольку вложенными массивами сложно управлять, то данный метод помогает уменьшать их вложенность.

    Пример:

    let arr = [1, [2, [3, [4]]]]; let flat = arr.flat(Infinity) console.log(flat) // [1, 2, 3, 4] 5. Оператор ?

    Оператор ?. обеспечивает доступ к свойствам объекта без проверки, является ли он null или undefined.

    Используйте его, когда не знаете, существует ли объект или нет.

    Пример:

    let user = null let age = user?.age console.log(age) // undefined 6. Array.reduce()

    Метод Array.reduce() применяет функцию к каждому элементу массива и суммирует результат в одно значение.

    Пример сложения всех чисел массива:

    let arr = [1, 2, 3, 4, 5] let sum = arr.reduce((a, b) => a + b) console.log(sum) // 15 7. String.repeat()

    Метод String.repeat() создает новую строку, повторяя заданную строку указанное количество раз.

    Пример:

    let str = "js".repeat(10) console.log(str) // 'jsjsjsjsjsjsjsjsjsjs' 8. Array.from()

    Метод Array.from() создает новый массив из массивоподобного или итерируемого объекта.

    Пример:

    let str = "Hello" let arr = Array.from(str) console.log(arr) // ["H", "e", "l", "l", "o"] 9. Math.hypot()

    Метод Math.hypot() находит квадратный корень из суммы квадратов его аргументов.

    Так, сумма квадратов 3 и 4 равна 25, а квадратный корень из 25 равен 5. Следовательно, Math.hypot(3, 4) возвращает 5.

    Пример:

    let hyp = Math.hypot(3, 4); console.log(hyp) // 5 10. Object.assign()

    Метод Object.assign() копирует значения всех перечисляемых собственных свойств из одного или нескольких исходных объектов в целевой объект.

    Пример:

    let obj1 = {a: 1, b: 2}; let obj2 = {c: 3, d: 4}; let obj3 = Object.assign(obj1, obj2) console.log(obj3) // {a: 1, b: 2, c: 3, d: 4}
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений
  • 0 Темы
    0 Сообщения
    Нет новых сообщений