Pull to refresh

Comments 19

Вопрос 2 (typescript):

Дурацкое решение, которое не будет работать на прочих реализациях IComplexEvent.

class D1 implements IComplexEvent {}
processEvent(new D1());

хотя и сам вопрос тоже дурацкий

Отличный вопрос. Автор написал, что хотели услышать именно про Type Guards. Если это действительно так, для меня был бы звоночек о проф пригодности собеседущего и компании.

Было бы здорово не показывать ответы на вопросы изначально, вроде тут есть

Ну, на Вопрос 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. Названия интерфейсов прямо сходу напомнили этот паттерн.

Я примерно так же и ответил, но хотели про "is" услышать.

Это решение 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 в самый раз.

npm ci

Аналог npm install ... Работает гораздо быстрее

Очень спорное утверждение. Важное отличие команды `npm ci` - сначала она полностью удаляет папку `node_modules`. Для большого проекта на небыстром накопителе это может занять очень много времени. Последующее копирование в `node_modules` гигабайтов пакетов тоже может занять заметное время.

Спасибо, поправил, с учетом полного удаления node_modules.

Обычно в компания вызываются проводить собеседования самые инициативные идиоты, отсюда и вопросы такие

замечал что в Яндексе много таких инициативных)

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

И при этом все продолжают думать что TS - классный язык.

let func = function(arg1, arg2, ...argN) {
  return expression;
};

С каких пор анонимная функция стала стрелочной?

Sign up to leave a comment.

Articles