Today I Learned
- Typescript로 React TO-DO-LIST 리팩토링하기
Recoil 공부
공식 문서 https://recoiljs.org/ko/docs/introduction/getting-started/
참고 영상 https://www.youtube.com/watch?v=t934FOlOMoM
typescript로 react project 만들기
index.tsx 에러
const root = ReactDOM.createRoot(
document.getElementById('root') as HTMLElement
);
as HTMLElement라고 타입을 지정해줘야 한다.
typescript에서 styled-components 사용하기
npm i --save-dev @types/styled-components
하라는 대로 설치하니까 에러가 사라졌다!
Router.ts
.ts가 아니라 .tsx로 변경해야 한다.
jsx->tsx 에러 하나씩 해결하기
useSelector
export type RootState = ReturnType<typeof store.getState>
useSelector((state: RootState) => state.todos);
RootState를 사용하면 state의 타입을 알아서 지정해준다고 한다. indes.ts에 RootState를 export하고 useSelctor를 사용할 때 import해서 state의 타입을 RootState로 지정한다.
객체에 type 지정
todos.find((list: TodosType) => list.id === param.id);
다양한 방법이 있겠지만 나는 interface를 이용했다.
event의 type은?
input에 값을 입력했을 때 e.target.value로 그 입력한 내용을 가져오는 함수인데 과연 여기서 e의 type은 무엇일까?
input 태그의 onChange에 마우스를 올려보면 해당 type을 알 수 있다.
e: React.ChangeEvent<HTMLInputElement>
참고 https://velog.io/@ahn0min/TypeSCript-event-의-type-은-무엇일까
styled-components props 받을 때
const Btn = styled.button<{backgroundColor: string}>`
background-color: ${(props) => props.backgroundColor};
`
참고 https://velog.io/@altjsvnf/TS-TypeScript에서-Styled-component-사용하기
useRef 사용하기 (current.focus)
const titleRef = useRef<HTMLInputElement>(null);
if ( !title && !content && titleRef.current ) {
e.preventDefault();
titleRef.current.focus()
alert('제목과 내용을 모두 입력해주세요.')
}
if문 조건에 ref.current인 경우를 추가해야 한다.
참고
https://curryyou.tistory.com/488
https://velog.io/@rkio/Typescript-useRef와-Typescript를-같이-사용하는-경우
https://driip.me/7126d5d5-1937-44a8-98ed-f9065a7c35b5
uuid 설치하기
npm i --save-dev @types/uuid
button 태그 onClick
const addHandler = (e: React.FormEvent<HTMLFormElement>) => {
}
input에 제목과 내용을 입력하고 [추가하기] 버튼을 클릭하면 정보가 state에 저장되는 부분인데 onClick이 자꾸 에러가 떠서 button 태그가 아니라 form 태그에 onSubmit을 사용하는 방식으로 수정했더니 해결되었다.
컴포넌트를 통해 props를 받아올 때
// props 보내는 부분
<TodoList isDone={false} />
// porps 받아 오는 부분
interface IsDone { isDone: boolean }
function TodoList ({isDone}: IsDone) {
}
Programmers 문제 풀기
삼각형의 완성 조건
나의 풀이
function solution(sides) {
sides.sort((a,b)=>b-a)
if (sides[0] < sides[1] + sides[2]) return 1
else return 2
}
어제 배운 sort() 메서드 바로 사용하기!
다른 사람의 풀이
function solution(sides) {
sides = sides.sort((a,b) => a-b)
return sides[0]+sides[1] > sides[2] ? 1 : 2;
}
return 부분을 삼항연산자를 이용해서 더욱 깔끔하게 작성할 수 있다.
짝수는 싫어요
function solution(n) {
let array = [];
for (i = 1; i <= n; i+=2) {
array.push(i)
}
return array;
}
중앙값 구하기
나의 풀이
function solution(array) {
array.sort((a,b)=>a-b)
let index = Math.floor(array.length/2)
return array[index];
}
다른 사람의 풀이
function solution(array) {
return array.sort((a, b) => a - b)[Math.floor(array.length / 2)];
}
나랑 동일한 풀이지만 코드를 한 줄로 간결하게 정리할 수 있었다.
배열의 유사도
function solution(s1, s2) {
return s1.filter((x) => s2.includes(x)).length
}
처음엔 2중 for문을 생각했다가 배열 안에 있는 요소를 찾는 메서드는 없을까 검색해서 찾아냈다. 내가 작성한 답변이 두 배열의 교집합을 찾아주는 것이라고 생각하면 된다. s1 배열을 filter를 돌리는데 s2 배열에 x라는 동일한 요소가 있을 때만 배열에 넣어주는 것이다.
참고 https://soft91.tistory.com/84
회고
오전에는 타입스크립트 공부하기 싫어서 프로그래머스 문제를 조금 풀고 오후에는 갑자기 타입스크립트 타임어택 과제가 떠서 정신없이 시간을 보냈다. 과제는 기존에 만들었던 react-redux 투두리스트를 타입스크립트를 이용해서 리팩토링하는 것이었는데 나는 아예 타입스크립트를 적용한 리액트 프로젝트를 새로 만들어서 기존의 폴더를 가져온 후에 js->ts로 바꾸는 식으로 리팩토링을 했다. 사실 너무 갑자기 주어진 과제에 당황스럽긴 하지만 직접 해 보면서 배우는 게 빨리 실력을 늘릴 수 있는 방법인 거 같긴 하다.