• Ценятся ли программисты-самоучки в странах Евросоюза?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Ценятся профессионалы, всем плевать, как этот профессионализм был получен. Но надо понимать, во-первых, что желающих получить blue card много, а мест мало. Поэтому вам придётся конкурировать с целой кучей профессионалов и при прочих равных шансов больше будет у обладателей дополнительной бумажки. Во-вторых, интерес западных работодателей начинается на том уровне профессионализма, который у очень выдающихся программистов достигается лет через пять работы, а у остальных через десять. То есть ваш год самообразования - вообще ничто.

    P.S. Вопрос на ресурсе задавался уже очень много раз. Для программиста критически важно уметь искать информацию самостоятельно.
    Ответ написан
    8 комментариев
  • Как написать функцию TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Что-то вроде такого можно сделать:
    type TestResult<T extends string[] | CustomClass[]> = T extends CustomClass[] ? T : void;
    function test<T extends string[] | CustomClass[]>(data: T): TestResult<T> {
        if (data[0] instanceof CustomClass) {
          return data as TestResult<T>;
        }
    
        return undefined as TestResult<T>;
    }

    https://www.typescriptlang.org/play?#code/CYUwxgNg...

    Но без приведения типов внутри не обойтись. Ну и как писал WbICHA в комментах, такие типы не безопасны для пустого массива, так как в рантайме типов нет, а значит и нет возможности проверить, какого типа пришел пустой массив.
    Ответ написан
    1 комментарий
  • Я так никогда не выучу React. Что это за ошибка?

    tsepen
    @tsepen
    Frontend developer
    Нельзя выучить Реакт не выучив Джаваскрипт, рекомендую начать с JS, иначе дальше тебя ждет еще очень много сюрпризов
    Ответ написан
    Комментировать
  • Как правильно реализовать дженерик?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    typescriptlang.org/play
    spoiler
    type Alph = 'Q' | 'W' | 'E' | 'R' | 'T' | 'Y' | 'U' | 'I' | 'O' | 'P' | 'A' | 'S' | 'D' | 'F' | 'G' | 'H' | 'J' | 'K' | 'L' | 'X' | 'Z' | 'C' | 'V' | 'B' | 'N' | 'M'
    
    type CamelToSnake<T extends string> = T extends `${infer S1}${Alph}${string}` ? T extends `${S1}${infer S2}` ? `${Lowercase<S1>}_${CamelToSnake<Uncapitalize<S2>>}` : T : T;
    type AsdSnake = CamelToSnake<'asdAsdAsd'> // asd_asd_asd
    
    type SnakeToCamel<T extends string> = T extends `${infer S1}_${infer S2}` ? `${Lowercase<S1>}${Capitalize<SnakeToCamel<S2>>}` : T;
    type AsdCamel = SnakeToCamel<'asd_asd_asd'> // asdAsdAsd
    
    type SnakePropToCamel<T extends PropertyKey> = T extends string ? SnakeToCamel<T> : T;
    type CamelPropToSnake<T extends PropertyKey> = T extends string ? CamelToSnake<T> : T;
    
    let camelToSnakeCase: <T extends PropertyKey>(str: T) => CamelPropToSnake<T>;
    
    type CamelObjectToSnake<T extends {[key: string]: any}> = {
      [K in keyof T as CamelPropToSnake<K>]: T[K]
    }
    
    function camelCaseObject<T extends {[key: string]: any}>(obj: T) {
      return Object.entries(obj)
        .reduce((acc, [key, value]) =>
            (acc[camelToSnakeCase(key as keyof T)] = value, acc),
          {} as CamelObjectToSnake<T>
        )
    }
    
    function camelToSnakeKeysOfArrayObject<T extends Array<{[key: string]: any}>>(arr: T) {
      return arr.map(camelCaseObject) as {
        [K in keyof T]: CamelObjectToSnake<T[K]>
      };
    }

    Основано на варианте WbICHA но поддерживает объекты разных сигнатур, типа:
    camelToSnakeKeysOfArrayObject([{
      aaAa: 1,
      bbBb: true
    }, {
      aaAa: 'ggg'
    }]);
    Ответ написан
    8 комментариев
  • Как исправить ошибку "No overload matches this call" в jest.spyOn на приватном методе?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    jest.spyOn имеет 4 перегрузки, которые отделяют обычные поля (в этих перегрузках есть 3й параметр 'get' | 'set'), методы (функциональный тип на инстансе) и static методы (функциональный тип на самом классе).
    Ваш вызов подразумевает как раз метод.
    Проблема в том, что private и protected поля не матчатся как функциональные типы. Приватные поля вообще не имеют типа за пределами класса, а protected имеют тип только в наследнике.

    Остается только обмануть систему типов:
    declare class ViewHack {
      getPosOnScale(currentPos: number): number;
    }
    describe('some method', () => {
      test('should return smth', () => {
        const view = new View('range-slider', settings);
        jest.spyOn(view as unknown as ViewHack, 'getPosOnScale').mockReturnValue(100);
      });
    });
    Ответ написан
    2 комментария
  • Какой алгоритм вычисления кратности чисел более эффективен?

    Adamos
    @Adamos
    Если нужно определить кратность - то берем учебник Математика, 6 класс.
    Глава Признаки кратности 3, 5 и 9 с минимумом вычислений.
    Если же нужно заполнить массив - то потери времени на его заполнение, да в жабоскрипте, на порядки превышают стоимость этой простенькой проверки.
    Может ускорить (а может и замедлить) этот процесс замена в цикле ++i на прибавление того числа, которое действительно надо прибавить для получения следующего кратного - оно циклично повторяется: [3, 2, 1, 3, 1, 2, 3]. Проверка уберется, но вычислений, на самом деле, только прибавится. Зато без ветвления и пустых циклов.
    Ответ написан
    1 комментарий
  • Где ошибка в коде?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Ошибка в коде ДНК.
    Вставить в PHP фрагмент кода на JavaScript и надеяться, что он заработает - это надо быть альтернативно одарённым человеком.
    Ответ написан
    1 комментарий
  • Почему let x не попадает в window?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Мужик, ну ты хотя бы документацию прочитай, прежде чем вопрос задавать!!!

    Вот с MDN цитата

    На верхнем уровне скриптов и функций let, в отличии от var, не создаёт свойства на глобальном объекте.


    ДОКУМЕНТАЦИЯ!!! – наше всё.
    Ответ написан
    13 комментариев
  • Что сделать, чтобы найти тот самый «баланс»?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    1. Лучше иметь вышку, чем не иметь.
    2. В 99.99% случаев вышка не нужна для работы.
    3. Вышка облегчает поиск первой работы.
    4. Вышка не нужна для эмиграции.

    Доучивайтесь в школе, поступайте в ВУЗ, после первого же семестра начинайте искать летнюю стажировку, пытайтесь устроиться в университетский ВЦ или на кафедру, договаривайтесь курса с 4-го на свободное посещение занятий и выход на полную ставку. Посвящайте свободное время не математике, а изучению прикладных знаний и практике.
    Ответ написан
  • Какие ЯП являются (почти) "мертвыми" и бесперспективными?

    @evgeniy_lm
    Мне лично на ум приходит такие как VBA

    Несколько лет назад общался с одним чудиком который возмущался тем что он "крутой программист" знает туеву хучу "крутых ЯП", но не может найти работу, а его "тупой" одноклассник в буржуйской фирме зашибает бабло на "сраном VBA"

    Не существует "бесперспективных" ЯП, существуют бесперспективные программисты
    Ответ написан
    Комментировать
  • Как получить массив массивов с 2-мя объектами из 2-ух массивов с объектами?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const zip = (...arrs) => arrs[0]?.map((n, i) => arrs.map(m => m[i])) ?? [];
    
    // или
    
    const zip = (...arrs) =>
      arrs.reduce((acc, n, i) => (
        n.forEach((m, j) => (acc[j] ??= [])[i] = m),
        acc
      ), []);
    
    // или
    
    const zip = (...arrs) => Array.from(
      { length: Math.max(...arrs.map(n => n.length)) },
      (n, i) => arrs.map(m => m[i])
    );
    
    
    const arr = zip(arr1, arr2);
    Ответ написан
    1 комментарий
  • Как убедить тайпскрипт, что unknown можно в ReturnType?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    У TypeScript есть ряд проблем с функциональными типами в дженериках из-за их вариантности
    Вот так результат будет аналогичным, но работает без проблем:
    function call<R>(f: () => R): R {
      return f()
    }
    Ответ написан
    5 комментариев
  • Стоит ли идти в NoCode разработку?

    saboteur_kiev
    @saboteur_kiev Куратор тега Карьера в IT
    software engineer
    NoCode это инструменты для тех, кто не умеет кодить, но готов потратить немного времени чтобы сделать какую-то штуку сам для себя.
    Специалисты по NoCode не нужны вообще.
    Если кто-то сделал свой "бизнес" и решил сделать себе сайт-визитку, то благодаря NoCode, не особо криворуким рукам и невысоким требованиям к конечному результату, он сможет сам ее себе сделать в одном из тысяч конструкторов.
    Но такому бизнесмену ты вообще не нужен.

    Поэтому твой вопрос глуп сам по сути. NoCode - это возможность сделать что-то простенькое для себя не привлекая разработчиков вообще и экономя на этом деньги. Зарабатывают в NoCode только создатели подобных конструкторов.
    Ответ написан
    Комментировать
  • Стоит ли идти в NoCode разработку?

    inoise
    @inoise Куратор тега Карьера в IT
    Solution Architect, AWS Certified, Serverless
    No code это не разработка
    Ответ написан
    Комментировать
  • Стоит ли идти в NoCode разработку?

    BorLaze
    @BorLaze
    Java developer
    Как бы вайти в айти, но так, чтобы не учить ничего по айти?
    Ответ написан
    Комментировать
  • Как из массива объектов, вытащить значение по ключу?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Одно значение (первое):

    const val = arr.find(n => n.hasOwnProperty(key))?.[key];

    Все, что есть:

    const vals = arr.reduce((acc, n) => (n.hasOwnProperty(key) && acc.push(n[key]), acc), []);
    Ответ написан
    Комментировать
  • Существует ли "отзовик по фирмам" в ИТ сообществе?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Во-первых, отзывы чаще пишут недовольные. Так что вы можете увидеть десять негативных отзывов, не увидеть тысячу позитивных и сформировать неверное представление о компании. Во-вторых, сидящие на дереве птицы не боятся, что под ними сломается ветка, не потому, что верят в ветку, а потому, что верят в свои крылья. Развивайте собственный профессионализм и сможете диктовать условия при заключении трудового договора и требовать его соблюдения от любой компании, либо мгновенно менять провинившуюся компанию.
    Ответ написан
    3 комментария
  • Как оптимизировать код?

    Alexandroppolus
    @Alexandroppolus
    кодир
    function sumNumbers(maxNumber) {
        const buf = new Int8Array(maxNumber);
        let answer = maxNumber > 2 ? 2 : 0;
        for(let i = 3; i < maxNumber; i += 2) {
            if (buf[i] === 1) {
                continue;
            }
            answer += i;
            const i2 = i * 2;
            for(let j = i * i; j < maxNumber; j += i2) {
                buf[j] = 1;
            }
        }
        
        return answer;
    }
    Ответ написан
    3 комментария
  • Как сочетаются наследование и дженерики?

    sarapinit
    @sarapinit
    Точу водой камень
    Вот например:
    class Result<T>{
      public readonly result;
      constructor(result: T){
        this.result = result;
      }  
    }
    
    class NumberResult extends Result<number>{
      constructor(result: number){
        super(result);
      }
    
      public ResultPlusOne(){
        return this.result + 1;
      }
    }


    Result<T> - это открытый дженерик, то есть в будущем на месте T должен быть указан другой\типы или типы для того чтобы создавать экземпляры класса.
    Если мы захотим, например, на место Т поставить number и создать экземпляр класса
    let result = new Result<number>(42)
    то компилятор для этого создаст закрытый дженерик который будет выглядеть примерно так, но вы его нигде не увидите:
    class Result{
      public readonly result;
      constructor(result: number){
        this.result = result;
      }  
    }


    Запись class NumberResult extends Result<number>
    Означает наследование от такого класса Result в котором на место T уже подставлен конкретный тип
    Ответ написан
    8 комментариев
  • Как сочетаются наследование и дженерики?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Классы в TypeScript могут быть дженериками, то есть параметризованы неким типом (или даже несколькими типами). При наследовании нужно передавать такой параметр явно, чтоб TypeScript знал, что подставить на место обобщенного типа.
    class Base<T> {
      protected val: T;
    }
    
    class A extends Base<string> {
      methodA(): string {
        return this.val; // Ok, так как здесь val имеет тип string
      }
    }
    
    class B extends Base<number> {
      methodB(): number {
        return this.val; // тоже ok, так как здесь val имеет тип number
      }
    }
    Ответ написан
    8 комментариев