Ответы пользователя по тегу TypeScript
  • Можно ли импортировать модель из одного микро сервиса в другой?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Очевидно нужен отдельный пакет, в котором будет общее для всех сервисов.
    Ответ написан
  • В чем разница между type и enum?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Тем что Weekday2s.mon === 0. Если нужны в enum именно строки - то именно строки и следует задавать: enum Weekdays { mon = "mon", ...}
    В остальном, этого:
    Ну кроме того что enum скомпилируется в JS - объект, а type будет доступен только во времени компиляции.

    более чем достаточно. Вместо того чтобы работать со строками(каждый раз новыми), ты работаешь объектом.
    Ответ написан
    Комментировать
  • Есть ли что-то типа транскомпилятора(для браузера) для typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Если дёшево и сердито: tsc --watch, но адекватный вариант - юзать системы с live reload'ом, например одну из предложенных Алексей Ярков.
    Подключать надо всё равно js, компилировать на лету в браузере - безумие и бессмыслица, т.к. ты не сможешь следить за изменениями и должен будешь каждый раз в ручную перегружать страницу и каждый раз перекомпилировать весь код целиком, а не дельту как при нормальном способе.
    Ответ написан
    1 комментарий
  • Как правильно написать рекурсию?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Используй готовые либы(или смотри на их код).
    Сейчас миксины в ts представляют собой костыли поверх багов.

    По твоему примеру: ты не можешь просто взять массив и получить из него вразумительные типы. Тебе нужны оврлоады на каждый отдельный тип, чтоб получить на выходе юнион.
    Я мог бы что-нибудь накостылить, но не буду, потому что это больно.)
    Ответ написан
    Комментировать
  • Что стоит использовать type или интерфейс?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Мысли простые на самом деле: зри в корень.
    Интерфейсы используй для описания интерфейсов, типы используй для описания типов.
    И нет, это не одно и тоже.
    Если утрировать: интерфейс - это описание структуры данных, встречающееся на стыке взаимодействия компонентов системы или разных систем, в основном используется только на этом самом стыке; тип - это внутренние сущности которыми оперирует система и которые встречаются повсеместно.
    Ответ написан
    Комментировать
  • Каким способом вы определяете тип функции в вашем приложении?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Ну IDE тебе подскажет при вводе.)
    А что вводить - ты должен знать и так: ты же знаешь с чем функция твоя работает.) Если потенциально по логике твоя функция должна работать с чем-то ещё, но ты об этом не знал на момент написания, то значит ты не предусмотрел этого и внутри функции тоже, а значит отсутствие указанного типа только в плюс.
    Поизучать типы можно полазив по .d.ts соответствующих либ. IDE и тут поможет: ctrl+тык на имеющуюся функцию откроет её декларацию.

    В целом же в TS структурная типизация, тебе не надо знать с какими именами типов работает пользователь, тебе надо лишь указать структуру нужного типа.
    Ответ написан
    Комментировать
  • Какой тип указать для children.current у TS?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Возможно ак:
    const {current}: {current: HTMLUListElement} = children;

    или так:
    const current = children.current as HTMLUListElement;

    Вы же задаёте тип не current, а всего объекта.

    P.S. Про ts-ignore забудьте.
    Ответ написан
    Комментировать
  • Почему ругается TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Typescript работает только с кодом, он не знает что-там в Vue шаблоне, увы. Потому в $refs у него лежат голые компоненты Vue или Element'ы.
    Я лично вручную указываю через объединение интерфейсов - внизу добавляю перекрывающий:
    @Component
    export default class Login extends Vue { 
      // ...
    }
    export default interface Login {
      $refs: {
         loginForm: any; // на самом деле не any, а интерфейс компонента, поддерживающий нужные методы
      }
    }
    Ответ написан
    8 комментариев
  • Как подключить ESLint к проекту?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Должно быть очевидно из сообщения об ошибке, нет? Выше в корне проекта у вас лежит ещё один файл .eslintrc, который как-то конфликтует с вашим.
    Ответ написан
    Комментировать
  • Можно ли реализовать кастомный typescript-декоратор для типизации пропсов по аналогии с @Input в Angular?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Я, увы, не до конца понял, что именно вам нужно, но одно могу сказать: IDE умеет работать напрямую только с самим typescript, т.е. если исходя из логики typescript там должен быть тайпчек или там может быть ограниченный набор для подстановки - это будет работать. Если нет - нет. Кастомные трансформы не учитываются.
    Также IDE может расширенно поддерживать популярные расширения и трансформы с помощью (встроенных) плагинов, но для своего уникального кейса, выходящего за стандартные рамки, вам придётся пилить свой плагин.
    Декораторы же - это не магия, это обычные функции + сахарный синтаксис.
    Ответ написан
    Комментировать
  • Можно ли отключить абсолютные пути в tsconfig или tslint?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Tslint: import-blacklist.
    "import-blacklist": [true, ["^src/.*"]]

    Eslint: no-restricted-imports.
    "no-restricted-imports": ["error", {"patterns": ["src/*"]}]
    Ответ написан
  • Как в JS переписать метод так чтоб он вызывался с еще одним аргументом по дефолту?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    1. Ты уверен что хочешь замонкипатчить весь класс и всех потомков, а не конкретный его инстанс?
    2. У тебя ряд никак не связанных с ts ошибок, эта строчка: this.showParams.apply(this, ...args); содержит две ошибки:
    а) вызывая this.showParams внутри this.showParams ты поучаешь бесконечную рекурсию, надо сохранить старый this.showParams в отдельную переменную и вызывать через неё;
    б.) Function.prototype.apply принимает вторым аргументом массив, а ты его тут зазря разбираешь.

    Если на 1 вопрос ответ "нет", то как-то так должно быть:
    class ExampleClass {
      showParams(...args) {
        console.log('I have to be calleb');
        console.log(...args);
      }
    }
    
    const exampleInstance = new ExampleClass();
    
    exampleInstance.showParams('one', 'Two', 'Three', 456);
    
    exampleInstance.showParams = (showParamsOld => function(...args){
      args.push('Default Argument');
      return showParamsOld.apply(this, args); 
    })(exampleInstance.showParams);
    
    exampleInstance.showParams('one', 'Two', 'Three', 456);
    Если ответ "да", то поправь сам.

    Только помни, что монки-патчинг это плохо, и к нему стоит прибегать только в крайних случаях.
    Ответ написан
    3 комментария
  • TypeScript. Как собрать объект из массива строк?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    На самом деле чтоб была полноценная типизация надо как-то так:
    getStyles<T extends keyof CSSStyleDeclaration>(styles: readonly T[]) {
      return styles.reduce((res, style) => {
        res[style] = this.$nativeElement.style[style];
        return res;
      }, {} as Pick<CSSStyleDeclaration, T>);
    }

    Песочница.

    Разница с решением от Дмитрий в том, что тип получившегося объекта будет содержать только полученные ключи, а не все возможные в CSSStyleDeclaration.
    Ответ написан
    2 комментария
  • Почему Electronjs не видит экспорты после начала работы?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Пальцем в небо: попробуй в tsconfig module: esnext.
    Ответ написан
    Комментировать
  • Как работает конструкция type t = {...}[keyof T]?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Обычное обращение по ключу, как в javascript, что тут непонятного?
    const foo = {
      bar: 1
    };
    foo['bar'] // 1
    const baz = {
      qux: 2
    }['qux']; // 2
    тайпскрит в работе с типами тут ничем не отличается:
    type user = {
        id: number,
        name: string,
    };
    type id = user['id']; // number
    type userKeys = keyof user; // 'id' | 'name'
    type userTypes = user[keyof user]; // number | string
    тип never же просто не учитывается:
    number | string | never - то же самое что number | string.
    Ответ написан
    1 комментарий
  • Можно ли задать значение по умолчанию для функции, которая зависит от двух типов дженерика?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Есть такия конструкция: foo as unknown as Type - двойным кастованием вы можете скастовать что угодно во что угодно.
    Только вот делать так не надо, эту убивает весь смысл использования TypeScript.
    Вместо этого вам надо прописать условия в "функции по умолчанию", чтоб она работала так, как это описано, а не хрен пойми как.
    Ответ написан
    6 комментариев
  • Как побороть 431-ю ошибку в nuxt-приложении?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Чтоб передать аргументы командной строки в node можно просто проставить переменную окружения NODE_OPTIONS.

    Но правильное решение - не увеличивать лимиты, а разбираться какого хрена у вас так разжирнел заголовок. Толстый заголовок - мусорный трафик - замедление работы.
    Рекламные сети не должны ничего особо писать в ваши куки и utm-параметры вообще не должны летать внутри вашего сайта.
    Берите дамп запроса(из консоли или с сайта) и смотрите что там за мусор, откуда он взялся и как настроить виновника так, чтоб он этот мусор туда не пихал.
    Ответ написан
    1 комментарий
  • Typescript generic function. How use with other types?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Нет, проблем тут куча.

    T extends [], K extends keyof T - K тут что-то производное от number, потому что ключи(keyof) массива([]) - только цифры.
    let resultSort: T = arr; - бессмысленно, так как arr.sort в любом случае меняет исходный массив.
    a[propertyName].toLowerCase() - упадёт если propertyName будет year, т.к. Number не имеет метода toLowerCase.
    ...

    В итоге функция должна выглядеть как-то так:
    function sortArray<T extends {[key: string]: unknown}, K extends keyof T>  (originArr: T[], propertyName: K, cb: (a: T[]) => T[]): T[] {
      let arr: T[] = JSON.parse(JSON.stringify(originArr));  //deep copy array
    
      arr.sort((a, b) => {
        let nameA = String(a[propertyName]).toLowerCase(),
            nameB = String(b[propertyName]).toLowerCase();
    
        if (nameA < nameB)
          return -1;
        if (nameA > nameB)
          return 1;
        return 0;
      });
    
      return cb(arr);
    }


    Можно не приводить строго к String, но тогда вместо unknown надо указать конкретные типы с которыми предполагается работать, и в самой функции сортировки их учесть.
    Ответ написан
    2 комментария
  • Как должен выглядеть объект при пересечении типов?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Напрямую такой тип задать нельзя. Можно вывести тип, использую функцию-прокладку.
    Ответ написан
    Комментировать
  • Как создать простейший пакет npm на typescript для проекта на cordova (ionic)?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Суть какбэ в том, что в npm должен быть javascript. От ts там остаются только декларации. Потому сборка.
    Физически ты можешь сбацать чисто ts пакет (где module и\или main указывают на .ts файл), но проблема тут в том, что у каждого своя версия ts, а также настройки ts-транспилятора и линтера свои, из-за чего у рандомного юзера нихрена не соберёся.
    Если ты делаешь чисто для себя, то такой проблемы не будет. Поначалу. А потом зоопарк обязательно разрастётся и ты всё проклянешь.
    Но в целом, прямо сейчас, тебе ничего не мешает просто сообрать ts файлики в папочку, добавить соответствующий package.json и получить нужный пакет без лишних телодвижений.)

    Простейшая же сборка: tsc -d --outDir ./dist и package.json, смотрящий на результат.
    Ответ написан
    2 комментария