Comments 19
Некоторые ответы крайне сомнительные
Вопрос 2 (typescript):
Дурацкое решение, которое не будет работать на прочих реализациях IComplexEvent.
class D1 implements IComplexEvent {}
processEvent(new D1());
хотя и сам вопрос тоже дурацкий
Было бы здорово не показывать ответы на вопросы изначально, вроде тут есть
Ну, на Вопрос 2 есть сильно более лучший ответ. Есть более правильные, надёжные и масштабируемые способы решить эту проблему даже в масштабах технического интервью.
Branded/Tagged types
// Tagged types directly
interface IEvent {}
interface ISimpleEvent extends IEvent {
__tag: 'ISimpleEvent';
}
interface IComplexEvent extends IEvent {
__tag: 'IComplexEvent';
}
class T implements ISimpleEvent {
__tag: 'ISimpleEvent' = 'ISimpleEvent';
}
class D implements IComplexEvent {
__tag: 'IComplexEvent' = 'IComplexEvent';
}
function isComplexEvent(smth: any): smth is IComplexEvent {
return smth?.__tag === 'IComplexEvent';
}
function processEvent(event: IEvent) {
if(isComplexEvent(event)) {
console.log('ComplexEvent');
} else {
console.log('SimpleEvent');
}
}
// Or Branded type helper
type Branded<A, B> = A & { __brand: B };
type IEvent2 = Branded<{}, 'IEevent2'>;
type ISimpleEvent2 = Branded<{/*...*/}, 'ISimpleEvent2'>;
type IComplexEvent2 = Branded<{/*...*/}, 'IComplexEvent2'>;
// ... and so on
Да тоже так себе, особенно функция isComplexEvent. Постановка вопроса сама по себе неправильная. Не надо проверять, что там за интерфейс. В интерфейсе IEvent просто должен быть метод process. Либо, на самый крайний случай, поле type.
Вот, например - https://refactoring.guru/ru/design-patterns/composite. Названия интерфейсов прямо сходу напомнили этот паттерн.
Это решение JS, которое непосредственно мутирует и влияет на исходный объект. Тебе необходимо иметь поле и желательно на стороне backend и на стороне frontend и в БД чтобы так было.
А представленное решение это функционал TypeScript через Guards
Так а по другому не получится, если действительно очень хочется опираться на интерфейсы - никаких интерфейсов в рантайме нету. А для того, чтобы TypeGuards завелись для интерфейсов - эти самые интерфейсы нужно в рантайме как-то различать. И различать их путём перебора всех возможных наследников - ну такая себе идея.
Там выше заметили, что вообще вопрос неправильный и спрашивать надо не так :). Ну, вопрос такой, какой есть. И Type Labeling вполне себе стандартный подход для решения этой проблемы в TS. Да, типы придётся потэгать ручками. Но, компилятор любезно даст по рукам, если забыть это сделать, а на этом все проблемы и заканчиваются
console.log(counter()); // output: 0
console.log(counter()); // output: 1
console.log(counter()); // output: 2
За решение создавать глобальную переменную через var внутри функции - голову бы оторвал в 2022 году. Сейчас тут только yield в самый раз.
Спасибо за var, изменил на let. Это замыкание (closure), довольно распространенное решение в js. https://ru.stackoverflow.com/questions/694664/Создать-счетчик-через-замыкание
npm ci
Аналог npm install ... Работает гораздо быстрее
Очень спорное утверждение. Важное отличие команды `npm ci` - сначала она полностью удаляет папку `node_modules`. Для большого проекта на небыстром накопителе это может занять очень много времени. Последующее копирование в `node_modules` гигабайтов пакетов тоже может занять заметное время.
Для getCounter() лучше всего подошли бы генераторы
https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Iterators_and_Generators#генераторы
Обычно в компания вызываются проводить собеседования самые инициативные идиоты, отсюда и вопросы такие
Забавно что каждый раз когда кто-то приводит решения каких-либо задач на TS в каментах появляется кто-нибудь, кто называет предложенное решение плохим, предлагает свой вариант, затем находится уже очередной знаток TS, который находит проблему в новом решении и... судя по некоторым постам так может продолжаться достаточно долго.
И при этом все продолжают думать что TS - классный язык.
let func = function(arg1, arg2, ...argN) {
return expression;
};
С каких пор анонимная функция стала стрелочной?
Собеседование по Javascript, мой опыт. Часть вторая