티스토리 뷰
React로 진행한 프로젝트를 중간에 Typescript로 변경하기 1
지난번에 변경하는 방법을 공부를 했는데 직업 바꾸려니 추가로 해줘야 하는 부분이 더 있어서 추가로 기록해 둔다.
기존에 vite로 환경을 구축하고 React로 진행했던 프로젝트(VITE와 Firestore를 사용했다.)를 Typescript로 업그레이드했다. 다른 타입스크립트 프로젝트를 참고하며 해결했다. 타입스크립트를 설치하고 파일 확장자를 바꾸자마자 뜨는 지독한 빨간 줄 해결하기~ 😀🤜
가장 상위 파일에 HTMLElement 붙여주기
// main.jsx
ReactDOM.createRoot(document.getElementById('root')).render(
<React.StrictMode>
<Router />
</React.StrictMode>
);
// main.tsx
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode>
<Router />
</React.StrictMode>
);
tsconfig.json 만들어주기
Router.tsx부터해서 불만이 많다고 몸부림치는 파일들이 가득하다. 뭐가 문제인지도 모르겠는 와중에
'React' refers to a UMD global, but the current file is a module.
라면서 불만을 토한다. tsconfig.json를 만들어주면 조용해지는데 다른 프로젝트들을 보니 references의 path에 tsconfig.node.json가 있어서 tsconfig.node.json도 만들어줬다.
+ tsconfig.node.json에 input이 없다고 빨간 줄이 생길 때
No inputs were found in config file '내 파일 디렉터리'.... include는 ["src"] exclude는 []다. ...
이런 에러가 뜬다면 일단 에디터를 껐다 켜본다. 나는 껐다 켰더니 해결됐다.
index.html에 가서 파일 이름 변경해 주기
<!--기존-->
<script type="module" src="/src/main.jsx"></script>
<!--변경-->
<script type="module" src="/src/main.tsx"></script>
package.json에 빌드 명령어 추가하기
// 기존
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
// 수정
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
},
.env 파일 사용하기 위해 tsconfig에 옵션 추가하기
vite는 환경변수에 import.meta.env.VITE_변수명으로 접근한다. firebase에 필요한 key들 때문에 env를 사용했는데 빨간 줄이 떴다. tsconfig.json에 types를 추가해 주면 된다.
// 기존
{
"compilerOptions": {
...
"module": "ESNext",
...
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
// 추가
{
"compilerOptions": {
...
"module": "ESNext",
"types": ["vite/client"],
...
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}
firebase에서 사용하는 메서드 에러 해결하기
1. doc에 뜨는 에러 해결하기
마지막 인자인 params는 파라미터값을 받아오므로 undefined이 될 수 있다. doc의 세 번째 파라미터는 string만 들어올 수 있어 허용될 수 없었다. undefined일 경우를 대비해 문자열을 넣어줬다.
// 기존
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
const docRef = doc(db, 'rolling-paper', params);
// 변경
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
const docRef = doc(db, 'rolling-paper', !!params ? params : '홍길동');
2. await getDoc(docRef)에 뜨는 에러 해결하기
기존에는 콘솔에 찍어보면서 경로를 타고 타고 가서 데이터를 꺼냈다. 전에 왜 이렇게 복잡하게 해 뒀을까 생각했던 기억이 나는데 내가 접근을 잘못했던 거였다. _가 들어간 속성은 직접 접근해서 사용하라고 있는 건 아닌 것 같고 프로토타입에 있는 메서드를 이용해서 데이터에 접근하는 게 옳은 방법 같다...🥲
// 기존
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
const docRef = doc(db, 'rolling-paper', params);
const letters = await getDoc(docRef);
if (letters._document.data.value.mapValue.fields !== undefined) {
let dataList = Object.entries(
letters._document.data.value.mapValue.fields
);
dataList = dataList.map((message) => {
return message.map((el, i) => {
return i === 1 ? el.stringValue : el;
});
});
setList(dataList);
} else {
setList([]);
}
타입스크립트에서는 사용할 수 있는 메서드나 접근할 수 있는 속성이 정해져 있는데 그중에 _document는 존재하지 않아서 에러가 뜬 것이었다. exists()라는 메서드로 데이터가 있는지 여부를 확인한 다음 data() 메서드로 데이터를 가져오면 객체로 데이터들이 얌전하게 들어있었다. (왜 타고 타고 들어갔던 것인가....😭) entries()로 데이터를 꺼내와 state를 변경해 주었다. 자꾸 any가 들어온다고 해서 이 부분은 어쩔 수 없었다....
해결을 못하다가 letters.을 치고 고민하고 있었는데 자동 완성이 떠서😳!!! 하며 해결할 수 있었다. 타입스크립트의 자동 완성 기능을 적극 사용해 본 기회였다.
// 수정
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
const docRef = doc(db, 'rolling-paper', !!params ? params : '홍길동');
const letters = await getDoc(docRef);
if (letters.exists()) {
let dataList: [string, any][] = Object.entries(letters.data());
setList(dataList);
} else {
setList([]);
}
'공부 노트' 카테고리의 다른 글
[올해까치] 이메일 보내기 1. 파이썬 이메일 자동화 (0) | 2023.06.12 |
---|---|
React에서 import 할 때 ../ 안쓰고 절대 경로 쓰기 (0) | 2023.03.28 |
[JS] toLocaleString() (0) | 2023.01.12 |
[Git] 레포 포크하고 잔디심기 (0) | 2022.11.29 |
foundation 백엔드 세션 1. (0) | 2022.11.25 |
- Total
- Today
- Yesterday
- git
- js
- 드림코딩
- 제로초
- 저스트코드
- TS
- 김버그
- 코딩앙마
- 깃
- 리액트
- 스파르타코딩클럽
- javascript
- vue
- Python
- 회고
- map
- 제이쿼리
- html
- 비주얼스튜디오코드
- CSS
- 자바스크립트
- 파이썬
- vscode
- Til
- 타입스크립트
- 코드잇
- scss
- Typescript
- React
- 구름에듀
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |