• Как вывести тип данных Data в заголовок?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    У тебя две совершенно разные проблемы в одном вопросе:

    1. TS тебе пишет ошибку, что тип Date не может быть children'ом для компонента, и это так. Однако дело в том, что тип у тебя задан неверно, на самом деле у тебя там никакой не Date а банальный string. Если ты поправишь типы, то всё заработает и выведет тебе то что ты передаёшь, т.е. 2012-03-23T08:25:44.962Z.

    2. Чтоб превратить строку 2012-03-23T08:25:44.962Z в строку Created 7 years ago надо либо руками написать соответствующую функцию, либо воспользоваться какой-либо библиотекой для работы с датами. Например с помощью moment это будет выглядеть примерно так:
    const createdFromNow = `Created ${
      moment.duration(moment().diff(data.createdAt)).humanize()
    } ago`;
    Ответ написан
    Комментировать
  • Как правильно слить ветки?

    Aetae
    @Aetae
    Тлен
    Сделать pull из master к себе. Если ты не трогал эту папку - то всё само разрушится.
    Ответ написан
  • В чем преимущества TS?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    А ещё динамическая типизация сильно экономит время на написание кода - это очень нехилая оптимизация рабочего процесса.

    Это утверждение верно относительно языков с изначально статической типизацией против языков с динамической, но не верно для TS как такового. Если не использовать маньячные правила типа обязательного ручного проставления типов, то в 80% случаев TS сам прекрасно выводит тип, без лишних телодвижений.
    Огромное ускорение от типизированого автокомплита в IDE и отсутствия возможности, например, случайно кинуть в функцию объект вместо строки, с лихвой перекрывает оставшиеся 20%.
    Редкие случаи когда TS писал мне "какую-то хрень" и отказывался что-то делать, заставляя сидеть и разбираться - на поверку оказывались сильно неочевидными косяками в моём коде, которые могли бы привести к реальным багам.
    Ответ написан
    Комментировать
  • Как предписать тип классу так, чтобы ts считал что мы унаслодовались?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Можно с помощью declaration merging, но осторожно. В таких штуках все риски ты берёшь на себя:
    class Widget {
      render() {
        this.doStuff();
      }
    }
    
    interface Widget {
        doStuff(): string
    }
    
    // потом это сделает сторонний код
    Widget.prototype.doStuff = () => 'doingstuff';
    Ответ написан
    Комментировать
  • React-moment как изменить локализацию?

    Aetae
    @Aetae
    Тлен
    Идёшь на гитхаб, находишь где лежит эта фраза в локали. После чего просто патчишь локаль как надо:
    moment.updateLocale('uz-latn', {
      relativeTime: {
        past: '%s oldin'
      }
    });

    Или, если изменение нужно только в одном месте, то создаёшь отдельную:
    moment.defineLocale('uz-latn-short', {
      parentLocale: 'uz-latn',
      relativeTime: {
        past: '%s oldin'
      }
    });
    и используешь её где надо.
    Ответ написан
    Комментировать
  • Как синхронизировать схему БД с использованием TypeORM между микросервисами?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ну как обычно со всем остальным: вынести в общую библиотеку либо вынести в гит-модуль.
    Ответ написан
    Комментировать
  • Как правильно рендерить рекурсивный массив используя useMemo?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    useMemo - это не магическое заклинание. Оно работает сверяя изменения переданных props не более того.
    В твоём случае в useMemomemo надо обернуть сам компонент Replay, а не голый jsx.
    Ответ написан
    2 комментария
  • Как сделать замену только для первой группы regExp?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Во-первых: не работайте с html через регулярки.
    Во-вторых: см. во-первых.
    В-третьих: `(?<=>)(${letter})(?=<)`
    Ответ написан
    Комментировать
  • Как правилось указать тип значений?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ошибка в том что файл у вас читается как js, а не как ts. Разберитесь с конфигами.
    Ответ написан
    Комментировать
  • Как можно завершить функцию из другой функции?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ещёб чужие функции мне поток останавливали.)
    Нет, низя. И слава богу.
    Ответ написан
    Комментировать
  • Как синхронизировать данные из localstorage между комонентами react?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Не используйте localStorage напрямую, напишите минимальюную обёртку-hook, положите в context или используйте одну из 100500 готовых библиотек для store в react.
    Ответ написан
    Комментировать
  • Как решить JSX element type 'LayoutMenu.Category' does not have any construct or call signatures?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    type Extensions = {
      Category: typeof LayoutMenuCategory;
      Item: typeof LayoutMenuItem;
    };

    Иначе оно для ts может быть также и undefined, а undefined - то, что написано в ошибке.
    Ответ написан
  • Как описать OR логику в интерфейсах?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Увы конкретный тип может так работать только при наличии дискриминатора как в варианте 2 или жутких костылей как в варианте 1.

    Однако, если вам это нужно для параметров некоей функции(или react компонента), то в случае передачи аргументом литерала оно может красиво работать с помощью пергрузок:
    interface DefaultProps4 {
        instantPopoup?: boolean;
        // ...
    }
    interface PropsWithCb4 extends DefaultProps4 {
        cb(): void;
    }
    interface PropsWithPath4 extends DefaultProps4 {
        path: string;
    }
    
    
    type Magic = ((arg: PropsWithCb4) => 1) & ((arg: PropsWithPath4) => 2);
    declare const magic: Magic;
    
    // error
    magic({ 
        cb: () => {},
        instantPopoup: true,
        path: "df", 
    });
    
    // 1, no error
    magic({ 
        cb: () => {},
        instantPopoup: true,
    })
    
    // 2, no error
    magic({ 
        instantPopoup: true,
        path: "df", 
    })


    Но только в случае литерала(установка пропсов в jsx - тоже считается литералом), вот так уже не сработает:
    const trololo = {
        cb: () => {},
        instantPopoup: true,
        path: "df",
    }
    magic(trololo); // 1, no error
    Ответ написан
  • Почему код со временем перестает работать, хотя раньше работал отлично?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Вариантов много.
    Самый вероятный(после банальной ошибки в твоём коде само собой): используется сторонняя библиотека получаемая извне без явной привязки к конкретной версии. Т.е.: обновилась библиотека, поменялся её интерфейс, код перестал работать.
    Самый невероятный: с обновлением браузера изменилась какая-то мелочь в его интерпретации твоего кода. Такое практически исключено, разработчики бразуеров очень сильно пекутся об обратной совместимости.
    Ответ написан
    7 комментариев
  • Как переделать этот код под TypeScript?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    TS тебе предельно понятно написал в чём проблема. Учись читать ошибки.

    Конкретнее же: у тебя не задан тип значения которое может принимать контекст, а выведено самим TS - null(потому что именно такое значение по умолчанию ты передал).
    export const Context = createContext<{
      sidebarIsOpen: boolean;
      toggleSidebar: (value: boolean) => void;
    } | null>(null)
    или лучше
    export const Context = createContext({
      sidebarIsOpen: false,
      toggleSidebar: () => {}
    });
    Ответ написан
    Комментировать
  • Как применить форму по нажатию enter?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ну по enter у тебя же что-то происходит? Вот перед основным кодом триггерни blur руками:
    document.activeElement.dispatchEvent(new Event('blur'));


    Это конечно костыль, и по логике тебе надо написать кастомную обработку варианта с onChange, но и так, наверное, сойдёт.
    Ответ написан
    Комментировать
  • Vue3, как сделать задержку внутри computed?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Условно как-то так:
    const betsArr = ref();
    watch(<то что было в computed>, debounce((value) => betsArr.value = value, 1000));
    Ответ написан
    Комментировать
  • Как писать fullstack с webpack?

    Aetae
    @Aetae
    Тлен
    webpack devServer, в частности функция proxy.
    Webpack поднимает сервер с горячей перезагрузкой фронта, бэк сервера поднимаешь на других портах, и обращаешься к api прозрачно с помощью встроенного прокси.
    Ответ написан
    Комментировать
  • Почему vue watch выдает обратное значение?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Потому что не isDropped(oldVal, newVal), а isDropped(newVal, oldVal), лол.
    Ответ написан
    Комментировать
  • Почему переменная не копирует ссылку на объект?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    = - это присваивание, а не изменение. В случае с объектом присваивание ссылки, но всё ещё присваивание.
    Ответ написан
    Комментировать