[React.ts] React๋ฅผ Typescript๋ก ์์ํด๋ณด๊ธฐ - Props, State
์ด๋ฒ ๊ธ์์๋ Props, State๋ฅผ Typescript์์ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Javascript์์๋ state๋ฅผ ์ ์ํ๊ธฐ ์ํด ์์ฑ์๋ฅผ ์ฌ์ฉํ์๊ณ , ํด๋น ์์ฑ์์ ํ๋ผ๋ฏธํฐ๋ก Props๋ฅผ ๋ฃ์ด์ฃผ์์ผ๋ฉฐ Props๊ฐ ํ์ํ๋ค๋ฉด, ์ปดํฌ๋ํธ ์ฝ๋ ๋ฐ์ Props ํ์ ์ ์ ์ํ์์ต๋๋ค.
import React, { Component } from 'react';
class Header extends Component {
constructor(props) {
super(props);
this.state = {
...
};
}
render() {
return (
<div>
Practice App
</div>
);
}
}
export default Header;
ํ์ง๋ง Typescript์์ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, Type์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ง๋๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ Props์ State๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ทธ ์์์ ์ ํด์ค์ผ ํฉ๋๋ค.
Typescript์์๋ ์ด๋ฅผ ์ ์ํ ์ ์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- Type์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- Interface๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
Props, State ๋ ๋ค ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ต๋๋ค. Interface๋ OOP ์ธ์ด๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ ๋ถ๋ค์ด๋ผ๋ฉด ๋์น์ฑ์ จ์ ๊ฒ์ ๋๋ค. ๋ณดํต Java์์๋ ์ธํฐํ์ด์ค๋ฅผ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ฏธ๋ฆฌ ์ ์ํ ๋ ์ฌ์ฉํ์์ฃ . Typescript์์๋ ๋ฉ์๋ ๋ฟ๋ง ์๋๋ผ, ๋ฐ์ดํฐ์ ํ์ ๋ ๋ฏธ๋ฆฌ ์ ์ํ ์ ์์ต๋๋ค.
๋ฐ๋๋ก Type ๋ฌธ๋ฒ์ C, C++์์ typedef struct์ ๋น์ทํฉ๋๋ค. ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ ๋ ์์ฃผ ์ฌ์ฉํ๋ typedef๋ ์ค์ ๋ก ํ์ ์ ์ฌ์ ์ํ๋ ๋ฐฉ๋ฒ์ด๊ณ , struct๋ ๋ฐ์ดํฐ ํ์ ์ด ์๋ก ๋ค๋ฅธ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ์ฐ๋ ๋ฐฉ๋ฒ์ด์ฃ . Typescript์์๋ ๋ฐ์ดํฐ ํ์ ์ด ์๋ก ๋ค๋ฅธ ๋ณ์๋ฅผ ์ ์ฅํด๋๊ณ ์ด ์ด๋ฆ์ ์ ์๊น์ง ํ๋ ๊ฒ๊น์ง ๊ฐ๋ฅํฉ๋๋ค.
Class-like
import React, { Component } from 'react';
type appProps = {};
type appState = {
title: string;
}
class Header extends Component<appProps, appState> {
constructor(props: appProps) {
super(props);
this.state = {
title: "Practice App"
};
}
render() {
return (
<div>
{this.state.title}
</div>
);
}
};
export default Header;
type์ผ๋ก ์ ์ํ ๋๋ ๋ฐ๋์ = ์ ๋ถ์ฌ์ฃผ์ธ์.
import React, { Component } from 'react';
interface appProps {}
interface appState {
title: string
}
class Header extends Component<appProps, appState> {
constructor(props: appProps) {
super(props);
this.state = {
title: "Practice App"
};
}
render() {
return (
<div>
{this.state.title}
</div>
);
}
};
export default Header;
interface๋ก ์ ์ํ ๋๋ Java์ ๋์ผํ๊ฒ ์งํํ ๋, ๊ฐ ๋ณ์ ์ด๋ฆ๊ณผ ํ์ ์ Json ์ ์ํ ๋ฏ๋ง ์งํํ๋ฉด ๋ฉ๋๋ค.
Class๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋๋ฐํ ๋๋ ์์ฑ์์ state ๊ฐ์ ์ด๊ธฐํ ํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง Type์ด๋ Interface์ ์ง์ ๊ทธ ๊ฐ์ ์ด๊ธฐํ ํด์ค ์ ์๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ์์ฑ์์์ ๊ฐ์ ์ด๊ธฐํ ํ ๊ฒฝ์ฐ, Props์ ๋ฐ์ดํฐ ํ์ ์ ์ ์ํด์ค์ผ ํฉ๋๋ค.
import React, { Component } from 'react';
interface appProps {
subTitle?: string;
}
interface appState {
title: string;
}
class Header extends Component<appProps, appState> {
constructor(props: appProps) {
super(props);
this.state = {
title: "Practice App"
};
}
render() {
return (
<div>
{this.state.title}
</div>
);
}
};
export default Header;
๋จ, Props์ ๋ฐ์ดํฐ ํ์ ์ ์ ํ์ฌ ์ปดํฌ๋ํธ์ Genericํ ๊ฒฝ์ฐ, ์์ ์ปดํฌ๋ํธ์์ ๋ฐ๋์ ํด๋น Props์ ๊ฐ์ ๋ฃ์ด์ผ ํฉ๋๋ค. ๋ง์ฝ ์๋ฌด๋ฐ ๊ฐ๋ ๋ฃ์ง ์์ ๊ฒฝ์ฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉฐ, ์ด ์ค๋ฅ๋ ๋ง์น Java์ NullPointerException๊ณผ ํก์ฌํ ๋ชจ์ต์ผ๋ก ๋ณด์ฌ์ค๋๋ค.
๋ง์ฝ ๋ฐ์ดํฐ๋ง ์ ์ํ๊ณ , ๋์ค์ ์ด ๊ฐ์ ๋ฃ์ผ๋ ค ํ๋ค๋ฉด, ๊ฐ ๋ณ์์ '?'๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๊ฐ์ด NULL์ผ ์๋ ์์์ ์๋ ค์ฃผ์ธ์.
Functional Programming
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฌ์ฉํ ๋๋ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. React 16.x ๋ฒ์ ๋ถํฐ ์๋ก์ด ๋์จ React Hooks๋ฅผ ์ฌ์ฉํ ๋๋ interface๋ type ๋ฌธ๋ฒ์ผ๋ก State๋ฅผ ์ ์ํด์ฃผ์ง ์์๋ ๋ฉ๋๋ค.
import React, { useState } from 'react';
interface appProps {
title?: string;
subtitle?: string;
}
const Header = ({ title, subtitle }: appProps) => {
const [msg, setMsg] = useState('Welcome to My App');
return (
<div>
{msg}
</div>
);
};
export default Header;
useState๋ React 16.x์์ ์๋ก์ด ๋์จ ํจ์์ด๋ฉฐ state ๊ฐ์ ์ ์ํ๊ฑฐ๋ ๋ฐ๊ฟ ๋ ์ฌ์ฉํ๋ ํจ์์ ๋๋ค. ๊ธฐ์กด์๋ setState๋ผ๋ ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์์ง๋ง ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ useState๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ state ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
'Programming > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React.ts] React๋ฅผ Typescript๋ก ์์ํด๋ณด๊ธฐ - ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ฑ (0) | 2019.11.02 |
---|