• Как типизировать вложенного объекта в объекте в одну строку?

    Aetae
    @Aetae Куратор тега TypeScript
    Лол, вот нахрена ты обрезал единственную инфу имеющую значение в рамках вопроса, а именно изначальный тип blogPosts:
    Element implicitly has an 'any' type because expression of type 'string' can't be used to index type <какой бъ?!>
    Написано
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ, ещё в ответе я указал на библиотеку которая генерирует рантайм проверки на основе типов, для тех кому это важно. И таких там не одна. Есть и для классов, и для баз данных и всего такого. Но в целом они не особо популярны.

    А так - 99% фронта тупо верит серверу, что он пришлёт то, что заявил, без заморочек:).
    Когда же ты уже получил класс из неведомой хрени, то можешь спокойно проверять instanceof и т.п.
    Написано
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ,
    Вообще хоть какой-то способ получить аргументы конструктора класса User есть?

    В рантайме - нет.

    Аргументы конструктора с точки зрения js - это просто аргументы метода с имением constructor. Метод с точки зрения js - это просто функция. Имена аргументов функции ни на что снаружи не влияют, и просто являются по сути мапингом по порядку в переменные внутри функции. Имена аргументов функции никак не доступны - точно также, как недоступны поля класса. Единственное что доступно - поле length функции содержащее количество аргументов(но и оно не учитывает, не может учитывать, ...spread параметры или использование arguments).

    // На самом деле есть один единственный вариант получить имена аргументов в рантайме: сделать Ctor.toString() и спарсить их из полученной текстовой репрезентации. Только вид этой текстовой репрезентации ничем не гарантирован(хоть и на данный момент вроде идентичен средь браузеров) и применять такое в проде нельзя.:)

    На этапе компиляции стандартными средствами - нет.

    На этапе компиляции вмешиваясь в сам процесс компиляции, выполняя дополнительные преобразования? Сколько угодно, каким угодно способом. Просто надо глубоко разобраться в работе собственно компилятора. :)
    Ну или использовать готовую либу с близким функционалом.
    Написано
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ, проблемы с 4 пунктом.
    a) У AxiosResponse поле data имеет неизвестный тип. По умолчанию и для удобства - any, но на самом деле хрен знает, что там с сервера пришло. Нет там никакого constrictor точно, потому, что если и придёт там объект - это будет простой примитивный объект.
    б) Как я сказал выше:
    В javascript нет механизма получения полей класса

    Тебе просто не с чем сравнивать.

    Ты можешь только руками создать тупо массивчик с именами полей и по ним пройтись. Или можешь использовать библиотеку, чтоб она, условно, сделала этот массивчик за тебя неявно на этапе компиляции(с сопутствующими накладными расходами, само собой).
    Написано
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ, выше ответил, пока ты писал.

    С точки зрения типизации, а не проверки в рантайм, это может выглядеть так:
    type Constructor<T = object, Arg = any> = new (...args: Arg[]) => T;
    
    abstract class Api {
        public validateRequest<T>(validationModel: Constructor<T>, response : T) : boolean {
            // ts не даст сюда попасть если response УЖЕ не соответствует validationModel :)
            return true;
        }
    }

    Но это абсолютно бессмысленно, потому что типизация тут проверяет что response имеет тип validationModel на входе, чего ты конечно никак не можешь знать.:)

    Разве что из этого метода ты можешь сделать тайп-гард:
    type Constructor<T = object, Arg = any> = new (...args: Arg[]) => T;
    
    abstract class Api {
        public validateRequest<T>(validationModel: Constructor<T>, response: unknown): response is T {
            // тут всё сверяем руками или через typia
            return true;
        }
    }

    Но в любом случае все проверки ручкаими.
    Написано
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Допустим я в самом методе, который принимает unknown, будут проверять, что пришедшее в метод нечто является объектом и в его прототипе находится Entity, а в иных случаях буду обрабатывать ошибку, но мне всё ещё не ясно, как определить непосредственно список параметров конструктора, с которым и нужно сравнивать ответ пришедший со стороны сервера.

    Руками. Если сравнение идёт в рантайме - у тебя есть только javascript. В javascript нет механизма получения полей класса (до его создания само собой).
    Если очень не хочется руками - смотри на библиотеку указанную в ответе(или любую иную подобную), она сгенерирует нужный код на этапе компиляции.
    Написано
  • Как правильно ограничивать передаваемые аргументы классов в TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    OrbiJ, this. :)

    public validateRequest (validationModel: this) : boolean {
            return true;
        }

    Если я правильно понял конечно.

    Но вообще наверное тебе нужен просто обычный отдельный интерфейс.

    Или ты хочешь что-то такое?:
    // extract public properties withou methods
    type Data<T> = {
      [K in keyof T as T[K] extends Function ? never : K]: T[K]  
    }
    
    class Entity {
      public validateRequest (validationModel : Data<this>) : boolean {
        return true;
      }
    }
    
    class Book extends Entity {
      public id!: bigint;
      public name: string = "";
    }
    
    const book = new Book();
    
    book.validateRequest({id: 1n, name: ''}) // ok
    book.validateRequest({id: 1n}) // err

    Хз, в общем если не угадал - напиши полноценный псевдокод отражающий идею, который должен предположительно работать и там подумаем.:)
    Написано
  • Как организовать приложение React?

    Aetae
    @Aetae
    dontcomment, для того чтоб не верстать 109 страниц: открой это в ворде, выбери "сохранить как" -> "вебстраница с фильтром". Всё, сайт готов.:)

    Ну а если не совсем всё - дальше можешь написать простенький скрипт который тебе получившуюся хрень нарежет как надо.
    Написано
  • Как скрыть элемент страницы с помощью tampermonkey (userscript) в iframe, содержимое которого сделано через react?

    Aetae
    @Aetae Куратор тега JavaScript
    WbICHA, а по поводу вкладок - зависит от привычек. У меня вот есть вредная привычка открывать кучу вкладок "на потом". Раз в месяц я добавляю всё накопленное(1к+) в закладки, раз в год разбираю этот мусор по папочкам.:)
    Написано
  • Как остановить прокрутку страницы?

    Aetae
    @Aetae Куратор тега JavaScript
    Это так и работает?
    Написано
  • Как скрыть элемент страницы с помощью tampermonkey (userscript) в iframe, содержимое которого сделано через react?

    Aetae
    @Aetae Куратор тега JavaScript
    WbICHA, пожираение памяти скейлится от количества вкладок, т.к. такие общие расширения весьма хреново оптимизируют это дело.
    Про производительность cpu забудь - расширение для стилей точно также подключает их через скрипт.

    Вообще давно хочу таки запили тебе свой webdav сервер для юзерскриптов(поддерживается в tempermonkey) и работать с ними в нормальной ide со всем обвесом. Но руки всё никак не доходят.:)
    Написано
  • Почему у пересечения функций такой ReturnType?

    Aetae
    @Aetae Куратор тега TypeScript
    WbICHA, сборка на прод - тоже часть прода, а такая хрень может её замедлить довольно прилично.:)
    Написано
  • Как скрыть элемент страницы с помощью tampermonkey (userscript) в iframe, содержимое которого сделано через react?

    Aetae
    @Aetae Куратор тега JavaScript
    WbICHA, если обезьяна уже стоит, то не вижу смысла втыкать что-то ещё, память не резиновая.
    Написано
  • Белый айпи через свой сервер?

    Aetae
    @Aetae
    yoroxxel, впн это просто туннель. Не важно кто сервер, а кто клиент, пакеты могут ходить в любом направлении после установки связи, как настроишь маршруты и разрешения - так и будет.
    Написано
  • Как удалить из строки каждый третий символ?

    Aetae
    @Aetae Куратор тега JavaScript
    Если уж лезть в регулярки, то так: 'abcdefg'.replace(/(..)./g, '$1') :)
    Написано
  • Как сделать глобальный node_modules или как не дублировать одни и те же пакеты между проектов?

    Aetae
    @Aetae
    Сергей delphinpro, на симлинках половина либ не заведётся из-за "особенностей", только хардлинки работают. Сначала появилось пару костылей для yarn, а потом приехал таки pnpm и всё порешал из коробки. Многие популярные и крупные проекты на оный переехали уже.
    Написано
  • Как дать перманентный бан за мультиак на сайте?

    Aetae
    @Aetae
    Сергей Горностаев, ну параметры видухи можно через webgl утянуть, размеры экрана и т.д. Собственно гуглить техники фингерпринтинга.
    Написано
  • Как защитить от утечки свои данные в интернет?

    Aetae
    @Aetae
    Василий Банников, мух от котлет всё же стоит отделять.

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

    А вот то, что все гос. базы, как и базы всяких мэйл.ру в РФ (да и всём СНГ, чего уж там) давно слиты и переслиты - это факт. Соответственно если очень хочется и не жалко немного денюшек, то про тебя можно выяснить что угодно, если есть за что зацепиться(фотки, номер телефона, полное имя и т.д.). По ip, в принципе, тоже можно, но уже сильно сложнее и\или дороже.
    Написано
  • Почему картинка выходит за пределы body при уменьшении экрана?

    Aetae
    @Aetae
    TheFlappy, очевидно, что overflow надо задавать для "коробки" в которой вся эта тряхомудия лежит, а не самим картинкам, т.е. для
    .background или для .container, при этом, естественно, задав им ширину (100%?).

    Также рекомендую забыть про overflow: hidden и использовать всегда overflow: clip, коме тех случаев, когда специфическое поведение hidden действительно нужно.
    Написано