객체를 다루기 위한 고차 함수

필드명을 명시적으로 만들기

// field라는 명시적 인자로 교체하였다.
function incrementField(item, field){
	const value = item[field];
	const newValue = value + 1;
	// 객체 업데이트 해주는 함수
	const newItem = objectSet(item, field, newValue);
	return newItem;
}
function incrementField(item, field){
	const value = item[field];
	const newValue = value + 1;
	// 객체 업데이트 해주는 함수
	const newItem = objectSet(item, field, newValue);
	return newItem;
}

function decrementField(item, field){
	const value = item[field];
	const newValue = value - 1;
	// 객체 업데이트 해주는 함수
	const newItem = objectSet(item, field, newValue);
	return newItem;
}

function halveField(item, field){
	const value = item[field];
	const newValue = value / 2;
	// 객체 업데이트 해주는 함수
	const newItem = objectSet(item, field, newValue);
	return newItem;
}
// 공통되는 부분을 함수로 추출한다.
function upateField(item, field, modify){
	const value = item[field];
	const newValue = modify(value);
	const newItem = objectSet(item, field, newValue);
	return newItem;
}

function incrementField(item, field){
	// return 하는애가 함수이지만 결국은 값이다.
	return updateField(item, field, (value) => value + 1)
}

function decrementField(item, field){
	return updateField(item, field, (value) => value - 1)
}

function halveField(item, field){
	return updateField(item, field, (value) => value * 2)
}

기존 함수와 비교

// 기존 함수
function incrementField(item, field){
	const value = item[field]; // 조회
	const newValue = value + 1; // 변경
	const newItem = objectSet(item, field, newValue); // 설정
	return newItem;
}

// 리팩토링한 함수
function incrementField(item, field){
	return updateField<T>(item : T, field : keyof T, (value) => value + 1)
}