✔️라이브러리 설치
npm i -D typescript esbuild-loader @types/react @types/react-dom
yarn add -D typescript esbuild-loader @types/react @types/react-dom
//efinitelyTyped 오픈소스에 등록된 타입 선언 파일 설치
npm i -D @types/<library name>
//webpack.config.js
module.exports = {
//entry:앱을 시작할 파일
entry: "./src/app.tsx",
//output: 웹팩 번들링 결과에 대한 옵션. 기본경로는 dist
output: {
filename: "./bundle.js",
},
//resolve: 번들링할 확장자 설정
resolve: {
extensions: [".js", ".jsx", ".ts", ".tsx"],
},
//module: 번들링할 때 플러그인 설정 가능
module: {
rules: [
{
test: /\.(t|j)sx?$/,
// esbuild-loader: 타입스크립트 변환을 위한 로더
loader: "esbuild-loader",
options: {
loader: "tsx", // Or 'ts' if you don't need tsx
target: "es2015",
},
},
{
test: /\.css$/,
//css-loader: .css 확장자의 css파일을 읽기 위한로더
//style-loader: style태그를 삽입해 dom에 css추가
use: ["style-loader", "css-loader"],
},
],
},
//externals: 번들링 결과에서 제외할 라이브러리들
externals: {
react: "React",
"react-dom": "ReactDOM",
},
};
✔️타입스크립트 프로젝트 시작하기
npx create-react-app <프로젝트 이름> -template typescript
Props 타입 적용
export const Button = (props: React.PropsWithChildren<ButtonProps>) => {
return <button {...props} }>{props.children}</button>;
}
export const Button: React.FC<ButtonProps> = (props) => {
return <button style={props.buttonStyles}>{props.children}</button>;
};
type FC<P = {}> = FunctionComponent<P>;
interface FunctionComponent<P = {}> {
(props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
}
//React.FC 타입을 사용하면 내부적으로 PropsWithChildren을 사용하여
//제네릭의 Props 타입과children 타입을 인터섹션.props에
//React.PropsWithChildren을 선언하는 것과 같은 효과
Hook에 타입 적용
function useState<S>(initialState: S | (() => S)): [S, Dispatch<SetStateAction<S>>];
function useState<S = undefined>(): [S | undefined, Dispatch<SetStateAction<S | undefined>>];
//초기값으로 state 타입을 결정
const [name, setName] = useState(null)
//초기값이 없다면 undefined로 설정
const [name, setName] = useState()
💥React에서의 타입스크립트
template literal type
다른 컴포넌트의 props 추출