Pull to refresh
51
0
Александр Десятьбитов @tenbits

User

Send message

К пункту "не использовать any". Типы можно "доставать" из окружения — переменных, массивов, аргументов функций и их ReturnType. Это конечно не очень красиво, но на порядок лучше any — так что, используйте с умом.


// 1. из переменной
let foo = { foo: 'f' };
let bar: typeof foo = null;
// 2. из массива
let foo = [{ foo: 'f' }];
let bar: (typeof foo)[0] = null;
// 3. из аргументов
function doBar (foo: { foo: string }) {
}
let bar: Parameters<typeof doBar>[0] = null;
// 4. из возврата
function doBar () {
    return { foo: 'f' };
}
let bar: ReturnType<typeof doBar> = null;

Не будьте так однозначны. Разумеется, пожар может быть губительным для леса и его обитателей. Мы тут не про такой пожар, такого рода пожары и для кода ужасны. Пожары в небольших количествах, а если ещё и контролируемые — вполне нужны экосистеме.


Пассаж про лес достоин оваций!

Оказиваеться, можно делить приложение на слои, которые имеют свои модели: UserDto, User и т.д. И "мапперы" тут тоже никто не отменял.

Да, создано с оглядкой на Json.Net. По декораторам: мы не боимся — рано или поздно они войдут в стандарт. И даже если спека немного подправится, то тут тоже всё в норме — на коленке за пару минут можно будет миграционную утилиту написать. Из этого следует — декораторами можно уже наслаждаться. Тут вся прелесть в том, что модель и мета данные к ней — в одном месте, плюс работает наследование.


А то что вы в примере написали, это только валидация, или ещё десериализация? То-есть, например, временные строки будут преобразованы в Date?

Да, мы тоже используем для де-/сериализации и валидации декораторы и обычные классы:


import { Json, Rule } from 'class-json';

class Address {
    @Rule.validate(FooCustomValidator)
    @Json.type(String)
    line: string
}
class User {
    @Rule.minimum(1)
    @Json.type(Number)
    id: number

    @Rule.required()
    @Json.type(Date)
    date: Date

    @Rule.pattern(/^\w+$/)
    @Rule.required()
    @Json.type(String)
    name: string

    @Rule.type(Address)
    address: Address
}
Нужни искать центр масс выпуклого полигона для фигуры. Для c внутри — это будет круг (ну или если более точно, то почти круг) — и тут как раз центр масс верно ложиться на центр «круга».

Тогда уже можно и:


f=>(...a)=>f[a]=a in f?f[a]:f(...a);

Это хорошо, что нет доступа к дом, что бы не было никаких побочных эфектов. Интересен был момент или можно часть приложения вынести в сервис воркер. Возврат готового html из сервис воркера был лишь примером. Для это наш сервис воркер будет довольно увесист: данные, и/или бизнес модели, и/или бизнес сценарии, и/или шаблонизаторы и прочие вещи. Это уже всё детали реализации, просто стало интерсно, или кто-то думал о сервис воркере как о чем-то большем чем транспорт-кэш middleware.

А что думаете о таком сценарии, что бы целые части приложения (некоторые слои) выносить в service worker? Грубый пример — делаем запрос, а из service worker создаем нужные запросы в backend, производим нужные вычисления, рендерим шаблон и отдаем уже как результат выполнения сервиса.

На самом деле, такое наименование следует тому же принципи что и Number:number, String:string, Boolean:boolean. С этим же ни у кого проблем не возникает.

Например, проверить или распарсенная строка действительно была датой.


let date = new Date('foo');
let isInvalidDate= isNaN(date);
console.log(isInvalidDate ? "Yes, it was invalid" : "Ooops, was OK");

А в какие нибудь квоты упирались? Или может знаете, как много на самом деле гугл дает бесплатно cpu и io?

А кто-то создавал web-apps поверх гугл таблиц? Могли бы в кратце поделиться впечатлениями? Для себя буквально недавно открыли google apps script, и были удивленны, что раньше не обращали внимание на столь мощную фичу. Можно создавать полноценные http api, где таблицы играют роль DB. А учитывая, что поддерживаются cross-origin запросы, можно создавать разные single page приложения, где уже в свою очередь данные с таблиц можно хоть в каком виде анализировать, отображать, редактировать. И самое классное это то, что права доступа к таблицам и апи настраиваются раздельно.

Да уж, хабр уже не тот, автор пишет о реактивном мемойзе с возможностью прерывания, а люди обсуждают или нужно юзеру 9к записей на странице. Да, демо для десктопа не удачное, но не в этом же суть.

Верно, но это только для релиза. А вот при разработке сборки и таскраннеры только мешают.

Без defer скрипты грузятся параллельно. С defer создается отдельная очередь, хотя скрипты тоже грузятся параллельно. Преимуществ defer, если скрипты в конце документа попросту нет.



Смело оставляйте как есть, без defer/async. Браузеры не парсинг html останавливают, а обработку html. То-есть они вполне знают какие скрипты следуют за актуальным и грузят их параллельно. И даже напротив, defer в хроме замедляет начало их загрузки, по видимому тратиться время на создание отдельного queue

Не однозначно, сказано же, что скрипт добавляется в конец списка скриптов, который (список) будет исполнен после окончание парсинга документа. Сеть же загружает скрипты и помечает их как готовые к выполнению (а не передает на выполнение). В заблуждение вводит последняя фраза, так как не явно указано, или парсер сразу выполнит скрипт, или выполнит только когда дойдёт до него очередь. Но из параграфа выше всё же следует, что парсер выполняет скрипты поочерёдно, иначе бы спецификация явно не указывала бы, что скрипт нужно добавить в список, тем более вконец — в этом не было бы смысла. Ну и ребята из html5rocks о том же говорят.

Уточните пожалуйста, из вашего примера, все 3 скрипта с defer атрибутом или без?

1
23 ...

Information

Rating
Does not participate
Location
Leipzig, Sachsen, Германия
Date of birth
Registered
Activity