env 파일 자동완성 및 에러 해결
const fetchData = async () => {
const response = await fetch(process.env.REACT_APP_TEST_ENV)
// Type 'undefined' is not assignable to type 'RequestInfo | URL'.ts(2345)
const result = response.json()
return result
}
useEffect(() => {
fetchData().then(console.log)
},[])
- 위와 같이
.env
파일의 타입 이슈를 해결하기 위해서는 환경 변수(.env) 타입 설정이 필요하다. CRA
를ts
로 설치하였을때src
디렉토리에react-app-env.d.ts
파일이 생기는데, 해당 파일 내부에 아래와 같이 원하는 환경변수의 타입을 지정하면 자동완성 및 에러 해결이 가능하다.
/// <reference types="react-scripts" />
declare namespace NodeJS {
interface ProcessEnv {
REACT_APP_TEST_ENV: string; // 환경 변수의 타입을 지정하도록 한다. (기존의 ProcessEnv interface를 확장)
}
}
Triple-Slash Directives
- 최상단에
/// <reference types="react-scripts" />
로 주석 처리된 문구는,Triple-Slash Directives
로, 단일 XML 태그를 포함한 한 줄 주석이며 컴파일러 지시어로써 사용된다. - 파일간의 의존성을 선언하는 역할을 하며, 컴파일 프로세스에 추가적인 파일을 포함하도록 컴파일러에게 지시한다.
CRA
에서는react-scripts
모듈 의존성을 선언함으로써react-app.d.ts
파일이 컴파일 프로세스에 포함하도록 지시가 되는 것이다.- 아래와 같이
react-scrips
에서 기본적으로 타입을 제공하는 확장자들을 확인할 수 있으며, 추가로 타입이 필요한 경우/// <reference types="react-scripts" />
주석이 선언된~.d.ts
파일 내부에 원하는 확장자, 환경 등의 타입을 확장함으로써 사용할 수 있다. (기존에는 프로젝트 초기 세팅시, 필요 없다고 생각하고 삭제한 후에 필요한 확장자 파일 타입이 존재할 경우~.d.ts
파일 추가 및 타입 지정을 하였지만 불필요한 작업인 듯싶다.)
/// <reference types="node" />
/// <reference types="react" />
/// <reference types="react-dom" />
declare namespace NodeJS {
interface ProcessEnv {
readonly NODE_ENV: 'development' | 'production' | 'test';
readonly PUBLIC_URL: string;
}
}
declare module '*.avif' {
const src: string;
export default src;
}
declare module '*.bmp' {
const src: string;
export default src;
}
declare module '*.gif' {
const src: string;
export default src;
}
declare module '*.jpg' {
const src: string;
export default src;
}
declare module '*.jpeg' {
const src: string;
export default src;
}
declare module '*.png' {
const src: string;
export default src;
}
declare module '*.webp' {
const src: string;
export default src;
}
declare module '*.svg' {
import * as React from 'react';
export const ReactComponent: React.FunctionComponent<React.SVGProps<
SVGSVGElement
> & { title?: string }>;
const src: string;
export default src;
}
declare module '*.module.css' {
const classes: { readonly [key: string]: string };
export default classes;
}
declare module '*.module.scss' {
const classes: { readonly [key: string]: string };
export default classes;
}
declare module '*.module.sass' {
const classes: { readonly [key: string]: string };
export default classes;
}
Reference
'React' 카테고리의 다른 글
React v18 주요 변경점 (0) | 2022.07.14 |
---|---|
TIL | React + twin.macro(with styled-component) 세팅 (0) | 2022.06.10 |
TIL | useRef의 3가지 정의와 리턴값의 두가지 타입 (0) | 2022.01.12 |
TIL | 간단한 custom hook 만들어보기 2 (0) | 2021.12.20 |
TIL | 간단한 custom hook 만들어보기 1 (0) | 2021.12.15 |