• Что творится с контекстом внутри ES6 классов?

    lastuniverse
    @lastuniverse Автор вопроса
    Ваша гипотеза о неготовности объекта полностью подтвердилась
    class ClassA {
        constructor() {
            this.#methodA();
            this.init();
        }
    
        init() {
    
        }
    
        #methodA() {
            console.log('in ClassA.#methodA');
        }
    }
    const a = new ClassA(); // все отлично
    
    class ClassC extends ClassA {
        init() {
            setImmediate(()=>{
                this.#methodC();
            })
            
        }
    
        #methodC() {
            console.log('in ClassC.#methodC');
        }
    }
    const c = new ClassC(); // все отлично
    Написано
  • Что творится с контекстом внутри ES6 классов?

    lastuniverse
    @lastuniverse Автор вопроса
    Похоже проблема была в банальной неготовности объекта

    class ClassA {
        constructor() {
            this.#methodA();
            this.init();
        }
    
        init() {
    
        }
    
        #methodA() {
            console.log('in ClassA.#methodA');
        }
    }
    const a = new ClassA(); // все отлично
    
    class ClassC extends ClassA {
        init() {
            setImmediate(()=>{
                this.#methodC();
            })
            
        }
    
        #methodC() {
            console.log('in ClassC.#methodC');
        }
    }
    const c = new ClassC(); // все отлично
    Написано
  • Что творится с контекстом внутри ES6 классов?

    lastuniverse
    @lastuniverse Автор вопроса
    Посмотрел. Ситуация похожая, но:
    1. для статических методов.
    2. она обратная моей. То есть в пункте 6.2 как раз и показано, что вызов метода производится в пространстве SubClass-а. И именно такого поведения я ожидаю в моем примере - вызова метода init в пространстве класса ClassC

    В общем что то не то происходит с JS)))))
    Написано
  • Что творится с контекстом внутри ES6 классов?

    lastuniverse
    @lastuniverse Автор вопроса
    Ох, спасибо большое, пойду изучать.
    Написано
  • Что творится с контекстом внутри ES6 классов?

    lastuniverse
    @lastuniverse Автор вопроса
    Спасибо, тоже уже 2 дня копаюсь в спеках, пока еще сохраняю надежду что это баг а не фича, возникший из-за сырости реализации приватных методов и свойств.
    Написано
  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    Спасибо за развернутое пояснение.

    И да, пожалуйста, давай на "ты".) А то начинаю чувствовать себя мудрым старцем.)

    WbICHA, да не вопрос))))

    А вопрос ... он сейчас вот в чем :))

    Есть задачка
    Last of Array

    Implement a generic Last that takes an Array T and returns its last element.

    For example

    type arr1 = ['a', 'b', 'c']
    type arr2 = [3, 2, 1]
    
    type tail1 = Last<arr1> // expected to be 'c'
    type tail2 = Last<arr2> // expected to be 1



    Мое решение
    type Last<T extends any[]> = [any,...T][T['length']]


    и то как ее решали другие
    https://github.com/type-challenges/type-challenges...

    типовое решение
    type Last<T extends any[]> = T extends [...any, infer R] ? R : never;


    Я пока еще очень поверхностно все понимаю и не вижу минусов своего решения, но гложут сомнения, ведь миллионы мух не могут ошибаться))))

    В общем чем плохо мое решение? И почему преимущественное большинство решают типовым способом?
  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    WbICHA, и вот еще момент. Подскажите если не сложно.

    export type IsAny<T> = 0 extends 1 & T ? true : false


    правильно ли я понимаю:
    1. 0 extends 1 extends здесь не расширение нуля еденицей а проверка является ли ноль подмножеством множества единица? (Все что нашел про extends в TS https://metanit.com/web/typescript/3.2.php, но оно немного не вяжется у меня в голове с вышеуказанным применением)
    2. что у extends приоритет меньше чем у &? (где можно почитать какие операторы и используются в объявлении типов и о правилах их применения)
  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    WbICHA, приступил к тайп челенжу. Первое же задание сломало мне мозг))))

    написал ответ
    type HelloWorld = string
    и полез разбираться как работают вот эти штуки
    import type { Equal, Expect, NotAny } from './test-utils'
    .

    Сломался на самой первой и простой конструкции
    export type IsAny<T> = 0 extends 1 & T ? true : false


    Благо в коде test-utils, была дана ссылка https://stackoverflow.com/questions/49927523/disal..., в которой все разжевано.

    В общем такой вопрос возник, стоит ли по вашему мнению на этапе прохождения челенджа загоняться и для более глубокого погружения ковырять все эти файлы с утилитами и прочим из состава type-challenges или в процессе прохождения челенжа все эти моменты будут раскрыты в самих заданиях?
  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    WbICHA, спасибо. Пока освоил ну очень поверхностное описание, но в нем очень многого нет, так что type-challenges как раз в тему.
  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    WbICHA, спасибо за уделенное время.

    Всего второй день втыкаюсь в TS, так что многое для меня сейчас воспринимается по принципу "не понимаешь как работает - не трогай"))))

    end: [undefined];
    WbICHA, да в массив обернул для стандартизации, а убрать undefined не сообразил, другое в голове крутилось)))

    За мысль про интерфейс спасибо, пока больше плаваю чем работаю, понемногу разбираюсь в хитросплетениях TS и по мере обретения понимания что и за чем исправляю/дорабатываю/перерабатываю.

    PS: В общем у меня пока по TS впечатление больше негативное, тем позитивное. Весь TS воспринимается как попытка воткнуть еще один JS с альтернативным синтаксисом, который перемешан с основным кодом и выковыривается из него на стадии транспиляции, преобразовывается в нативный js и выполняется до сборки. (интерфейс тот же объект, type - обычная переменная с объектом, описывающим тип, и т.д.) А так как цель этого альтернативного JS - простая проверка типов, перемешанная с кодом. Не пойму почему то же самое нельзя было сделать отдельным файлом, на подобии d.ts, с синтаксисом обычного JS слегка расширенного механиками проверок. Получили бы что человек знающий js без проблем писал бы проверки типов на том же js)))
    Например как то так

    Этот пример конечно убогий,но суть идеи демонстрирует

    aaa.header.ts
    declare type EventName = 'string'
    
    declare type EventKey = function(initType, itemType){
       // обычный js работающий с обычными переменными initType, itemType и формирующий результат
    }
    
    declare type EventReceiver = (initType, itemType)=>{
       // обычный js работающий с обычными переменными initType, itemType и формирующий результат
    }
    
    declare type ListenerParams = (initType, itemType, itemIndex,...,eventName)=>{
       // обычный js работающий с обычными переменными initType, itemType, itemIndex, eventName и формирующий результат
    }
    
    declare type EmiterEvents = {
        data: [string, number],
        end: []
    }


    aaa.ts
    export class MyEmitter{
        private emitter = new ExtendEventEmitter();
        on(eventName: EventName, fn: EventReceiver) {...}
        emit(eventName: EventName, ...params: ListenerParams(eventName))  {...}
        ...
    }
    
    const emitter = new MyEmitter: EmiterEvents ();

  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    WbICHA, ну и при наличии у вас желания и возможности был бы рад фидбеку по коду (как можно делать, и как лучше не делать). Сам я пока еще не вижу нюансов.

    import ExtendEventEmitter from '../libs/class.extend.event.emitter'
    
    type EventMap = Record<string, any>;
    type EventKey<T extends EventMap> = string & keyof T;
    
    type EventReceiver<T extends unknown[]> = (...params: T ) => void;
    type FeatureOptions0 = EventReceiver<[string, number]>
    
    interface Emitter<T extends EventMap> {
        on<K extends EventKey<T>>
            (eventName: K, fn: EventReceiver<T[K]>): void;
        once<K extends EventKey<T>>
            (eventName: K, fn: EventReceiver<T[K]>): void;
        off<K extends EventKey<T>>
            (eventName: K, fn: EventReceiver<T[K]>): void;
        emit<K extends EventKey<T>>
            (eventName: K, ...params: T[K]): void;
    }
    
    export class MyEmitter<T extends EventMap> implements Emitter<T> {
        private emitter = new ExtendEventEmitter();
        on<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>) {
            this.emitter.on(eventName, fn);
        }
        once<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>) {
            this.emitter.once(eventName, fn);
        }
        off<K extends EventKey<T>>(eventName: K, fn: EventReceiver<T[K]>) {
            this.emitter.off(eventName, fn);
        }
        emit<K extends EventKey<T>>(eventName: K, ...params: T[K]) {
            this.emitter.emit(eventName, params);
        }
    }
    
    const emitter = new MyEmitter<{
        data:  [string, number];
        end: [undefined];
    }>();
    
    emitter.on('end', () => {}); // ok
    
    emitter.on('data', (a: string, f:number) => {}); // ok
    emitter.on('data', (a: string) => {}); // ok
    emitter.on('data', (a: string, f:string) => {}); // error
    emitter.on('data', (a: boolean) => {}); // error
    
    emitter.emit('data', 'aaa', 1); // ok
    emitter.emit('data', 'aaa'); // error
    emitter.emit('data', 'aaa', 'bbb'); // error
  • Как исправить ошибку при декомпозиции кортежа?

    lastuniverse
    @lastuniverse Автор вопроса
    WbICHA, большое спасибо, вы меня выручили.

    Не подскажете еще один момент. Очень хочется использовать EventEmmiter, нашел такую реализацию обертки https://rjzaworski.com/2019/10/event-emitters-in-t...

    Вот в принципе ее и дорабатывал до состояния, когда можно указать обработчикам событий несколько параметров разных типов. Благодаря вам все получилось
    633d9df6856c7066321623.png

    Но возможно так делать не принято и сейчас предпочтительнее принципиально другой подход. В общем буду благодарен если просветите по этой теме.
  • Багнулась тень в блендер, как исправить?

    lastuniverse
    @lastuniverse
    перейти в режим рендера. или продолжать работать в режиме solid и забить, все равно в рендере все нормально будет.
  • Почему pug неправильно вставляет переменные, содержащие киррилицу?

    lastuniverse
    @lastuniverse
    Пересохраните все файлы вашего проекта в кодировке utf-8, а так же проследите чтобы все данные,приходящие из вне были либо в utf-8 либо в нее преобразовывались. Так же установите кодировку страницы <meta charset="utf-8">.
  • Как сохранять изменения при перезагрузке страницы (vanilla JS)?

    lastuniverse
    @lastuniverse
    toffuffee, если сами не можете переделать то вот вам вариант без jquery

  • Как сохранять изменения при перезагрузке страницы (vanilla JS)?

    lastuniverse
    @lastuniverse
    toffuffee, логично, на кодепен использовал jquery чтобы обработчик установить
    $('body').on('change', '.check', ........
  • Как перезапускать код при определенном условии в JS?

    lastuniverse
    @lastuniverse
    Это не ответ, просто альтернативный вариант решения задачи (для расширения кругозора так сказать)

    1. ввод трех чисел в массив
    var arr = ['A', 'B', 'C'].map(key=>{
       return Math.round(+prompt(`Введите целое число ${key}:`));
    }


    2. сортировка массива по возрастанию
    arr = arr.sort((a,b)=>a - b;)

    3. вычисления:
    var doubleDifference = 2 * ( arr[2] - arr[0] ); // удвоенная разность
    var productNumbers = 2 * ( arr[0] - arr[1] );  // произведение


    4. сравнение полученных результатов и вывод сообщений (тут ваш код вполне ситуативен и альтернативный подход я не покажу)

    Ну и по сути вопроса смотрите комментарий от низкомолекулярный макрос )))
  • Как отрисовывать линию в сторону курсора всегда фиксированной длинны?

    lastuniverse
    @lastuniverse
    ну и думаю тут
    // рисуем линию из (cx, cy) в (bx, by)

    нужно все таки так
    // рисуем линию из (cx, cy) в (cx+bx, cy+by)
  • Как отрисовывать линию в сторону курсора всегда фиксированной длинны?

    lastuniverse
    @lastuniverse
    Парень пропорции не понимает, а вы ему нормализацию вектора через тригонометрию подсовываете ))))