μΌλ§ μ μ, νλ‘μ νΈμμ μ¬μ©νλ νμ κ³Ό νμ μ€ν¬λ¦½νΈ μ½λμ μ΄μ μ κΈ°μ€μ λν΄μ μ 리νκ³ λ°νκΉμ§ νλ μκ°μ΄ μμλ€. μ΄λ² κΈμ κ·Έ λ μ 리λ λ 벨λ‘κ·Έ(λμ ν νλ‘μ νΈ)μ νμ μ€ν¬λ¦½νΈ κΈ°μ€μ λν΄ μ μ΄λ³΄κ² λ€.
μ΄ κΈμ μ μ μ΄μ λ 곧 μμ 6μ°¨ λ°λͺ¨μμ νμ μ€ν¬λ¦½νΈμ μ¬λ¬ κΈ°μ€μ λ°νν΄μΌνκΈ° λλ¬Έμ μ§κΈκ³Ό κ·Έ λ μλ‘κ² μ€μ λ λΆλΆμ λΉκ΅ν΄λ³΄κΈ° μν¨μ΄λ€!
λ 벨λ‘κ·Έμμλ children
propsλ₯Ό JSX.Element
λ‘ νμ
μ μ§μ νκ³ μλ€. μ΄λ κ² μ§μ ν μ΄μ λ JSX.Element
, ReactNode
, ReactElement
μ€μμ κ°μ₯ μ’μ νμ
μ΄μ¬μ μ¬μ©νλ€.
ReactElementλ typeκ³Ό propsκ° μλ κ°μ²΄μ΄κ³ , JSX.Elementλ type, propsκ° λͺ¨λ anyμΈ ReactElementμ΄λ€. JSXμ λν ꡬνμ λΌμ΄λΈλ¬λ¦¬ λ³λ‘ μΈλΆμ μΌλ‘ λ€λ₯Ό μ μλ€. μλ μ¬μ§μ ν΅ν΄ μΈ κ°μ§λ₯Ό λΉκ΅ν΄λ³΄μ.
μμ Component Typing With Children
μμ PropsWithChildren νμ
μ νμ©νμ§ μμκΈ° λλ¬Έμ, μ¬κΈ°λ children
λ§ propsμμ μ κ±°λ λμΌν ννμ νμ
μ κ°κ°μ μ»΄ν¬λνΈμ 맀κ°λ³μ νμ
μΌλ‘ Interface
λ₯Ό ν΅ν΄ μμ±ν΄ μ¬μ©νλ€.
λͺ¨λ κ°μ²΄μ νμ
μ μ§μ ν λ Interface
λ₯Ό μ¬μ©νκ³ , κ±°μ λͺ¨λ νμ
μ΄ Interface
λ₯Ό ν΅ν΄ μμ±λκ³ μμ§λ§, κ°λ ν¨μλ λ³μμ νμ
μ μ§μ ν λλ Type
λ³μΉμ μ¬μ©ν΄ μμ±νλ€.
λ 벨λ‘κ·Έμμ μ¬μ©λκ³ μλ μ΄λ²€νΈ νμ λ€μ μλμ κ°λ€.
React.SyntheticEvent<EventTarget>
React.FormEvent<HTMLFormElement>
React.MouseEvent<HTMLElement>
React.MouseEvent<HTMLButtonElement>
React.ChangeEvent<HTMLInputElement>
FocusEvent
μ΄λ¬ν νμ
λ€μ μΌμΌμ΄ μ°Ύμλ³΄κ³ μμ±νμ§λ μμκ³ , VSCode
μμ μ 곡νλ νμ
μ€μ μ λμμ λ°μ μμ±νμ΅λλ€. νμ¬λ μ§μ μ΄λ²€νΈ κ°μ²΄λ₯Ό μ¬μ©νλ νΈλ€λ¬μλ§ μ΄λ²€νΈ νμ
μ λ¬μ쀬λ€.
λΉλ νκ²½μ λ°λΌμ Webpack Config
κ° λ€λ₯΄κ² μ€μ λμ΄ μλλ°, λ€λ₯Έ μμλ€μ λͺ¨λ λ°°μ νκ³ Loader
λ₯Ό μ€μ¬μΌλ‘ μ°¨μ΄μ κ³Ό μ€μ μ μ΄μ λ₯Ό μ μ΄λ³΄κ² λ€.
local
λΉλμμλ babel-loader
λ₯Ό μ¬μ©νμλλ°, λ‘컬μμλ λ³κ²½μ μ λν νλ©΄λ³κ²½μ΄ λΉ λ₯Έ κ²μ΄ κ°λ°ν λ νΈνκΈ° λλ¬Έμ ts-loader
λ³΄λ€ λΉ λ₯Έ babel-loader
λ₯Ό μ¬μ©νλ€. babel-loader
λ₯Ό μ¬μ©νλ©΄ typescript μ¬μ©μ΄ λΆκ°νκΈ°μ babel.config.js
μμ μΆκ° μ€μ μ νμλ€.
νμ§λ§ μ§κΈμ μ€μ μμλ λ°λ²¨μ νμ
μ€ν¬λ¦½νΈ μ½λλ₯Ό μ κ±°νκ³ μ»΄νμΌμ νκΈ° λλ¬Έμ νμ
μλ¬λ₯Ό μ‘μ μκ° μκΈ° λλ¬Έμ μΆκ°μ μΈ babel.config.js
μ μ€μ μ΄ νμνλ€.
μΆκ°μ μΌλ‘ ReactRefreshWebpackPlugin
λ₯Ό νμ©νμ¬, λΉλ μλλ₯Ό λμμ΅λλ€.
// webpack.js
module: {
rules: [
{
test: /\.(ts|tsx)$/,
use: [
{
loader: 'babel-loader',
options: {
plugins: [require.resolve('react-refresh/babel')],
},
},
],
},
],
},
// babel.config.js
module.exports = {
presets: [
'@babel/env',
'@babel/preset-typescript',
['@babel/preset-react', { runtime: 'automatic' }],
],
};
develop
κ³Ό production
λ κ°μ§ νκ²½μμλ λͺ¨λ μ‘°κΈ λ리λλΌλ ts-loader
λ₯Ό μ¬μ©ν΄ μ»΄νμΌν λ νμ
κ²μ¬λ₯Ό μ§ννλλ‘νμ¬ λ μμ ν λΉλ νμΌμ μλ²μμ μ€ννλλ‘ νλ€.
module: {
rules: [
{
test: /\.(ts|tsx)$/,
use: 'ts-loader',
},
],
},
TSC
λ TypeScript Compiler μ΄λ€. ν° κ·Έλ¦Όμμ 보면, λ κ°μ§ μν μ μννλ€.
μ¬κΈ°μ λλΌμ΄ μ μ μ΄ λ κ°μ§κ° μλ‘ μλ²½ν λ 립μ μ΄λΌλ κ²μ΄λ€. νμ μ€ν¬λ¦½νΈλ‘ μμ±ν μ½λλ₯Ό μλ°μ€ν¬λ¦½νΈλ‘ μ»΄νμΌν λ μμ±ν νμ μ€ν¬λ¦½νΈ μ½λκ° μ ν¨ν μλ°μ€ν¬λ¦½νΈλΌλ©΄ νμ μ€λ₯κ° μλλΌλ, TSCλ μ½λλ₯Ό μ»΄νμΌμ μ±κ³΅νλ€.
νμ μ€ν¬λ¦½νΈκ° μλ°μ€ν¬λ¦½νΈλ‘ λ³νλ λ μ½λ λ΄μ νμ μλ μν₯μ μ£Όμ§ μκ³ , λν κ·Έ μλ°μ€ν¬λ¦½νΈμ μ€ν μμ μλ νμ μ μν₯μ λ―ΈμΉμ§ μλλ€.
νμ μ€ν¬λ¦½νΈμ μ€λ₯λ Cλ μλ° κ°μ μΈμ΄λ€μ κ²½κ³ (Warning)μ λΉμ·νλ€. λ¬Έμ κ° λ λ§ν λΆλΆμ μλ € μ£Όμ§λ§, λΉλλ₯Ό λ©μΆμ§λ μλλ€.
TSC
κ° νμ
μ€ν¬λ¦½νΈλ₯Ό νμ
μ€ν¬λ¦½νΈ ASTλ‘ λ³νν λ€μ, TSCμ Type Checker
κ° ASTλ₯Ό νμΈν΄ νμ
μ νμΈν΄ νλ‘κ·Έλ¨μ΄ κ°λ°μμ κΈ°λλλ‘ μ€νλ μ μκ² ν΄μ€λ€.
μμμλ μΈκΈνμ§λ§ νμ μ€ν¬λ¦½νΈ μ½λκ° μλ°μ€ν¬λ¦½νΈ μ½λλ‘ μ»΄νμΌν λλ κ°λ°μκ° μ¬μ©ν νμ μ νμΈνμ§ μμΌλ©°, κ°λ°μκ° κΈ°μ ν νμ μ 보λ μ΅μ’ μ μΌλ‘ λ§λ€μ΄μ§λ νλ‘κ·Έλ¨μ μλ¬΄λ° μν₯μ μ£Όμ§ μμΌλ©° λ¨μ§ νμ μ νμΈνλλ°λ§ μ°μΈλ€.
νμ μ€ν¬λ¦½νΈλ μ μ§μ μ»΄νμΌμ μ§μνλ μ μ μΈμ΄μ΄κΈ° λλ¬Έμ, μ€μ κ°λ°μκ° μ½λ©μ μμνλ©΄ μ½λ νΈμ§κΈ°κ° νμ κ΄λ ¨ μλ¬λ₯Ό λͺ¨λ κ²μΆνλ€.
νμ
μ€ν¬λ¦½νΈλ₯Ό μ€μΉνκ² λλ©΄ tsc
λΏλ§ μλλΌ tsserver
μμ μ 곡νλ μΈμ΄ μλΉμ€λ μ½λ νΈμ§κΈ°μμ μ¬μ©νκ² λλ€. νμ
μ€ν¬λ¦½νΈκ° μ½λλ₯Ό μμ± μ€μ λ³μλ ν¨μμ νμ
μ 무μμΌλ‘ μΆλ‘ νλμ§ μ μ μλ μ’μ λꡬμΈλ°, μ΄λ κ² νΈμ§κΈ°μμ νμ
μ μ¦μμΌλ‘ νμΈν μ μλ€λ κ²μ tsserver
μλ tsc
μ μλ κ²κ³Ό λμΌν Type Checker
κ° μλ κ±ΈκΉ? μμ§ κ³΅λΆκ° λ νμν κ² κ°λ€.