๋ฆฌ์กํธ ์ฝ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ๊ธฐ ์ํ ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ๋ณธ ํ์ฉ๋ฒ
2024 / 01 / 04 (๋ชฉ)
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ ๋ ํ์ ์ ์๊ฒฉํ๊ฒ,๊ทธ๋ฆฌ๊ณ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ค์ ๋ ๋ฒ๊ทธ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์๋ ์๊ณ ,์ฝ๋์ ํ์ง๋ ํ์ธต ์ฌ๋ฆด ์ ์์ ๊ฒ์ด๋ค.
ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ์์ฑํ ๋ ์ค์ ์ค ํ๋๋ any๋ฅผ ์์ฃผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ any๋ ์ ๋ง ๋ถ๊ฐํผํ ๋๋ง ์ฌ์ฉํด์ผ ํ๋ ํ์
์ด๋ผ๊ณ ํ๋ค.
any๋ฅผ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ฌ์ค์ ํ์
์คํฌ๋ฆฝํธ๊ฐ ์ ๊ณตํ๋ ์ ์ ํ์ดํ์ ์ด์ ์ ๋ชจ๋ ๋ฒ๋ฆฌ๋ ๊ฒ์ด๋ ๋ค๋ฆ์๋ค.
<script>
function doSomething(callback:any){
callback()
}
//ํ์
์คํฌ๋ฆฝํธ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.๊ทธ๋ฌ๋ ์ด ์ฝ๋๋ ์คํ ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
doSomething(1)
</script>
doSomethingํจ์๋ callback์ ์ธ์๋ก ๋ฐ๋๋ฐ ์ด ํ์
์ด any๋ก ์ ์ธ ๋์ด ์์ด์ ์ค์ ๋ก ํจ์๊ฐ ์๋ ๊ฐ์ด ๋ค์ด๊ฐ๋ ํ์
์คํฌ๋ฆฝํธ๊ฐ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค.
์ค์ ๋ก ์ด ์ฝ๋๊ฐ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ ๋ฐํ์์ด ๋ ๊ฒ์ด๊ณ ,ํ์
์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด์ง ๊ฒ์ด๋ค.any๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์
์คํฌ๋ฆฝํธ๋ก ๋์ด๊ฐ๋ ๊ณผ๋๊ธฐ์ ๊ฐ์ ์ ๋ง๋ก ์์ธ์ ์ธ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๋์ ๋ถ๊ฐํผํ๊ฒ ์์ง ํ์
์ ๋จ์ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ unknown
์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.unknown์ ๋ชจ๋ ๊ฐ์ ํ ๋นํ ์ ์๋ ์ด๋ฅธ๋ฐ top type์ผ๋ก,์ด๋ ํ ๊ฐ๋ ํ ๋นํ ์ ์๋ค. ๊ทธ๋ฌ๋ any์๋ ๋ค๋ฅด๊ฒ, ์ด ๊ฐ์ ๋ฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
<script>
function doSomething(callback:unknown){
callback() // 'callback' is of type 'unknown'
}
</script>
์๋ฌ ๋ด์ฉ์ callback์ unknown, ์ฆ ์์ง ์ ์ ์๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค๋ ๋ด์ฉ์ด๋ค.
unknown์ผ๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ type narrowing, ์ฆ ํ์
์ ์๋ ์๋ํ๋ ๋๋ก ์ ์ ํ๊ฒ ์ขํ์ผ ํ๋ค.
<script>
function doSomething(callback:unknown){
if(typeof callback === 'function'){
callback()
}
throw new Error('callback์ ํจ์์ฌ์ผ ํฉ๋๋ค.')
}
</script>
typeof๋ฅผ ์ฌ์ฉํด์ unknown์ ์ง์ ์ ๊ทผํ๋ ๋์ ,ํด๋น unknown ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํ์
์ผ ๋๋ง ์๋๋๋ก ์๋ํ๋๋ก ์์ ํ๋ค.
์ด๋ ๊ฒ unknown์์ ์ฌ์ฉํ๋ ๊ฒ์ ์์์น ๋ชปํ ํ์
์ ๋ฐ์๋ค์ผ ์ ์์์ ๋ฌผ๋ก ,์ฌ์ฉํ๋ ์ชฝ์์๋ ๋์ฑ ์์ ํ๊ฒ ์ธ ์ ์๋ค. any๋ณด๋จ unknown์ ์ฌ์ฉํ๋ ์ต๊ด์ ๋ค์ด์.
top type์ธ unknown์๊ณผ ๋ฐ๋๋๋ bottom type์ผ๋ก never
๊ฐ ์๋ค.
์ด neverํ์
์ unknown๊ณผ ๋ฐ๋๋ก,์ด๋ ํ ํ์
๋ ๋ค์ด์ฌ ์ ์์์ ์๋ฏธํ๋ค.
์๋ฅผ๋ค์ด ๊ฐ์ ํ์
์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
<script>
type what1 = string & number
type what2 = ('hello' | 'hi') & 'react'
</script>
์ฒซ ๋ฒ์งธ ํ์
what1์๋ string๊ณผ number๋ฅผ ๊ต์ฐจํ๋ ํ์
์ ์ ์ธํ๋ค.
๊ทธ๋ฌ๋ ๋น์ฐํ๊ฒ๋ string๊ณผ number๋ฅผ ๋ ๋ค ๋ง์กฑ์ํค๋ ํ์
์ ์กด์ฌํ์ง ์๋๋ค.๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ never๊ฐ ์ ์ธ๋๋ค.
๋ ๋ฒ์งธ ํ์ what2์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ค.์์ชฝ ๋ ํ์ ์๋ ๊ต์ฐจ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ์๋ never๊ฐ ์ ์ธ๋๋ค.
์ด์ฒ๋ผ ์ฝ๋์์ผ๋ก ์กด์ฌ๊ฐ ๋ถ๊ฐ๋ฅํ ํ์ ์ ๋ํ๋ผ ๋ never๊ฐ ์ฌ์ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ด ์ค์ ๋ก ์ด๋ค ์์ผ๋ก ์ฌ์ฉ๋ ์ ์์๊น?
ํ์
์คํฌ๋ฆฝํธ๋ก ํด๋์คํ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ ๋ props๋ ์์ง๋ง state๊ฐ ์กด์ฌํ๋ ์ํฉ์์ ์ด ๋นprops, ์ ํํ๋ ์ด๋ ํ props๋ ๋ฐ์๋ค์ด์ง ์๋๋ค๋ ๋ป์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
<script>
type Props = Record<string,never>
type State = {
counter: 0
}
class SampleComponent extends React.Component<Props,State>{
constructor(props: Props){
super(props)
this.state {
counter: 0,
}
}
render() {
return <>..</>
}
}
export default function App(){
return(
<>
{/* OK */}
<SampleComponent />
{/* Type 'string' is not assignable to type 'never' */}
</>
)
}
</script>
์ SampleComponent๋ ์ด๋ ํ props๋ ๋ฐ์ ์ ์๋ ๋์ ,state๊ฐ ์กด์ฌํ๋ค. React.Component์ ์ ๋ค๋ฆญ์ Props์ State๋ฅผ ์์๋๋ก ์์ฑํด์ผ ํ๋๋ฐ, Props์ ๊ฒฝ์ฐ Record<string,never>๋ก ์์ฑํด ์ด๋ ํ props๋ ๋ฐ์ ์ ์๋๋ก ํ์ ์คํฌ๋ฆฝํธ๋ก ์ฒ๋ฆฌ ํ ์ ์๋ค.
unknown ํ์
์ ์์ ์์ ์ดํด๋ดค๋ฏ์ด, ํ์
์ ์ฌ์ฉํ๋ ์ชฝ์์๋ ์ต๋ํ ํ์
์ ์ขํ๋ ๊ฒ์ด ์ข๋ค.์ด๋ฌํ ํ์
์ ์ขํ๋ ๋ฐ ๋์์ ์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก ํ์
๊ฐ๋๋ค. ์กฐ๊ฑด๋ฌธ๊ณผ ํจ๊ป ํ์
๊ฐ๋๋ฅผ ์ฌ์ฉํ๋ฉด ํ์
์ ํจ๊ณผ์ ์ผ๋ก ์ขํ ์ ์์ด ์กฐ๊ธ ๋ ๋ช
ํํ๊ฒ ๋ณ์๋ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ํ์
๊ฐ๋ ์ฐธ๊ณ
์ ๋ค๋ฆญ(generic)
์ ํจ์๋ ํด๋์ค ๋ด๋ถ์์ ๋จ์ผ ํ์
์ด ์๋ ๋ค์ํ ํ์
์ ๋์ํ ์ ์๋๋ก ๋์์ฃผ๋ ๋๊ตฌ๋ค. ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ฉด ํ์
๋ง ๋ค๋ฅธ ๋น์ทํ ์์
์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋จ์ผ ์ ๋ค๋ฆญ ์ปดํฌ๋ํธ๋ก ์ ์ธํด ๊ฐ๊ฒฐํ๊ฒ ์์ฑ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ํ๋์ ํ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ์ ๋ง์ง๋ง ์์๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๋ค์ํ ํ์ ์ ๋ํด ๋์ํด์ผ ํ๊ธฐ ๋๋ฌธ์ unknown์ด๋ any๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ฏผํด ๋ณผ ๊ฒ์ด๋ค.
<script>
function getFirstAndLast(list : unknown[]){
return [list[0],list[list.length -1]]
}
const [first, last] = getFirstAndLast([1,2,3,4,5])
first // unknown
last // unknown
</script>
๋ค์ํ ํ์
์ ๋ฐ์๋ค์ด๊ธฐ ์ํด top type์ธ unknown์ ์ผ์ง๋ง ์ ์ ๊ฒฐ๊ณผ๋ฌผ๋ unknown์ด ๋์์ ํ์
์ ์ขํ์ผ๋ง ํ๋ค. ์ฌ์ค ํน์ ํ์
์ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ํ์
๋ํ ๋ฐฐ์ด์ ์ ์ธ๋ผ ์์ผ๋ฏ๋ก ๋ฐํ ๊ฐ๋ ๊ฐ์ ํ์
์ผ๋ก ์ ์ธํด๋ ๋ฌด๋ฆฌ๋ ์์๊ฒ์ด๋ค. ์ด๋ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์ ๋ค๋ฆญ
์ด๋ค.
<script>
function getFirstAndLast(list : T[]): [T, T]{
return [list[0],list[list.length -1]]
}
const [first, last] = getFirstAndLast([1,2,3,4,5])
first // number
last // number
const [first, last] = getFirstAndLast(['a','b','c','d','e'])
first // string
last // string
</script>
T๋ผ๋ ์ ๋ค๋ฆญ์ ์ ์ธํ์ฌ ์ด๋ฅผ ๊ฐ๊ฐ ๋ฐฐ์ด์ ์์์ ๋ฐํ ๊ฐ์ ์์๋ก ์ฌ์ฉํ๋ค.
์ ๋ค๋ฆญ ๋๋ถ์ getFirstAndLast ํจ์๋ ๋ค์ํ ํ์
์ ์ฒ๋ฆฌํ ์ ์๋ ํจ์๊ฐ ๋์๋ค.
๋ฆฌ์กํธ์์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์๋ ์ฝ๋๋ฅผ ์๊ผฝ๋๋ค๋ฉด ๊ฐ์ฅ ๋จผ์ useState๋ฅผ ๋ ์ฌ๋ฆด ๊ฒ์ด๋ค.
<script>
function Component(){
// state: string
const [state,setState] = useState<string>('')
//...
}
</script>
useState์ ์ ๋ค๋ฆญ์ผ๋ก ํ์ ์ ์ ์ธํ๋ค๋ฉด state ์ฌ์ฉ๊ณผ ๊ธฐ๋ณธ๊ฐ ์ ์ธ์ ์ข ๋ ๋ช ํํ๊ฒ ํ ์ ์๋ค. ํํ useState()์ ๊ฐ์ ํ์์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ๋๊ธฐ์ง ์๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, ์ด ๊ฒฝ์ฐ์ ๊ฐ์ undefined๋ก ์ถ๋ก ํด ๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ ๋ค๋ฆญ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ ์ ์ธํด ์ค๋ค๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐฉ์งํด ์ค ์ ์๋ค.
์ ๋ค๋ฆญ์ ํ๋ ์ด์ ์ฌ์ฉํ ์๋ ์๋ค. ๋จ, ์ผ๋ฐ์ ์ผ๋ก ์ ๋ค๋ฆญ์ ์ํ๋ฒณ T, U๋ฑ์ผ๋ก ํํํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ค์์ธ๋ฐ, ์ด ๊ฒฝ์ฐ ์ ๋ค๋ฆญ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ๋ช ํํ ํ ์ ์์ผ๋ ์ ์ ํ ๋ค์ด๋ฐ ํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
<script>
function multipleGeneric<Frist, Last>(a1: First, a2: Last):[First, Last]{
return [a1, a2]
}
const [a, b] = multipleGeneric<string, boolean>('true',true)
a // string
b // boolean
</script>
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฒ์ ์ ํ์ ๋ ๊ฐ์ฅ ์ฒ์ ๋ถ๋ชํ๋ ๋๊ด์ด ๋ฐ๋ก ์ธ๋ฑ์ค ์๊ทธ๋์ฒ(index signature)๋ผ๊ณ ํ๋ค.์ธ๋ฑ์ค ์๊ทธ๋์ฒ๋ ๊ฐ์ฒด์ ํค๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ์๋ฏธํ๋ค.
ํ์ ์คํฌ๋ฆฝํธ ์ ํ ๊ฐ์ด๋
- tsconfig.json ์์ฑํ๊ธฐ
- JSDoc๊ณผ @ts-check๋ฅผ ํ์ฉํด ์ ์ง์ ์ผ๋ก ์ ํํ๊ธฐ
- ํ์ ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ํด @types ๋ชจ๋ ์ค์นํ๊ธฐ
- ํ์ผ ๋จ์๋ก ์กฐ๊ธ์ฉ ์ ํํ๊ธฐ
๐ญ "์ธ์ 1์ฅ์ ๋ค ์ฝ๊ณ ๋ธ๋ก๊น
ํ๋ ค๋" ๋ผ๋ ์๊ฐ์ ์๊ทธ์ ํ๊ฒ ๊ฐ์๋ฐ
์ด๋ ๊ฒ 1์ฅ ๋ง๋ฌด๋ฆฌ ๊ธ์ ์์ฑํ๋ค๋.. 2์ฅ์ผ๋ก ๋์ด๊ฐ ์๊ฐ์
๊ธํ ๋ง์์ผ๋ก ํ์
์คํฌ๋ฆฝํธ ์ฑํฐ๋ฅผ ์์ฑํ๊ฒ ๊ฐ์ ์ฐ์ฐํ์ง๋ง ,
์ด๋์ ๋ ํ์ตํ๋ฉด์ ๋ฆฌ๋ง์ธ๋ ๋๋ ๋ช๋ช ๋ด์ฉ๋ค์ด ์์ด์
๋๊ฒ ๋ง์กฑํ๋ฉฐ ๋ธ๋ก๊น
์ ํ ์ ์์๋๊ฒ ๊ฐ๋ค.
์์ ๋ ์ผ์ ๋ค๋ถํฐ ํด๊ฒฐํ๊ณ , 2์ฅ๋ถํฐ๋ ๋ค์์ฃผ ์์์ผ๋ถํฐ ์์ฑํด๋ณด์.
์ฑ
๋ด์ฉ ๊ธฐ๋ฐ์ผ๋ก ๊ธ์ ์์ฑํด์์ง๋ง ๊พธ์คํ ์์ฑํ ๋์๊ฒ ๋ฐ์๋ฅผ ๐๐ป..