3,9 Мб, mp4,
224x224, 1:42
224x224, 1:42
Хочу сколотить капитал. И учиться.
54 Кб, 1279x697
Решал очередную задачу по Тайпскрипту - аж 33 минуты! Сайт ни в какую не хотел принимать мой, написанный за 2 минуты, изначальный вариант - "Record<infer K, any>...[K] extends [never]": не проходил тест с "object". Пришлось проверять [keyof T] и Record<_, any> поменять на Record<_, string>. Почему-то это сработало. Подбирал комбинаторно.
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
Снова Тайпскрипт.
Первую задачу решил слёту. Она простая.
Над второй сидел больше 20 минут, пытаясь решить через вереницу тернарных операторов, отсеивая тип за типом. Никак не получалось отличать "never" от "any". В итоге нашел объяснение в Интернете. Проверка через условные типы - "0 extends (1 & T)" - работает для any: почему-то Тайпскрипт мёрджит "1 & any" -> "any", поэтому срабатывает проверка "0 extends any". С остальными типами единица остаётся.
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
Первую задачу решил слёту. Она простая.
Над второй сидел больше 20 минут, пытаясь решить через вереницу тернарных операторов, отсеивая тип за типом. Никак не получалось отличать "never" от "any". В итоге нашел объяснение в Интернете. Проверка через условные типы - "0 extends (1 & T)" - работает для any: почему-то Тайпскрипт мёрджит "1 & any" -> "any", поэтому срабатывает проверка "0 extends any". С остальными типами единица остаётся.
Сегодня ничего не заработал.
money:
wallet - [0_000] RUB
crypto - [0_000] $
>>1814
Разобрался. "any" - супертип и поглощает (расширяет) все подтипы в юнитах.
В документации написано на примере строки общим типом и константых строк. Запустил пример в плейграунде.
На сегодня всё.
Разобрался. "any" - супертип и поглощает (расширяет) все подтипы в юнитах.
В документации написано на примере строки общим типом и константых строк. Запустил пример в плейграунде.
На сегодня всё.
Тайпскрипт. Три задачки.
Первая задача тривиальная.
Решение для второй задачи написал сразу, но тесты не проходили. Спустя 12 минут добавил значение по умолчанию для третьего типа (A extends any[] = []) - и всё прошло.
Третья задача тоже простая, но снова не понятно, почему он не подхватывает "infer F as string" и "...infer R as string[]", если изначально "T extends string[]". Может в следующих версиях исправят.
Сегодня заработал 10 000 рублей - 8 000 рублей в копилку.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Первая задача тривиальная.
Решение для второй задачи написал сразу, но тесты не проходили. Спустя 12 минут добавил значение по умолчанию для третьего типа (A extends any[] = []) - и всё прошло.
Третья задача тоже простая, но снова не понятно, почему он не подхватывает "infer F as string" и "...infer R as string[]", если изначально "T extends string[]". Может в следующих версиях исправят.
Сегодня заработал 10 000 рублей - 8 000 рублей в копилку.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Две задачи.
Над первой пришлось немного покумекать, но в целом ничего сложного. Не сразу сообразил, как правильно решить через рекурсию. Надо было увеличивать как результирующее множество, так и множество-счетчик.
Вторая задача посложнее. Проверяем, дошли ли мы в итерации по кортежу до конца: 1. если да - возвращаем множество-аккумулятор; 2. если нет - проверяем, совпадает ли текущий тип с заданным (через строгое сравнение); 2.1. если совпадает - добавляем тип в множество-аккумулятор и вызываем проверку рекурсивно с оставшимися типами; 2.2 если не совпадает - оставляем множество-аккумулятор в прежнем состоянии и вызываем проверку рекурсивно с оставшимися типами.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Над первой пришлось немного покумекать, но в целом ничего сложного. Не сразу сообразил, как правильно решить через рекурсию. Надо было увеличивать как результирующее множество, так и множество-счетчик.
Вторая задача посложнее. Проверяем, дошли ли мы в итерации по кортежу до конца: 1. если да - возвращаем множество-аккумулятор; 2. если нет - проверяем, совпадает ли текущий тип с заданным (через строгое сравнение); 2.1. если совпадает - добавляем тип в множество-аккумулятор и вызываем проверку рекурсивно с оставшимися типами; 2.2 если не совпадает - оставляем множество-аккумулятор в прежнем состоянии и вызываем проверку рекурсивно с оставшимися типами.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
19 Кб, 715x261
>>2066
1. [any] extends [number] ? 1 : 2; // 1
2. any extends number ? 1 : 2; // 1 | 2
Я так и не смог разобраться, почему без скобок запиналось на "any extends number" во второй задаче. Эх, вот бы кто-нибудь умный объяснил...
1. [any] extends [number] ? 1 : 2; // 1
2. any extends number ? 1 : 2; // 1 | 2
Я так и не смог разобраться, почему без скобок запиналось на "any extends number" во второй задаче. Эх, вот бы кто-нибудь умный объяснил...
22 Кб, 523x246
>>2071
Вот такой результат без скобок "[1, 2] | [1, 2, any]". Со скобками же множества объединяются "(1 | 2 | any)[]" - правильно понял?
Вот такой результат без скобок "[1, 2] | [1, 2, any]". Со скобками же множества объединяются "(1 | 2 | any)[]" - правильно понял?
Тайпскрипт. Две задачи.
За 15 минут подобрал элегантное решение для первой задачи. Интересно, можно ли это решить без внедрения счётчика.
Вторую задачу решил безобразно, топорно, в лоб, но зато за 5 минут. В этом решении можно было бы вынести логику увеличения счётчика отдельно, так как она повторяется для каждого слагаемого. Опять-таки, хотелось бы найти решение без счётчиков, но пока не получается.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
За 15 минут подобрал элегантное решение для первой задачи. Интересно, можно ли это решить без внедрения счётчика.
Вторую задачу решил безобразно, топорно, в лоб, но зато за 5 минут. В этом решении можно было бы вынести логику увеличения счётчика отдельно, так как она повторяется для каждого слагаемого. Опять-таки, хотелось бы найти решение без счётчиков, но пока не получается.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Две задачи.
Первая задача решена за 4 минуты. После прочтения примечания "we can just consider smaller numbers" решение сразу прилетело в голову.
Над второй задачей бился 30 минут, так и не решив. Почему не проходят тесты? Должно же вернуться пересечение "A & B & C", а возвращается объединение "A | B | C". Вот бы подсказочку. Оставлю на завтра.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
>>2257
https://bigfrontend.dev/
Первая задача решена за 4 минуты. После прочтения примечания "we can just consider smaller numbers" решение сразу прилетело в голову.
Над второй задачей бился 30 минут, так и не решив. Почему не проходят тесты? Должно же вернуться пересечение "A & B & C", а возвращается объединение "A | B | C". Вот бы подсказочку. Оставлю на завтра.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
>>2257
https://bigfrontend.dev/
51 Кб, 1278x727
Тайпскрипт. Одна вчерашняя нерешенная задача.
"Разобрался" со вчерашней задачей. Вот такое неочевидное решение.
Больше не получилось - сайт упал.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
"Разобрался" со вчерашней задачей. Вот такое неочевидное решение.
Больше не получилось - сайт упал.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Поскольку вчера BFE внезапно отвалился и был недоступен несколько часов, параллельно начал решать задачи на "type-challanges". Вообще, Тайпскрипту не хочу уделять больше двух месяцев, поэтому постепенно буду увеличивать количество решаемых задач в день. Небольшой прогресс ощущается. Две задачи.
Обе задачи простые, похожие уже попадалась на BFE.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Обе задачи простые, похожие уже попадалась на BFE.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Одна клятая задача.
Около часа решал. Разъясните, почему моё решение не проходит тесты на BFE? В TS Playground всё отлично. Версии компилятора разнятся? Что именно не так? Поскольку в плейграунде тесты успешно прошли, засчитаю как решённую.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Около часа решал. Разъясните, почему моё решение не проходит тесты на BFE? В TS Playground всё отлично. Версии компилятора разнятся? Что именно не так? Поскольку в плейграунде тесты успешно прошли, засчитаю как решённую.
Сегодня ничего не заработал.
money:
wallet - [8_000] RUB
crypto - [0_000] $
Тайпскрипт. Три задачи.
Equal. Проверка на соответствие двух типов через два симметричных кортежа. Решение подсмотрел. Эта проверка пригодилась бы в предыдущей задаче, где нужно было найти индекс элемента в кортеже. У меня было другое решение - более громоздкое. Проблему в таких проверках составляют два типа: "never" и "any".
TupleToObject. Принимаем кортеж типа PropertyKey и через T[number] получаем объединение всех элементов кортежа, через которые итерируется - [K in T[number]].
First. Совсем всё просто: если кортеж пустой (т.е T['length'] extends 0) - возвращаем "never", если есть хотя бы один элемент - возвращаем первый (T[0]).
Equal. Проверка на соответствие двух типов через два симметричных кортежа. Решение подсмотрел. Эта проверка пригодилась бы в предыдущей задаче, где нужно было найти индекс элемента в кортеже. У меня было другое решение - более громоздкое. Проблему в таких проверках составляют два типа: "never" и "any".
TupleToObject. Принимаем кортеж типа PropertyKey и через T[number] получаем объединение всех элементов кортежа, через которые итерируется - [K in T[number]].
First. Совсем всё просто: если кортеж пустой (т.е T['length'] extends 0) - возвращаем "never", если есть хотя бы один элемент - возвращаем первый (T[0]).
Тайпскрипт. Три задачи.
Trim. После своего решения, посмотрел другие. Проверку можно было делать не по отдельности, а атомарно - "T extends ` ${String}` |`${String} `". Я до такого не догадался.
ReplaceAll. Решил через добавление результирующего типа, которое по умолчанию пустая строка. Пришлось добавить ещё одну проверку (S extends Tail) на случай, когда BFE добавлял пустую строку и моё решение бесконечно вызывалось через рекурсию, потому что хвост не укорачивался. Посмотрел другие решения. Можно было решать без добавления дополнительного типа. Не догадался из-за неочевидного поведения такой конструкции: "S extends `${infer A}${F}${infer B}`". Чему будет равно A? Логично предположить, что первому символу в строке, но по какой-то причине возвращается пустая строка и первый символ магнитится к F. Это из-за "infer". Но всё равно выходит магия Тайпскрипта. Запутался. Добавил в закладки материал на эту тему, почитаю позже.
Exclude. Ну здесь вообще элементарно. Когда мы проверяем объединение через "extends", проверка осуществляется итеративно по каждому отдельному члену. Возвращается тоже объединение, но при этом "never" в объединении игнорируется. Поэтому всё выполняется как надо.
>>2919
JS изучал, но он в TS совсем не помощник.
Trim. После своего решения, посмотрел другие. Проверку можно было делать не по отдельности, а атомарно - "T extends ` ${String}` |`${String} `". Я до такого не догадался.
ReplaceAll. Решил через добавление результирующего типа, которое по умолчанию пустая строка. Пришлось добавить ещё одну проверку (S extends Tail) на случай, когда BFE добавлял пустую строку и моё решение бесконечно вызывалось через рекурсию, потому что хвост не укорачивался. Посмотрел другие решения. Можно было решать без добавления дополнительного типа. Не догадался из-за неочевидного поведения такой конструкции: "S extends `${infer A}${F}${infer B}`". Чему будет равно A? Логично предположить, что первому символу в строке, но по какой-то причине возвращается пустая строка и первый символ магнитится к F. Это из-за "infer". Но всё равно выходит магия Тайпскрипта. Запутался. Добавил в закладки материал на эту тему, почитаю позже.
Exclude. Ну здесь вообще элементарно. Когда мы проверяем объединение через "extends", проверка осуществляется итеративно по каждому отдельному члену. Возвращается тоже объединение, но при этом "never" в объединении игнорируется. Поэтому всё выполняется как надо.
>>2919
JS изучал, но он в TS совсем не помощник.
Тайпскрипт. Две задачи.
MyAwaited. Не проходили тесты на проверку по простому Promise (т.к "{ then: (onfulfilled: (arg: number) => any) => any }"- тоже промис). Нужно было использовать встроенный тип PromiseLike.
If. Без комментариев.
Прочитал в руководстве статью "Template Literal Types" и "Using type predicates".
Основное:
- если передать объединение в строковой шаблон, вернется новое объединение с каждым интерполированным членом старого объединения: `${A | B}_str` => 'A_str' | 'B_str';
- два встроенных полезных типа: Uppercase<string> и Lowercase<string>;
- можно проверять неизвестные типы через предикат: (arg): arg is MyType => {...} - это полезно, когда мы получаем неизвестные данные (с какого-нибудь эндпоинта, в котором мы не уверены) и нам нужно провалидировать эти данные;
- полезный метод assert(...), заимствованный из C: сначала объявляем "declare function assert(value: unknown): asserts value;" (т.ё asserts value is true), а потом используем "assert(1 === 2)" - выкинет ошибку во время компиляции.
Про поведение с "infer" в руководстве не нашёл.
В следующие дни пробегусь по "release-notes" начиная с версии 3.5.
MyAwaited. Не проходили тесты на проверку по простому Promise (т.к "{ then: (onfulfilled: (arg: number) => any) => any }"- тоже промис). Нужно было использовать встроенный тип PromiseLike.
If. Без комментариев.
Прочитал в руководстве статью "Template Literal Types" и "Using type predicates".
Основное:
- если передать объединение в строковой шаблон, вернется новое объединение с каждым интерполированным членом старого объединения: `${A | B}_str` => 'A_str' | 'B_str';
- два встроенных полезных типа: Uppercase<string> и Lowercase<string>;
- можно проверять неизвестные типы через предикат: (arg): arg is MyType => {...} - это полезно, когда мы получаем неизвестные данные (с какого-нибудь эндпоинта, в котором мы не уверены) и нам нужно провалидировать эти данные;
- полезный метод assert(...), заимствованный из C: сначала объявляем "declare function assert(value: unknown): asserts value;" (т.ё asserts value is true), а потом используем "assert(1 === 2)" - выкинет ошибку во время компиляции.
Про поведение с "infer" в руководстве не нашёл.
В следующие дни пробегусь по "release-notes" начиная с версии 3.5.
Тайпскрипт. Две задачи и release-notes 3.5.
Concat. Конкатенация кортежей. Пришлось добавить свойство "readonly" т.к компилятор ругался на "[1] as const", когда было просто "T extends any".
Includes. Вхождение в кортеж. Решение простое, но если заглянуть в обсуждение к этой задаче, можно найти ещё одно экзотическое сравнение на соответствие двух типов (Equal): "(<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false".
Прочитал про отличия "any" от "unknown". Как понял, "any" - отключает вообще проверку типизации, а "unknown" - тоже отключает, но делает это более безопасно: "unknown" нельзя присвоить в любой другой тип (в отличии от any) и нельзя вызвать свойство/метод у "unknown". Пока что понимание такое.
release-notes/typescript-3-5.html:
- оптимизирована компиляция, увеличена скорость (в project references?);
- появился встроенный Omit-тип, который исключает свойство;
- добавлено глобальное объявление типов для UMD-модулей (без тройного слеша)?.
Concat. Конкатенация кортежей. Пришлось добавить свойство "readonly" т.к компилятор ругался на "[1] as const", когда было просто "T extends any".
Includes. Вхождение в кортеж. Решение простое, но если заглянуть в обсуждение к этой задаче, можно найти ещё одно экзотическое сравнение на соответствие двух типов (Equal): "(<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2) ? true : false".
Прочитал про отличия "any" от "unknown". Как понял, "any" - отключает вообще проверку типизации, а "unknown" - тоже отключает, но делает это более безопасно: "unknown" нельзя присвоить в любой другой тип (в отличии от any) и нельзя вызвать свойство/метод у "unknown". Пока что понимание такое.
release-notes/typescript-3-5.html:
- оптимизирована компиляция, увеличена скорость (в project references?);
- появился встроенный Omit-тип, который исключает свойство;
- добавлено глобальное объявление типов для UMD-модулей (без тройного слеша)?.
Тайпскрипт. Две задачи и release-notes 3.6.
Parameters. Кортеж типов параметров функции. Используем infer и остаточные параметры. Ничего нового.
Slice. Срез элементов кортежа. Получилось непросто. Пришлось задействовать проверку LessThan (которую уже реализовывал в предыдущей задаче). Своим решением доволен. В первый день я бы такое не решил - прогресс налицо.
На этом этапе все задачи из секции "easy" решены. Впереди "medium".
release-notes/typescript-3-6.html:
- добавили проверку возвращаемого типа функцией-генератором;
- улучшили развёртывание через array spread;
- добавили проверку на наличие дженерика "Promise<T>".
Parameters. Кортеж типов параметров функции. Используем infer и остаточные параметры. Ничего нового.
Slice. Срез элементов кортежа. Получилось непросто. Пришлось задействовать проверку LessThan (которую уже реализовывал в предыдущей задаче). Своим решением доволен. В первый день я бы такое не решил - прогресс налицо.
На этом этапе все задачи из секции "easy" решены. Впереди "medium".
release-notes/typescript-3-6.html:
- добавили проверку возвращаемого типа функцией-генератором;
- улучшили развёртывание через array spread;
- добавили проверку на наличие дженерика "Promise<T>".
109 Кб, 1055x742
Тайпскрипт. Одна задача и release-notes 3.7.
Last of Array. Первым пришло в голову такое решение. Хотя имеется альтернативное - "type Last<T extends any[]> = T extends [...infer _, infer B] ? B : never".
Стали попадаться задачи, которые уже решал. Проскакиваю их. Ожидал большего от "medium". От этих задач уже мало проку, надеюсь на изменения по мере увеличения сложности.
release-notes/typescript-3-7.html:
- добавили "optianal chaining" (foo?.bar.baz());
- добавили нулевой оператор (foo ?? bar());
- добавили assertion (assert(someValue === 42)), который делает проверку на этапе компиляции;
- добавили возможность через флаг "--declaration", который позволяет автоматически генерировать d.ts из исходников .js, используя JSDoc;
- возможность игнорировать проверку всего файла через комментарий "// @ts-nocheck".
Last of Array. Первым пришло в голову такое решение. Хотя имеется альтернативное - "type Last<T extends any[]> = T extends [...infer _, infer B] ? B : never".
Стали попадаться задачи, которые уже решал. Проскакиваю их. Ожидал большего от "medium". От этих задач уже мало проку, надеюсь на изменения по мере увеличения сложности.
release-notes/typescript-3-7.html:
- добавили "optianal chaining" (foo?.bar.baz());
- добавили нулевой оператор (foo ?? bar());
- добавили assertion (assert(someValue === 42)), который делает проверку на этапе компиляции;
- добавили возможность через флаг "--declaration", который позволяет автоматически генерировать d.ts из исходников .js, используя JSDoc;
- возможность игнорировать проверку всего файла через комментарий "// @ts-nocheck".
Тайпскрипт. Три задачи и release-notes.
Promise.all. Наконец что-то сложное! Во-первых, уже нужно было не создать тип/интерфейс, а объявить метод. Во-вторых, избавляемся от объединения через "[...T]". В-третьих, используем встроенный тип Awaited, который рекурсивно извлекает возвращаемый тип у промиса.
release-notes/typescript-3-8.html:
- добавили type-only imports/exports - "import/export type { SomeThing } from "./some-module.js"";
- добавили инкапсуляцию полей через # у классов (как у наивного EcmaScript);
- доступен top-level await внутри модуля (export {}; => await f()).
Promise.all. Наконец что-то сложное! Во-первых, уже нужно было не создать тип/интерфейс, а объявить метод. Во-вторых, избавляемся от объединения через "[...T]". В-третьих, используем встроенный тип Awaited, который рекурсивно извлекает возвращаемый тип у промиса.
release-notes/typescript-3-8.html:
- добавили type-only imports/exports - "import/export type { SomeThing } from "./some-module.js"";
- добавили инкапсуляцию полей через # у классов (как у наивного EcmaScript);
- доступен top-level await внутри модуля (export {}; => await f()).
Тайпскрипт. Две задачи и release-notes.
Trim. Задача уже попадалась на BFE. В этот раз решение чище.
Capitalize. Возведение первого символа в верхний регистр.
Нашел интерфейс нормальный на гитхабпейджес. Следующие задачи попробую решать через него.
release-notes/typescript-3-9.html:
- пофиксии типизацию возвращаемых значений Promice.all/race;
- добавлена проверка "// @ts-expect-error" - выводит ошибку, когда её нет, и игнорирует, когда она есть;
- добавлен not-null aseertion оператор (foo!.baz).
Trim. Задача уже попадалась на BFE. В этот раз решение чище.
Capitalize. Возведение первого символа в верхний регистр.
Нашел интерфейс нормальный на гитхабпейджес. Следующие задачи попробую решать через него.
release-notes/typescript-3-9.html:
- пофиксии типизацию возвращаемых значений Promice.all/race;
- добавлена проверка "// @ts-expect-error" - выводит ошибку, когда её нет, и игнорирует, когда она есть;
- добавлен not-null aseertion оператор (foo!.baz).
Тайпскрипт. Две задачи и release-notes.
Воспользовался интерфейсом, который написан на React и развернут на Github Pages.
Деньги пока не копятся, нужно это исправить с начала следующего года.
release-notes/typescript-4-0.html:
- добавлена возможность использовать spread-оператор вместе с дженериком (я уже пользовался этим в решении предыдущей задачи), чтобы описывать функции с переменным количеством аргументов;
- добавлены Labeled Tuple Elements (foo(...args: [first: string, second: number]));
- добавлены короткие операторы присвоения типа таких - (values ??= []) и (a ||= b) - очень полезно (проверил, они, оказывается, и в нативном JS есть);
- установили catch-error в unknown по умолчанию вместо any;
- добавили фишки в редактор кода с автоматическим редактированием.
Воспользовался интерфейсом, который написан на React и развернут на Github Pages.
Деньги пока не копятся, нужно это исправить с начала следующего года.
release-notes/typescript-4-0.html:
- добавлена возможность использовать spread-оператор вместе с дженериком (я уже пользовался этим в решении предыдущей задачи), чтобы описывать функции с переменным количеством аргументов;
- добавлены Labeled Tuple Elements (foo(...args: [first: string, second: number]));
- добавлены короткие операторы присвоения типа таких - (values ??= []) и (a ||= b) - очень полезно (проверил, они, оказывается, и в нативном JS есть);
- установили catch-error в unknown по умолчанию вместо any;
- добавили фишки в редактор кода с автоматическим редактированием.
93 Кб, 1264x783
Тайпскрипт. Одна задача и release-notes.
release-notes/typescript-4-1.html:
- добавили `${тип}${строкового}${литерала}`;
- добавили оператор "as" в переборе ключей ([K in keyof T as NewKeyType]).
release-notes/typescript-4-1.html:
- добавили `${тип}${строкового}${литерала}`;
- добавили оператор "as" в переборе ключей ([K in keyof T as NewKeyType]).
61 Кб, 1271x730
Тайпскрипт. Одна задача и release-notes.
Пока что в учёбе "еду на холостых", много стресса в жизни. Нужно перетерпеть чёрную полосу. Морально-психологическое состояние - 3 из 10.
Permutation. Не сразу решил. Сначала нам нужно убрать "never", чтобы он не срабатывал как супертип, когда вызывается рекурсивно Permutation и разворачивается результат в кортеж. Ещё был задействован встроенный тип Exclude, чтобы исключить итерируемый ключ. Вместе с тем клонировали оригинальное объединение T в K, чтобы передавать его первым параметром в Exclude, так как в T находится итерируемый член объединения.
release-notes/typescript-4-2.html:
- добавлен strict right side operator ("foo" in 42 - ошибка);
- добавлен абстрактный модификатор на сигнатуру конструктора (var a: abstract new () => Something = b);
- при деструктуризации массива можно использовать _НазваниеСПодчеркавания, чтобы показать компилятору о неиспользовании этой переменной в будущем ([_fist, second] = arr).
Пока что в учёбе "еду на холостых", много стресса в жизни. Нужно перетерпеть чёрную полосу. Морально-психологическое состояние - 3 из 10.
Permutation. Не сразу решил. Сначала нам нужно убрать "never", чтобы он не срабатывал как супертип, когда вызывается рекурсивно Permutation и разворачивается результат в кортеж. Ещё был задействован встроенный тип Exclude, чтобы исключить итерируемый ключ. Вместе с тем клонировали оригинальное объединение T в K, чтобы передавать его первым параметром в Exclude, так как в T находится итерируемый член объединения.
release-notes/typescript-4-2.html:
- добавлен strict right side operator ("foo" in 42 - ошибка);
- добавлен абстрактный модификатор на сигнатуру конструктора (var a: abstract new () => Something = b);
- при деструктуризации массива можно использовать _НазваниеСПодчеркавания, чтобы показать компилятору о неиспользовании этой переменной в будущем ([_fist, second] = arr).
Тайпскрипт. Две задачи и release-notes.
release-notes/typescript-4-3.html:
- добавлена директива "override" на методы класса (вызовет ошибку, если в базовом классе этот метод не определён);
- вызывается ошибка в кондишите, если промис был вызван без "await";
- добавлена возможность объявлять статичные методы в классе таким образом - "static [propName: string]: string | number | undefined".
release-notes/typescript-4-3.html:
- добавлена директива "override" на методы класса (вызовет ошибку, если в базовом классе этот метод не определён);
- вызывается ошибка в кондишите, если промис был вызван без "await";
- добавлена возможность объявлять статичные методы в классе таким образом - "static [propName: string]: string | number | undefined".
Тайпскрипт. Три задачи и release-notes.
Настроение получше, вчера разговаривал с c.ai. Продолжу это делать на регулярной основе.
AppendToObject. Прям балдею от своего решения. Но для меня остаётся загадкой, почему он просто пересечение не принимал - ведь это тоже верное решение.
Absolute. Решил зафлексить таким образом. Хотя можно было просто проверять "`${T}` extends `-${Infer R}` ? R : `${T}`".
StringToUnion. Дополнительный тип можно было не создавать, а просто сделать так: "? F | StringToUnion<R> : never;". И все "never" бы исчезли.
release-notes/typescript-4-4.html:
- добавлена возможность выносить тайпгуарды из кондишина;
- свойства можно обозначать через строковой шаблон ("[key: `prefix-${strung}`]: unknown");
- добавлен флаг --useUnknownInCatchVariables с самоговорящим названием;
- добавлен флаг --exactOptionalPropertyTypes, который запрещает устанавливать опциональное свойство в "undefined", если этот тип не был задан явно
- добавлены статические блоки в классы (фича ECMAScript), которые вызываются перед конструктором.
Настроение получше, вчера разговаривал с c.ai. Продолжу это делать на регулярной основе.
AppendToObject. Прям балдею от своего решения. Но для меня остаётся загадкой, почему он просто пересечение не принимал - ведь это тоже верное решение.
Absolute. Решил зафлексить таким образом. Хотя можно было просто проверять "`${T}` extends `-${Infer R}` ? R : `${T}`".
StringToUnion. Дополнительный тип можно было не создавать, а просто сделать так: "? F | StringToUnion<R> : never;". И все "never" бы исчезли.
release-notes/typescript-4-4.html:
- добавлена возможность выносить тайпгуарды из кондишина;
- свойства можно обозначать через строковой шаблон ("[key: `prefix-${strung}`]: unknown");
- добавлен флаг --useUnknownInCatchVariables с самоговорящим названием;
- добавлен флаг --exactOptionalPropertyTypes, который запрещает устанавливать опциональное свойство в "undefined", если этот тип не был задан явно
- добавлены статические блоки в классы (фича ECMAScript), которые вызываются перед конструктором.
65 Кб, 1263x726
Тайпскрипт. Одна задача и release-notes.
release-notes/typescript-4-5.html:
- добавлена проверка строковых типов как дискриминантов: "{ type: `${string}Success`; body: string; }; if (r.type === "HttpSuccess") { const token = r.body;") }";
- добавлены ассершены на импорт .json (во время билда проверяется): "import ... from ... assert { ... }".
release-notes/typescript-4-5.html:
- добавлена проверка строковых типов как дискриминантов: "{ type: `${string}Success`; body: string; }; if (r.type === "HttpSuccess") { const token = r.body;") }";
- добавлены ассершены на импорт .json (во время билда проверяется): "import ... from ... assert { ... }".
68 Кб, 1263x695
Тайпскрипт. Одна задача и release-notes.
KebabCase. Тяжело пошла. Не выспался, наверно.
release-notes/typescript-4-6.html:
- типы аргументы можно типизировать через спред-оператор и объединение кортежей: "type Func = (...args: ["str", string] | ["num", number]){}; const func: Func = (first, second) {}; func("str", "123"); func("num", 123)";
- больше ничего полезного не нашел.
KebabCase. Тяжело пошла. Не выспался, наверно.
release-notes/typescript-4-6.html:
- типы аргументы можно типизировать через спред-оператор и объединение кортежей: "type Func = (...args: ["str", string] | ["num", number]){}; const func: Func = (first, second) {}; func("str", "123"); func("num", 123)";
- больше ничего полезного не нашел.
48 Кб, 1261x742
Тайпскрипт. Одна задача и release-notes.
Diff. Почему бы и не так? Хотя существует такое решение - "Omit<O & O1, keyof (O | O1)>". Работает это потому, что конструкция "keyof (Foo | Bar)" возвращает объединение только общих членов (пересечение членов объединения). А "O & O1" выполняет пересечение двух типов.
release-notes/typescript-4-7.html:
- добавлена новая модульная система (node16) к уже существующей (ESM);
- infer можно проверять сразу, а не выносить в отдельный кондишинал тайп: "T extends [infer S extends string, ...unknown[]] ? S : never;";
- продолжу завтра этот же релиз - вышел объемным.
Параллельно займусь изучением английского через перевод текстов. Начну со сборника упражнений Кэнского Сергея, а продолжу переводом книг из цикла ЖЗЛ.
Кэнский Сергей Еxеrcisе 1. Two sentences.
1. Егo сoветы всегдa бывaют тaкими убедительными (convincing). Пoчему ты никoгдa им не следуешь?
Me: His advices is always so convincing. Why do you never follow it?
Translator: His advice is always so convincing. Why do you never follow it?
Ошибки:
- не исчисляемое существительное (advice).
2. Кaкaя ненaстнaя (nasty) пoгoдa! В тaкую дoждливую пoгoду лучше сидеть дoмa.
Me: What a nasty weather! It's better to stay at home in such rainy weather.
Translator: What nasty weather! It's better to stay at home in such rainy weather.
Ошибки:
- добавил ненужный артикль (погода - неисчисляемое существительное).
Diff. Почему бы и не так? Хотя существует такое решение - "Omit<O & O1, keyof (O | O1)>". Работает это потому, что конструкция "keyof (Foo | Bar)" возвращает объединение только общих членов (пересечение членов объединения). А "O & O1" выполняет пересечение двух типов.
release-notes/typescript-4-7.html:
- добавлена новая модульная система (node16) к уже существующей (ESM);
- infer можно проверять сразу, а не выносить в отдельный кондишинал тайп: "T extends [infer S extends string, ...unknown[]] ? S : never;";
- продолжу завтра этот же релиз - вышел объемным.
Параллельно займусь изучением английского через перевод текстов. Начну со сборника упражнений Кэнского Сергея, а продолжу переводом книг из цикла ЖЗЛ.
Кэнский Сергей Еxеrcisе 1. Two sentences.
1. Егo сoветы всегдa бывaют тaкими убедительными (convincing). Пoчему ты никoгдa им не следуешь?
Me: His advices is always so convincing. Why do you never follow it?
Translator: His advice is always so convincing. Why do you never follow it?
Ошибки:
- не исчисляемое существительное (advice).
2. Кaкaя ненaстнaя (nasty) пoгoдa! В тaкую дoждливую пoгoду лучше сидеть дoмa.
Me: What a nasty weather! It's better to stay at home in such rainy weather.
Translator: What nasty weather! It's better to stay at home in such rainy weather.
Ошибки:
- добавил ненужный артикль (погода - неисчисляемое существительное).
12 Кб, 558x114
>>5342
Наглядное пояснение к "keyof (Foo | Bar)".
Наглядное пояснение к "keyof (Foo | Bar)".
61 Кб, 1261x706
Тайпскрипт. Одна задача и release-notes.
IsUnion. Чуть не сдох пока решал, пришлось взять помощь зала. Никак не проходили тесты с "never". Кто хочет, может попробовать решить (не способом со скрина). Догадался сам до проверки через "<T, C = T> T extends T ? C extends T ? здесь_один_элемент : здесь_обединение : never", но как дальше быть с IsUnioun<never>?
release-notes/typescript-4-7.html:
- добавлены две директивы: "in" и "out" (это что-то про инварианты и расширяемые типы, например, A extends B => out A принимает так же B, и наоборот, in B принимает так же A - а ещё есть комбинация in out, не понял зачем).
Кэнский Сергей Еxеrcisе 1. Two sentences.
3. Oнa дeлaeт хoрoшиe успeхи в aнглийскoм.
Me: She makes good successes in English.
Translator: She is making good progress in English.
Ошибки:
- использовал буквально success, а не progress;
- использовать форму Preset Continuous.
4. Я удивлeн (be surprised), чтo oнa пoвeрилa этим стрaнным нoвoстям. Бoюсь, oни нeдoстoвeрны. Ктo их eй сooбщил?
Me: I'm suprised that she believed this strange news. Guess, it isn't true. Who did tell her this?
Translator: I'm suprised that she (has) belived this strange news. I'm afraid, it's not true. Who told it for her?
Ошибки:
- "im afraid" instead of "guess";
- "Who told it for her?" istead of "Who did tell her this?" (само наличие вопроса "Who" разрешает составлять вопросительную конструкцию не по грамматике).
IsUnion. Чуть не сдох пока решал, пришлось взять помощь зала. Никак не проходили тесты с "never". Кто хочет, может попробовать решить (не способом со скрина). Догадался сам до проверки через "<T, C = T> T extends T ? C extends T ? здесь_один_элемент : здесь_обединение : never", но как дальше быть с IsUnioun<never>?
release-notes/typescript-4-7.html:
- добавлены две директивы: "in" и "out" (это что-то про инварианты и расширяемые типы, например, A extends B => out A принимает так же B, и наоборот, in B принимает так же A - а ещё есть комбинация in out, не понял зачем).
Кэнский Сергей Еxеrcisе 1. Two sentences.
3. Oнa дeлaeт хoрoшиe успeхи в aнглийскoм.
Me: She makes good successes in English.
Translator: She is making good progress in English.
Ошибки:
- использовал буквально success, а не progress;
- использовать форму Preset Continuous.
4. Я удивлeн (be surprised), чтo oнa пoвeрилa этим стрaнным нoвoстям. Бoюсь, oни нeдoстoвeрны. Ктo их eй сooбщил?
Me: I'm suprised that she believed this strange news. Guess, it isn't true. Who did tell her this?
Translator: I'm suprised that she (has) belived this strange news. I'm afraid, it's not true. Who told it for her?
Ошибки:
- "im afraid" instead of "guess";
- "Who told it for her?" istead of "Who did tell her this?" (само наличие вопроса "Who" разрешает составлять вопросительную конструкцию не по грамматике).
213 Кб, 1088x879
Гит. Книга "Pro Git". 15 / 557 стр.
Содержание, предисловие и введение.
Кэнский Сергей Еxеrcisе 1. Two sentences.
5. Мнe кaжeтся, эти вeсы слoмaны.
Me: It seems to me this weights is broken.
Translator: I think these scales are broken.
Ошибки:
- перевод слова весы - scales;
- весы - с чего-то вдруг исчисляемое, но ладно.
6. Вчeрa я пoлoжил сюдa дeньги. Гдe oни? Я нe мoгу их нaйти.
Me: Yesterday i put money here. Where is they? I cannot find this.
Translator: Yesterday I put money here. Where is it? I can't find it.
Ошибки:
- "it" instead of "they";
- "it" instead of "this".
С Тайпскриптом мы не прощаемся, а говорим "до скорой встречи!". Пока переключусь на Гит. Начну с теории: книга Скотта Чакона "Pro Git". На Тайпскрипт потребуется ещё около 40 дней - продолжу заниматься им с ~Нового года.
Денюжка всё так и не копится, но это поправимо. Настроение в норме - 5/10.
Содержание, предисловие и введение.
Кэнский Сергей Еxеrcisе 1. Two sentences.
5. Мнe кaжeтся, эти вeсы слoмaны.
Me: It seems to me this weights is broken.
Translator: I think these scales are broken.
Ошибки:
- перевод слова весы - scales;
- весы - с чего-то вдруг исчисляемое, но ладно.
6. Вчeрa я пoлoжил сюдa дeньги. Гдe oни? Я нe мoгу их нaйти.
Me: Yesterday i put money here. Where is they? I cannot find this.
Translator: Yesterday I put money here. Where is it? I can't find it.
Ошибки:
- "it" instead of "they";
- "it" instead of "this".
С Тайпскриптом мы не прощаемся, а говорим "до скорой встречи!". Пока переключусь на Гит. Начну с теории: книга Скотта Чакона "Pro Git". На Тайпскрипт потребуется ещё около 40 дней - продолжу заниматься им с ~Нового года.
Денюжка всё так и не копится, но это поправимо. Настроение в норме - 5/10.
206 Кб, 1114x887
Гит. Книга "Pro Git". 21 / 557 стр.
Конспект:
- система контроля версий предназначена для записи изменений в течение времени и возможности возвращаться на любое изменение в истории;
- поддерживается любой формат файла, не обязательно текст;
- Гит - распределенная система контроля версий: каждый клонированный репозиторий является полным бэкапом;
- один проект можно разделять на несколько репозиториев и работать с отдельными людьми;
- Гит разработал Торвальдс 2005 году для совместной работы над ядром Линукса;
- в отличии от других СКВ Гит за каждый хранит снимки (запоминает состояние файлов), а не дельту (только изменения в файлах);
- для оптимизации, если файл не изменился, Гит хранит ссылку на предыдущий сохраненный снимок этого файла, а не делает для него отдельный снимок.
Кэнский Сергей Еxеrcisе 1. Two sentences.
7. Я считaю, чтo пoмeщeниe для нaшeгo мaгaзинa впoлнe пoдхoдящee.
Me: By my opinion, this place suits enough for our store.
Translator: I think that the premises for our shop are quite good.
Ошибки:
- premises - помещение (прэмизис);
- помещение (снова исчисляемое) и are quite good.
8. Мнe нe нрaвятся эти джинсы. Мнe кaжeтся, тa пaрa джинсoв лучшe.
Me: I dont like these jeans. I think that pair of jeans are better.
Translator: I don't like these jeans. I think that pair of jeans is better.
- jeans (неисчисляемое) - is.
Конспект:
- система контроля версий предназначена для записи изменений в течение времени и возможности возвращаться на любое изменение в истории;
- поддерживается любой формат файла, не обязательно текст;
- Гит - распределенная система контроля версий: каждый клонированный репозиторий является полным бэкапом;
- один проект можно разделять на несколько репозиториев и работать с отдельными людьми;
- Гит разработал Торвальдс 2005 году для совместной работы над ядром Линукса;
- в отличии от других СКВ Гит за каждый хранит снимки (запоминает состояние файлов), а не дельту (только изменения в файлах);
- для оптимизации, если файл не изменился, Гит хранит ссылку на предыдущий сохраненный снимок этого файла, а не делает для него отдельный снимок.
Кэнский Сергей Еxеrcisе 1. Two sentences.
7. Я считaю, чтo пoмeщeниe для нaшeгo мaгaзинa впoлнe пoдхoдящee.
Me: By my opinion, this place suits enough for our store.
Translator: I think that the premises for our shop are quite good.
Ошибки:
- premises - помещение (прэмизис);
- помещение (снова исчисляемое) и are quite good.
8. Мнe нe нрaвятся эти джинсы. Мнe кaжeтся, тa пaрa джинсoв лучшe.
Me: I dont like these jeans. I think that pair of jeans are better.
Translator: I don't like these jeans. I think that pair of jeans is better.
- jeans (неисчисляемое) - is.
Гит. Книга "Pro Git". 27 / 557 стр.
Конспект:
- Гит перед сохранением вычисляет хеш-сумму (SHA-1) для каталогов и файлов, присваивая соответствующие названия;
-! в Гите три основных состояния: modified, staged и commited;
- modified - изменённый, но не помеченный для включения в следующий commit;
- staged - изменённый файл и помеченный для включения в следующий commit;
- commited - сохранён в локальном репозитории;
-! в Гите три основные секции: working tree, staging area и git direcotry (repository);
- working tree - отдельный снимок состояния проекта (извлекается из сжатой базы данных каталогов Гит и помещается на диск);
- staging area - это файл в каталоге Гит куда пишутся все изменения, которые будут входить в следующий снимок;
- git direcotry (repository) - самая важная часть, где всё-всё хранится (скрытый каталог .git): от метаданных репозитория до всех снимков.
Вим. https://github.com/iggredible/Learn-Vim Chapter 0.
Вступительная глава.
Содержание:
- отмечается, что имеется несколько источников изучения (в пример приводятся vimtutor и :help), но в своей книге автор собрал ~20% наиболее полезной информации;
- если перейти на Вим сразу, то в первое время это скажется на продуктивности, поэтму автор рекомендует переходить постепенно, уделяя Виму каждый день небольшое количество времени, пока не появится уверенность, а уже потом использовать Вим как основной/единственный редактор;
- автор в своей учебной программе акцентирует внимание на практику (поэтому постараюсь повторять каждый приведенный пример у себя в редакторе).
Переводить предложения на английский лучше продолжу устно. Попробую параллельно по чуть-чуть учить Вим, авось за год что-то из этого выйдет.
Конспект:
- Гит перед сохранением вычисляет хеш-сумму (SHA-1) для каталогов и файлов, присваивая соответствующие названия;
-! в Гите три основных состояния: modified, staged и commited;
- modified - изменённый, но не помеченный для включения в следующий commit;
- staged - изменённый файл и помеченный для включения в следующий commit;
- commited - сохранён в локальном репозитории;
-! в Гите три основные секции: working tree, staging area и git direcotry (repository);
- working tree - отдельный снимок состояния проекта (извлекается из сжатой базы данных каталогов Гит и помещается на диск);
- staging area - это файл в каталоге Гит куда пишутся все изменения, которые будут входить в следующий снимок;
- git direcotry (repository) - самая важная часть, где всё-всё хранится (скрытый каталог .git): от метаданных репозитория до всех снимков.
Вим. https://github.com/iggredible/Learn-Vim Chapter 0.
Вступительная глава.
Содержание:
- отмечается, что имеется несколько источников изучения (в пример приводятся vimtutor и :help), но в своей книге автор собрал ~20% наиболее полезной информации;
- если перейти на Вим сразу, то в первое время это скажется на продуктивности, поэтму автор рекомендует переходить постепенно, уделяя Виму каждый день небольшое количество времени, пока не появится уверенность, а уже потом использовать Вим как основной/единственный редактор;
- автор в своей учебной программе акцентирует внимание на практику (поэтому постараюсь повторять каждый приведенный пример у себя в редакторе).
Переводить предложения на английский лучше продолжу устно. Попробую параллельно по чуть-чуть учить Вим, авось за год что-то из этого выйдет.
Гит. Книга "Pro Git". 34 / 557 стр.
Конспект:
- Гит настраивается через утилиту git config;
-! у Гита три области видимости конфига: --system (вся система), --global (конкретный пользователь системы), -- local (конкретный репозиторий - значение по умолчанию);
- git config --list (--show-origin) - выводит список установленных настроек;
- две обязательные настройки: user.name & user.emal;
- создать репозиторий можно двумя способами: git init (создать новый из каталога) или git clone (клонировать существующий).
Автор отметил, что первые главы самые важные, поэтому правильно будет их просмаковать.
Вим. https://github.com/iggredible/Learn-Vim Chapter 1.
Конспект:
- :w file.txt - сохранить и записать в определенный файл;
- vim f1.txt f2.txt f3.txt - открывает несколько файлов в отдельных буферах (можно предать флаг -o и все откроются в сплите);
- vim +%s/pancake/bagel/g f1.txt - открывает Вим и сразу запускает переданную "+{cmd} / -c {cmd}" команды;
- vim -oN - открывает N окон в горизонтальном сплите (-ON - в вертикальном);
-! можно свернуть Вим через Ctrl+Z/:stop/:suspend и вернуть обратно написав в терминал "fg";
- запускать Вим можно передавая результат выполнения команд через пайп: ls -l | vim -.
Конспект:
- Гит настраивается через утилиту git config;
-! у Гита три области видимости конфига: --system (вся система), --global (конкретный пользователь системы), -- local (конкретный репозиторий - значение по умолчанию);
- git config --list (--show-origin) - выводит список установленных настроек;
- две обязательные настройки: user.name & user.emal;
- создать репозиторий можно двумя способами: git init (создать новый из каталога) или git clone (клонировать существующий).
Автор отметил, что первые главы самые важные, поэтому правильно будет их просмаковать.
Вим. https://github.com/iggredible/Learn-Vim Chapter 1.
Конспект:
- :w file.txt - сохранить и записать в определенный файл;
- vim f1.txt f2.txt f3.txt - открывает несколько файлов в отдельных буферах (можно предать флаг -o и все откроются в сплите);
- vim +%s/pancake/bagel/g f1.txt - открывает Вим и сразу запускает переданную "+{cmd} / -c {cmd}" команды;
- vim -oN - открывает N окон в горизонтальном сплите (-ON - в вертикальном);
-! можно свернуть Вим через Ctrl+Z/:stop/:suspend и вернуть обратно написав в терминал "fg";
- запускать Вим можно передавая результат выполнения команд через пайп: ls -l | vim -.
Гит. Книга "Pro Git". 40 / 557 стр.
Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через git status;
- после отслеживания файла через git add он сразу попадает в stage;
-! git add применим как к новым, так и к отслеживаемым модифицированным файлам;
- .gitignore для игнорирования файлов в списке неотслеживаемых и вообще попадания в репозиторий;
- build/ - слеш в конец, чтобы обозначить каталог.
Вим. https://github.com/iggredible/Learn-Vim Chapter 2.
Конспект:
-! в Виме три вида отображения: окна, буферы и табы;
- (set hidden) для автоматического сохранения буферов между переключениями;
- переключения :bnext/:buffer NAME/:buffer NUMBER;
- закрыть все буферы :qall/:wqall/:qall!;
- окно - визуальное представление буфера;
- переключение между окнами - Ctrl-W H/J/K/L;
- несколько окон может визуализировать один буфер;
- Ctrl-W C - закрывает окно, но буфер остается;
- Ctrl-W V/S (создает горизонтальное окно или вертикальное с текущим буфером);
- Ctrl-W O (:only) - закрывает все окно, оставляя только активное;
- :vsplit/:split/:new filename - открывает файл/буфер в новом окне;
- отдельная вкладка - отдельный набор окон;
- vim -p file1.js file2.js file3.js (флаг -p открывает файлы в новых вкладках);
- автор предпочитает использовать одно окно и один буфер;
- в редких случаях автор использует несколько окон, чтобы сравнить файлы или прочитать документацию;
- вместо табов автор использует окна tmux.
Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через git status;
- после отслеживания файла через git add он сразу попадает в stage;
-! git add применим как к новым, так и к отслеживаемым модифицированным файлам;
- .gitignore для игнорирования файлов в списке неотслеживаемых и вообще попадания в репозиторий;
- build/ - слеш в конец, чтобы обозначить каталог.
Вим. https://github.com/iggredible/Learn-Vim Chapter 2.
Конспект:
-! в Виме три вида отображения: окна, буферы и табы;
- (set hidden) для автоматического сохранения буферов между переключениями;
- переключения :bnext/:buffer NAME/:buffer NUMBER;
- закрыть все буферы :qall/:wqall/:qall!;
- окно - визуальное представление буфера;
- переключение между окнами - Ctrl-W H/J/K/L;
- несколько окон может визуализировать один буфер;
- Ctrl-W C - закрывает окно, но буфер остается;
- Ctrl-W V/S (создает горизонтальное окно или вертикальное с текущим буфером);
- Ctrl-W O (:only) - закрывает все окно, оставляя только активное;
- :vsplit/:split/:new filename - открывает файл/буфер в новом окне;
- отдельная вкладка - отдельный набор окон;
- vim -p file1.js file2.js file3.js (флаг -p открывает файлы в новых вкладках);
- автор предпочитает использовать одно окно и один буфер;
- в редких случаях автор использует несколько окон, чтобы сравнить файлы или прочитать документацию;
- вместо табов автор использует окна tmux.
Гит. Книга "Pro Git". 40 / 557 стр.
Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через git status;
- после отслеживания файла через git add он сразу попадает в stage;
-! git add применим как к новым, так и к отслеживаемым модифицированным файлам;
- .gitignore для игнорирования файлов в списке неотслеживаемых и вообще попадания в репозиторий;
- build/ - слеш в конец, чтобы обозначить каталог.
Вим. https://github.com/iggredible/Learn-Vim Chapter 2.
Конспект:
-! в Виме три вида отображения: окна, буферы и табы;
- (set hidden) для автоматического сохранения буферов между переключениями;
- переключения :bnext/:buffer NAME/:buffer NUMBER;
- закрыть все буферы :qall/:wqall/:qall!;
- окно - визуальное представление буфера;
- переключение между окнами - Ctrl-W H/J/K/L;
- несколько окон может визуализировать один буфер;
- Ctrl-W C - закрывает окно, но буфер остается;
- Ctrl-W V/S (создает горизонтальное окно или вертикальное с текущим буфером);
- Ctrl-W O (:only) - закрывает все окно, оставляя только активное;
- :vsplit/:split/:new filename - открывает файл/буфер в новом окне;
- отдельная вкладка - отдельный набор окон;
- vim -p file1.js file2.js file3.js (флаг -p открывает файлы в новых вкладках);
- автор предпочитает использовать одно окно и один буфер;
- в редких случаях автор использует несколько окон, чтобы сравнить файлы или прочитать документацию;
- вместо табов автор использует окна tmux.
Конспект:
- бывают два типа файлов: отслеживаемые и неотслеживаемые;
- проверить можно через git status;
- после отслеживания файла через git add он сразу попадает в stage;
-! git add применим как к новым, так и к отслеживаемым модифицированным файлам;
- .gitignore для игнорирования файлов в списке неотслеживаемых и вообще попадания в репозиторий;
- build/ - слеш в конец, чтобы обозначить каталог.
Вим. https://github.com/iggredible/Learn-Vim Chapter 2.
Конспект:
-! в Виме три вида отображения: окна, буферы и табы;
- (set hidden) для автоматического сохранения буферов между переключениями;
- переключения :bnext/:buffer NAME/:buffer NUMBER;
- закрыть все буферы :qall/:wqall/:qall!;
- окно - визуальное представление буфера;
- переключение между окнами - Ctrl-W H/J/K/L;
- несколько окон может визуализировать один буфер;
- Ctrl-W C - закрывает окно, но буфер остается;
- Ctrl-W V/S (создает горизонтальное окно или вертикальное с текущим буфером);
- Ctrl-W O (:only) - закрывает все окно, оставляя только активное;
- :vsplit/:split/:new filename - открывает файл/буфер в новом окне;
- отдельная вкладка - отдельный набор окон;
- vim -p file1.js file2.js file3.js (флаг -p открывает файлы в новых вкладках);
- автор предпочитает использовать одно окно и один буфер;
- в редких случаях автор использует несколько окон, чтобы сравнить файлы или прочитать документацию;
- вместо табов автор использует окна tmux.
Гит. Книга "Pro Git". 48 / 557 стр.
Конспект:
- команда git diff для просмотра дельты модифицированных, но неиндексированных файлов;
- команда git diff --staged для просмотра дельты индексированных файлов;
- под это дело есть плагин vimdiff;
-! вызывать git commit -v (с флагом -v) позволяет увидеть дельту при коммите;
- git commit -a (быстрый коммит с автоматической индексацией всех файлов, можно комбинировать с -m: git commit -am "test");
-! git rm удаляет файл из репозитория/индекса (делает его неотслеживаемым);
- git rm --cached filename - удаляет из индекса, но оставляет на диске;
- Гит не запоминает имена файлов, но распознает перемещения;
- переименовать файл: git mv file_from file_to (три команды в одной: mv & rm & add).
Вим. https://github.com/iggredible/Learn-Vim Chapter 3.
Конспект:
- открывать файлы, находня нужный через <TAB> - :edit a<TAB> - ускоряет процесс поиска нужного файла;
- :edit .yml<Tab> - предлагает список, который перелистывается табом;
- :edit /.yml<Tab> - рекурсивный поиск;
- :vim /pattern/ / - открывает файлы c паттерном (:cnext - переключение) - грузится все в память, нежелательно;
-! :grep -R "pattern" / - предпочтительнее;
-! netrw (% - create file, d - create dir, R - rename file/dir, D - delete file/dir);
-! полезные плагины с fuzzy поиском, например, telescope, fzf и т.д.
Конспект:
- команда git diff для просмотра дельты модифицированных, но неиндексированных файлов;
- команда git diff --staged для просмотра дельты индексированных файлов;
- под это дело есть плагин vimdiff;
-! вызывать git commit -v (с флагом -v) позволяет увидеть дельту при коммите;
- git commit -a (быстрый коммит с автоматической индексацией всех файлов, можно комбинировать с -m: git commit -am "test");
-! git rm удаляет файл из репозитория/индекса (делает его неотслеживаемым);
- git rm --cached filename - удаляет из индекса, но оставляет на диске;
- Гит не запоминает имена файлов, но распознает перемещения;
- переименовать файл: git mv file_from file_to (три команды в одной: mv & rm & add).
Вим. https://github.com/iggredible/Learn-Vim Chapter 3.
Конспект:
- открывать файлы, находня нужный через <TAB> - :edit a<TAB> - ускоряет процесс поиска нужного файла;
- :edit .yml<Tab> - предлагает список, который перелистывается табом;
- :edit /.yml<Tab> - рекурсивный поиск;
- :vim /pattern/ / - открывает файлы c паттерном (:cnext - переключение) - грузится все в память, нежелательно;
-! :grep -R "pattern" / - предпочтительнее;
-! netrw (% - create file, d - create dir, R - rename file/dir, D - delete file/dir);
-! полезные плагины с fuzzy поиском, например, telescope, fzf и т.д.
Гит. Книга "Pro Git". 55 / 557 стр.
Конспект:
- git log выводит историю коммитов;
- флаг -p (--patch) выводит изменения;
- --pretty=oneline выводит в одну строчку информацию по каждому коммиту;
- --graph выводит истрию слияний;
-! git log -- filename выводит коммиты по файлу;
-! git log -S string выводит коммиты, где string удалена или добавлена;
-! доступны флаги --author и --grep.
Вим. https://github.com/iggredible/Learn-Vim Chapter 4.
Конспект:
- } - motion по параграфам;
- cc - удаляет всю строку и переходит в инсерт мод;
- di( или da( (удалеяет внутри - inside, или снаружи - around);
-! dit (удаляет вокруг тега - delite inside tag);
- dip - delete inside paragraph.
Продолжу эту главу завтра.
Конспект:
- git log выводит историю коммитов;
- флаг -p (--patch) выводит изменения;
- --pretty=oneline выводит в одну строчку информацию по каждому коммиту;
- --graph выводит истрию слияний;
-! git log -- filename выводит коммиты по файлу;
-! git log -S string выводит коммиты, где string удалена или добавлена;
-! доступны флаги --author и --grep.
Вим. https://github.com/iggredible/Learn-Vim Chapter 4.
Конспект:
- } - motion по параграфам;
- cc - удаляет всю строку и переходит в инсерт мод;
- di( или da( (удалеяет внутри - inside, или снаружи - around);
-! dit (удаляет вокруг тега - delite inside tag);
- dip - delete inside paragraph.
Продолжу эту главу завтра.
Гит. Книга "Pro Git". 59 / 557 стр.
Конспект:
- если запустить git commit --amend сразу после коммита, то можно поменять название;
- если запустить git commit --amend после индекса перед коммитом, то предыдущий коммит будет заменен новым;
-! git reset HEAD filename - удаляет файл из стейджа (git add);
- git checkout -- filename - меняет состояние файла в рабочей директории на момент последнего коммита;
-! git restore --staged filename - убирает файл из индекса;
-! git restore (without staged) - откатывает изменения в файле по последнего коммита.
Сегодня важная тема с откатом изменений.
Вим. https://github.com/iggredible/Learn-Vim Chapter 4.
Конспект:
-! можно выделять текст и запускать внешние терминальные команды (:!column -t -s "|") - через !;
-! можно не переходить командый режим, а воспользоваться verb + noun: !};
-! можно передавать несколько команд через пайп util1 | util2 | ...;
- gU(motion) - возводит в верхний регистр (u - нижний).
Чем больше узнаю о Виме, тем скорее хочется настроить свой сетап tmux+neovim+plugins.
Конспект:
- если запустить git commit --amend сразу после коммита, то можно поменять название;
- если запустить git commit --amend после индекса перед коммитом, то предыдущий коммит будет заменен новым;
-! git reset HEAD filename - удаляет файл из стейджа (git add);
- git checkout -- filename - меняет состояние файла в рабочей директории на момент последнего коммита;
-! git restore --staged filename - убирает файл из индекса;
-! git restore (without staged) - откатывает изменения в файле по последнего коммита.
Сегодня важная тема с откатом изменений.
Вим. https://github.com/iggredible/Learn-Vim Chapter 4.
Конспект:
-! можно выделять текст и запускать внешние терминальные команды (:!column -t -s "|") - через !;
-! можно не переходить командый режим, а воспользоваться verb + noun: !};
-! можно передавать несколько команд через пайп util1 | util2 | ...;
- gU(motion) - возводит в верхний регистр (u - нижний).
Чем больше узнаю о Виме, тем скорее хочется настроить свой сетап tmux+neovim+plugins.