Search
Write a publication
Pull to refresh
7
0
Исаченков Дмитрий @kreddos

Frontend-разработчик

Send message

Как говорил мой дед : «лучше бездушный бокс взять, чем безприводную плойку»

Действительно, не обращал внимания, думал что разные люди пишут

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

Захожу на статьи про redux, что бы посмотреть как MobXеры бомбят на redux

Отчасти вы правы, но осоновная мысль, что дженерик тут лишний

Забыл написать, в вашем случае дженерики вообще не нужны так как можно просто сделать так

указать тип в onChange

Типизация Dropdown

мне кажется у вас слишком усложнено, у вас такой компонент, что приходится делать так

Придется явно указывать тип, как в вашем примере

<Dropdown<Item> label='Dropdown' onChange={item => console.log(item)}>

Но можно написать например так, и тут не придется мапить items, так как маппер передается и плюс тс сам поймет какие вы данные передали и высчитает тип

на мой взгляд так будет удобнее работать, но не претендую на самое правильное решение

это чисто мое ИМХО

render() {
    return <ComponentToCurry {...this.props} 
        {...curriedPropsRef.current} />;
}

Тут я бы поменял местами this.props и curriedProps, на мой вгляд у пропсов компонента должен быть приоритет выше.

А так, поддерживаю коммент выше, не очень понимаю какую поблему можно этим решить

А разве смена стека — это не шаг назад в карьере?

Тут мое мнение совпадает с вашим, и я полностью согласен с вашими доводами.

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

Более того на одном из прошлых мест работы, когда ты помогал ребятам с java, руководителем это не воспринималось как твое развитие, следовательно ты не растешь как специалист в своей области, а исходя из этого и поднимать тебе зп нет смысла. Хоть это и грустно, но я с таким сталкивался ни раз :(

Плюсую, у меня однажды был собес в компанию, где ты шаришь экран поднимаешь проектик и делаешь то, что говорит тебе интервьюер, параллельно задавая вопросы, по тому коду, что ты пишешь. Было меньше тупняков, так как твое окружение, которое работает, так как ты и ожидаешь

Я фронтендер, и работал в 2х компаниях, где была секция с алгоритмами. Скажу честно прошел я их с большим натягом, так как не могу сказать что я знаю алгоритмы. Но в обеих компаниях после собеседований на реальных проектах ни разу не приходилось их использовать, совсем, ни разу!

После этого я окончательно убедился, что алгоритмы нужны как раз, что бы скинуть ценник и в реальной работе они не нужны.

А подтверждающим моментом сыграл ответ hr после прохождения всех этапов: "Ты ребятам очень понравился, но результат алгоритмической секции не очень, поэтому мы можем тебе дать такой-то грейд и такую-то сумму, которая является максимальной на твой грейд".

const EventTypes = {
	click: 'click',
	dbClick: 'dbClick',
} as const;

type EventType = keyof typeof EventTypes;

interface ConfigEvent {
	type: EventType,
	id: string,
}

interface Config {
	id: string,
	steps: ConfigEvent[]
}

/// 

const OUR_FIRST_ONBOARDING: Config = {
	id: "НАШ_ПЕРВЫЙ_ОНБОРДИНГ",
	steps: [
		{
			type: EventTypes.click,
			id: 'ID_ПЕРВОГО_ШАГА',
		}
	]
}

class Service {
	private events: StepEvent[]

	/*
   * можно вынести сюда Классы по типу
   * и тут будет проверка на этапе компиляции
   * а если бутет новый эвент, то эта строка стразу подсветится
   */
	private eventClasses: Record<EventType, typeof StepEvent> = {
		click: StepClick,
		dbClick: StepClick,
	}
	
	constructor (private config: Config) {
		this.events = config.steps.map(this.mapConfigEventToStepEvent)
	}

	// если будет eventClasses, то этот метод вообще не придется трогать
	private mapConfigEventToStepEvent(configEvent: ConfigEvent) {
		const EventClass = this.eventClasses[configEvent.type];
		return new EventClass(configEvent.id);
	}

	

	emitEvent(stepNum: number) {
		const event = this.events[stepNum];
		
		if (!event) {
			return;
		}
		
		event.emit();
	}
}

В любом случае, я понимаю почему вы так сделали и спасибо за дискусию, просто не удержался вставить свои 5 копеек =(

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

я бы сделал как-то так, но возможно вы так пробовали и вам не зашло

class StepEvent {
	constructor(public id: string) {}

	emit() {}
}

class StepClick extends StepEvent {}

///

interface ConfigEvent {
	type: 'click',
	id: string,
}

interface Config {
	id: string,
	steps: ConfigEvent[]
}

/// 

const OUR_FIRST_ONBOARDING: Config = {
	id: "НАШ_ПЕРВЫЙ_ОНБОРДИНГ",
	steps: [
		{
			type: 'click',
			id: 'ID_ПЕРВОГО_ШАГА',
		}
	]
}

class Service {
	private events: StepEvent[]
	
	constructor (private config: Config) {
		this.events = config.steps.map(this.mapConfigEventToStepEvent)
	}

	private mapConfigEventToStepEvent(configEvent: ConfigEvent) {
		return new StepClick(configEvent.id);
	}

	

	emitEvent(stepNum: number) {
		const event = this.events[stepNum];
		
		if (!event) {
			return;
		}
		
		event.emit();
	}
}




const service = new Service(OUR_FIRST_ONBOARDING);
service.emitEvent(0);

Привет, есть вопрос по типизации, не очень понятно зачем расширять ручками интерфейсы, если тип к emitEvent можно высчитать автоматически

что я имею ввиду

const OUR_FIRST_ONBOARDING = {
    id: "НАШ_ПЕРВЫЙ_ОНБОРДИНГ",
    steps: [
        {
            id: "ID_ПЕРВОГО_ШАГА",
            type: StepTypes.CLICK,
            views: {
                pointer: {
                    type: PointerType.CANVAS,
                    elementId: 'ЭЛЕМЕНТ_НА_КОТОРЫЙ_ХОТИМ_ПОЛУЧИТЬ_КЛИК',
                },
                progress: {
                    current: 1,
                    total: 12,
                },
            },
        },
        {
            id: "ID_ВТОРОГО_ШАГА",
            type: StepTypes.INPUT,
            text: "текст, который нужно ввести",
            views: {
                pointer: {
                    type: PointerType.DOM,
                    elementId: 'ЭЛЕМЕНТ_НА_КОТОРЫЙ_ХОТИМ_ПОЛУЧИТЬ_ВВОД',
                },
                progress: {
                    current: 2,
                    total: 12,
                },
            },
        }
    // Еще 10 шагов
    ]
} as const;


type StepIDS = typeof OUR_FIRST_ONBOARDING.steps[number]['id'];

interface Event { 
    type: string,
    eventId: StepIDS
}

function emitEvent(id: Event) {

}

ну или вариант с несколькими конфигами

interface Event<T extends string> { 
    type: string,
    eventId: T
}


function emitEvent<CompanyStepIds extends string>(id: Event<CompanyStepIds>) {}
emitEvent<StepIDS>({
    type: '1',
    eventId: 'ID_ПЕРВОГО_ШАГА'
})

Возможно я ошибаюсь, но performance review проводится для оценки результативности разработчика, я думаю в таких местах достаточно встречки после просмотра пуллреквеста, где можно будет обсудить, что так делать не совсем корректно.

Возможно меня заминусят

но бывают моменты где иногда это может быть оправдано, пример реализации allSettled где мы юзали promise.then(...).catch(...). Но тут опять же встречка после пр может помочь сторонам высказать свое мение

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity