• Что означает этот синтаксис?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Возвращает у вас судя по всему всегда this, а то что в скобках это так называемый side effect. Стороннее действие.
    Тык
    Ответ написан
    Комментировать
  • Как правильно указать файл декларации в ts?

    Судя по всему - плохо рыли. .d.ts-файлы работают для модулей.
    К примеру у нас есть следующая структура:
    │   main.js
    └───lib
            greeting.ts

    main.js

    import { greeting } from './lib/greeting.js';
    
    console.log(greeting('John'));


    greeting.ts

    export const greeting = (name: string): string => `Hello, ${name}`;


    Для генерации требуемого .d.ts можем использовать следующую команду: tsc lib\greeting.ts --target ES2020 -d. Данная команда сгенерирует два файла:
    greeting.js

    export const greeting = (name) => `Hello, ${name}`;


    greeting.d.ts

    export declare const greeting: (name: string) => string;


    И в том случае, если удалить greeting.ts, то описания типов будут подтягиваться с .d.ts файла (в основном используются в релизных сборках).
    Ваш .d.ts должен выглядеть следующим образом:
    export declare class Message {
        send(t: string, f: string): void;
    }

    5f9107e030050654671624.png
    Ответ написан
    Комментировать
  • Как повысить производительность js-кода?

    RAX7
    @RAX7
    возникла проблема со скоростью выполнения кода

    Проблема в самом алгоритме. Не нужно суммировать элементы массива на каждой вложенной итерации, достаточно одного прохода по массиву. Код придется полностью переписать.
    решение

    function partsSums(ls) {
      const result = new Array(ls.length + 1);
      result[ls.length] = 0;
    
      for (let i = ls.length - 1; i > -1; i--) {
        result[i] = result[i + 1] + ls[i];
      }
    
      return result;
    }

    Ответ написан
    7 комментариев
  • Типизация функции, возвращающей разные объекты?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Проще всего сделать так, ts сам подберёт типы:
    const elementDefaults = {
      'welcome': {
        placeholder: 'Type welcome message...',
        question: '',
        isDescription: false,
        description: '',
        startButtonText: 'Start',
      },
      'checkbox': {
        placeholder: 'Type question or statement...',
        question: '',
        isDescription: false,
        description: '',
        options: [] as string[],
        multiple: false,
      }, 
      'dropdown': {
        placeholder: 'Type question here...',
        question: '',
        isDescription: false,
        description: '',
        options: [] as string[],
      },
      'rating': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
        defaultRate: 0,
        shape: 'stars',
      },
      'text': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        maxLength: 99999,
      }, 
      'slider': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
      }, 
      'thanks': {
        placeholder: 'Type message...',
        question: '',
        isDescription: false,
        description: '',
      }
    }
    
    
    export function getElementSettings<E extends keyof typeof elementTypes>(type: E) {
      if(!(type in elementDefaults)) throw new Error("element type doesn't match!");
      return elementDefaults[type];
    }

    Но если хочется по правилам, то как-то так:
    type ElementSetting = {
      placeholder: string;
      question: string;
      isDescription: boolean;
      description: string;
    }
    
    type ElementSettings = {
      welcome: ElementSetting & {
        startButtonText: string;
      },
      checkbox: ElementSetting & {
        options: string[];
        multiple: boolean;
      },
      dropdown: ElementSetting & {
        options: string[];
      },
      rating: ElementSetting & {
        steps: number;
        defaultRate: number;
        shape: string;
      },
      text: ElementSetting & {
        maxLength: number;
      },
      slider: ElementSetting & {
        steps: number;
      },
      thanks: ElementSetting
    }
    
    const elementDefaults: ElementSettings = {
      'welcome': {
        placeholder: 'Type welcome message...',
        question: '',
        isDescription: false,
        description: '',
        startButtonText: 'Start',
      },
      'checkbox': {
        placeholder: 'Type question or statement...',
        question: '',
        isDescription: false,
        description: '',
        options: [],
        multiple: false,
      },
      'dropdown': {
        placeholder: 'Type question here...',
        question: '',
        isDescription: false,
        description: '',
        options: [],
      },
      'rating': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
        defaultRate: 0,
        shape: 'stars',
      },
      'text': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        maxLength: 99999,
      },
      'slider': {
        placeholder: 'Type question...',
        question: '',
        isDescription: false,
        description: '',
        steps: 10,
      },
      'thanks': {
        placeholder: 'Type message...',
        question: '',
        isDescription: false,
        description: '',
      }
    }
    
    
    export function getElementSettings<E extends keyof ElementSettings>(type: E): ElementSettings[E] {
      if(!(type in elementDefaults)) throw new Error("element type doesn't match!");
      return elementDefaults[type];
    }
    Ответ написан
    1 комментарий
  • Как проверить наличие переменной?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Как наиболее короче сделать...

    Короче - не проверять, и вообще не обрабатывать элементы, где нет данных:

    generalDiv.innerHTML = newCats
      .filter(n => n?.breeds.length)
      .map(({ url, breeds: [ b ] }) => `
        <div class="cat__item">
          <div class="cat__img"><img src="${url}" alt="${b.name}"></div>
          <div class="cat__name">${b.name}</div>
          <div class="cat__temperament">${b.temperament}</div>
          <div class="cat__live">${b.life_span}</div>
          <div class="cat__origin">${b.origin}</div>
          <div class="cat__description">${b.description}</div>
          <div class="cat__wikipedia_url">${b.wikipedia_url}</div>
        </div>
      `)
      .join('');
    Ответ написан
    5 комментариев
  • Зачем нужен этот метод декоратора?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    По-моему вот тут все предельно понятно объяснено: https://refactoring.guru/ru/design-patterns/decorator
    Ответ написан
    Комментировать
  • Как найти ключ объекта с максимальным значением в массиве?

    @BigSmoke
    Ну можно так. Не знаю насколько это блистательнее и точно не короче, но зато за один проход и без не нужной сортировки массива.

    const arr = [{a:5},{d:6},{g:0},{b:3},{c:1}];
    let max = null;
    let result;
    
    for (const currentObj of arr) {
      const currentValue = currentObj[Object.keys(currentObj)[0]];
      const currentKey = Object.keys(currentObj)[0];
    
      if (max < currentObj[currentKey] || max === null) {
        max = currentValue;
        result = currentKey;
      }
    }
    console.log(result);
    Ответ написан
    3 комментария
  • Хранение данных в бд в зашифрованном виде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для начала тебе надо узнать, что пароли никто не хранит зашифрованными.
    Поэтому тебе надо сначала узнать, как именно хранятся пароли.

    А потом ты, может быть, и сам уже сообразишь, что нет - "как пароли" хранить данные пользователя в бд невозможно.
    Ответ написан
    Комментировать
  • Хранение данных в бд в зашифрованном виде?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никто в здравом уме не шифрует пароли. Используется хэш пароля, без возможности его обратного восстановления.
    Если у вас сольют базу данных, то с большой вероятностью сольют и все скрипты с паролями. Так что с расшифровкой у злоумышленника проблем не будет. А вы потеряете возможность поиска по шифрованным данным в БД.
    Ответ написан
    Комментировать
  • Как избавиться от ошибки "Maximum call stack size exceeded" во vue router?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Если уже переходите к форме авторизации, не надо пытаться инициировать этот переход ещё раз - добавьте || to.name === 'Authorization' в beforeEach в if.
    Ответ написан
    1 комментарий
  • Существует ли в C# | - или между типами?

    Перегрузка методов вам не подходит?
    public static void Main(string[]  args)
            {
                //Your code goes here
                W(0);//передаём int
                 W("string");//передаём string
            }
    void W(string t){
    Console.WriteLine(t);
    }
    void W(int t){
    Console.WriteLine(t.ToString());
    }
    Ответ написан
    Комментировать
  • Что это за кавычки?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Back quote, обратная кавычка.
    На клавиатуре обычно на той же клавише, что и тильда (~), слева от (1).
    В JS обозначает шаблонные литералы.
    Ответ написан
    Комментировать
  • Отличие создание объекта через new и dependency injection?

    Через new создаётся экземпляр конкретного класа, через DI можно передавать клас реализующий необходимый функционал (то есть зависить от интерфейса, а не конкретной реализации)

    Через DI можно передавать уже сконфигурированный объект, через new его придется конфигурировать после каждого создания.
    Ответ написан
    2 комментария
  • Отличие создание объекта через new и dependency injection?

    @Flying
    При создании экземпляра объёкта через new вы просто создаёте экземпляр объекта т.к. это конструкция самого языка. Если этот объект нужно создавать как-то специфически, к примеру если надо передавать что-то в конструктор или как-то дополнительно конфигурировать и т.п. - всё это ваша ответственность. Если вам понадобится этот же объект где-то в другом месте проекта - то передача его туда - тоже ваша ответственность.

    Dependency injection container, в отличие от этого обеспечивает следующие задачи:
    1. Централизованное хранилище объектов и интерфейс для их получения
    2. Автоматическое корректное создание сконфигурированных экземпляров объектов

    Конкретные реализации могут предоставлять дополнительные сервисы, но описанные выше - основные. Конечно, внутри там в конечном итоге тот же new, просто логика создания, конфигурирования и хранения объектов вынесена в отдельную стандартизированную сущность которой можно и нужно пользоваться для упрощения и улучшения качества своего кода.
    Ответ написан
    3 комментария
  • Является ли данный код нарушением принципа Dependency Inversion?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    не будет, но лучше использовать абстрактную фабрику
    p.s. new зарезервировано php и не может быть именем метода
    Ответ написан
    3 комментария
  • Почему при оборачивании кода в $(document).on('click', function ( { }); он ломается?

    hzzzzl
    @hzzzzl
    каждый раз при document.onclick вызывается вот это всё, и добавляются новые event listener-ы на спаны

    Такая обертка нужна для ajax

    каким образом?
    Ответ написан
    7 комментариев
  • Почему не происходит перендеринг?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Включи предупреждения в консоли. Ты пытаешься изменять массив напрямую в store, чего делать нельзя.
    const arr = this.$store.getters.templatesList.slice(0);

    Ну и для сортировки есть встроенный метод sort:
    arr.sort(({created_at:a}, {created_at:b}) => a < b ? -1 : a > b ? 1 : 0);
    Ответ написан
    1 комментарий
  • Как можно корректно написать асинхронный метод у объекта в typescript с дженериком?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Что именно ты хочешь сократить, вроде ж дальше некуда: один тип на вход - один на выход?

    Ну можешь убрать async и await, они здесь не нужны:
    const ApiServiceModule = {
      get: <T>(url: string): Promise<T> => fetch(url)
        .then(response => response.json())
        .catch(err => console.error(err))
    }
    async/await всего лишь сахар над Promise и в данном случае ничего не делают, т.к fetch и так возвращает Promise.

    P.S. Ну и методом я бы это не назвал, это свойство с функцией. Метод имеет доступ к this.
    Ответ написан
    Комментировать
  • Как решить задачу?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Быстрое решение - построить для этого массива суффиксное дерево алгоритмом Укконена (или вот ссылка), потом обойти его, найти самую глубокую вершину, у которой есть более одного ребенка, и вывести путь до нее от корня. Работает за O(n).

    Edit:

    Вообще есть много решений разной заумности и скорости. Самое быстрое - за линию - я привел выше. Следующий уровень - за квадрат, через z-функцию (но пишется и понимается проще суффиксного дерева). Для каждого суффикса вашего массива найдите максимальное значение z-функции.

    И еще проще, но уже за куб - переберите любые 2 позиции и потом одним циклом считайте, сколько символов с этих позиций совпадают.
    Ответ написан
    3 комментария