Search
Write a publication
Pull to refresh
2
0
Send message

Ну эта проблема никак не связана именно с созданием через new - с фабриками было бы то же самое. Да даже созданные через new вроде бы "независимые" объекты могли обращаться к какому-то общему ресурсу. В общем, если для экземпляров какого-то класса вдруг появилось переиспользование, то наверно автор знал что делал.

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

Имхо, фича может быть полезна, если например был обычный класс (экземпляры которого создавались просто через new в куче мест кода), и вдруг превратился в синглтон, мультитон или объектный пул, в общем, с возвратом существующего объекта в некоторых кейсах. Можно слегка подправить конструктор и больше нигде ничего не менять.

С другой стороны, даже тщательная проверка свойства не всегда позволяет тайпскрипту понять, что у нас за объект. Пример, где внутри ифа переменная obj не сужает свой тип: https://tsplay.dev/mprvaw . Любопытно, что сам по себе obj.x при этом сужается. При проверке дискриминантного ключа (второй иф) всё окей.

fetch без чужих куков пойдёт, если не указать credentials: "include". Иначе пойдет с куками. Но в любом случае ответ сервера будет передан запросившему его js-коду, только если сервер снабдил свой ответ необходимыми заголовками (причем для запроса с куками заголовков должно быть больше). От честности автора тут ничего не зависит.

Я бы не назвал это костылем. Просто изначально были ограничения на "одинаковый origin", а спустя несколько лет добавились цивилизованные средства их обхода с согласия сервера. До этого был JSONP, который действительно костыль.

Куки можно не отсылать (как и делается в том же fetch без credentials: "include"), но этого недостаточно. Пользователь может находиться во внутренней сети и иметь доступ к каким-то ресурсам, недоступным снаружи, сайт злоумышленника не должен уметь забирать оттуда какие-либо данные, даже без кукисов.

В вашем примере просто так вышло, что реально используемый интерфейс только один - AreaCalculateable с этим своим calculateArea. А сабж про случай, когда интерфейсы совсем разные, и мы вынуждены таки определять, что за объект. Например, совсем недавно я использовал jscodeshift и работал с AST. Вот там как раз DU. У меня были некоторые свои действия с узлами, которые я не мог просто "подселить" как методы к некоторому "общему интерфейсу" и потом вызывать через точку, потому приходилось смотреть что за нода и что-то делать с её специфическими данными.

Т.е. для number Boolean не является корректным предикатом типа.

Так он проверяет не на число, а на "nonfalsy". То есть правильная тайпгардная типизация внутри BooleanConstructor была бы примерно такая:

<T>(value?: T): value is Exclude<T, null | undefined | 0 | 0n | '' | false>;

Любопытно, что если добавить эту сигнатуру в BooleanConstructor через слияние интерфейсов, то напрямую тайпгард начинает работать (if (Boolean(v)) { ... v ... }), а в filter не подхватывается

Когда у нас значение 0, то Boolean возвращает false. Поэтому Boolean не является корректным предикатом типов для number

Почему? Boolean отсеивает значения undefined и null, и вполне мог бы быть, например, тайпгардом (x: number | undefined) => x is number. Но он протипизирован не как тайпгард, а как обычный предикат, потому и не выкидывает undefined и null, как при вызове напрямую, так и через filter.

В версии 5.5 просто добавили несколько эвристик, по которым в ряде случаев не заданное явно возвращаемое значение функции будет выведено как предикат типа, а не просто логическое, например const isNum = (x: number | undefined) => x != null;. К случаю с Boolean это не относится

С пунктом 4 есть ещё более интересный прикол. Да, в object напрямую не засунуть примитив, но можно так:

const nn: {} = 1;
const obj: object = nn;

То есть object оказался надтипом для более широкого {}, что идет вразрез с иерархией типов.

П.3 широко известен, во многих библиотеках есть его исправление, добавляющее перегрузку для метода filter.

П.5 - следствие ковариантности изменяемого массива, добавленной для удобства и в своё время вызвавшей много споров.

Из тех, кто в июне 1941 зашел на территорию СССР, большинство были патриотами, причем довольно упоротыми.

Наверно, им ещё гарантировали нормальную бронь от мобы, если в нужный момент "ничего не сломается".

Относительно решения: кажется, для второй компоненты надо брать не 24, а 26. У нас тут 7 ребер, надо выкинуть 3 из них. Всего вариантов это сделать С(7, 3) = 35, "плохих" вариантов 9 штук: 4 тройки ребер, смежных с 4 вершинами, и 5 троек, в которых два ребра смежны с пятой вершиной. Итого 35 - 9 = 26

Для асимметричной монеты есть еще такой паззл: надо бросить честный жребий на 5 чел., но мы имеем право на старте выбрать и зафиксировать p (и q = 1 - p) по своему разумению. Придумать это самое "p" и алгоритм, чтобы гарантировать результат не более чем за N бросков (чем меньше N, тем лучше, знаю решение за N=5)

UFO landed and left these words here
UFO landed and left these words here

Итого, N мышей могут проверить 2^N колб. Но это за 1 раунд, то есть когда есть запас времени всего 1 час. А если у нас К раундов, т.е. К часов? Как обобщить?

Тогда можно проверить (K+1)^N колб. Номера колб представляем в (K+1)-чной системе счисления, это будет число из N разрядов, возможно с нулями впереди, чтобы было ровненько. Каждая мышь отвечает за свой разряд. На i-м раунде (i = 1..k) мышь с номером p пробует из тех колб, в номере которых p-я цифра равна i. Если погибла, то в номере искомой колбы p-й разряд равен i.

Кстати, всегда еще было интересно отчего у человека, в отличии от животных, волосы не перестают расти в длину

Причем это так только на голове

1
23 ...

Information

Rating
5,501-st
Location
Москва, Москва и Московская обл., Россия
Registered
Activity

Specialization

Frontend Developer
Senior
JavaScript
TypeScript
React
HTML
CSS
Web development
Redux
MobX
Webpack