๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป๋ชจ๋˜ ๋ฆฌ์•กํŠธ Deep Dive

pjw__98ยท2024๋…„ 1์›” 4์ผ
1
post-thumbnail

๐Ÿ“š์ฑ•ํ„ฐ

๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ํ™œ์šฉ๋ฒ•

๐Ÿ“†ํ•™์Šต ๋‚ ์งœ

2024 / 01 / 04 (๋ชฉ)


๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ปํ•™์Šต ๋‚ด์šฉ

๐ŸŽฏ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ํ™œ์šฉ ํŒ

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•  ๋•Œ ํƒ€์ž…์„ ์—„๊ฒฉํ•˜๊ฒŒ,๊ทธ๋ฆฌ๊ณ  ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•œ๋‹ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ค์› ๋˜ ๋ฒ„๊ทธ๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜๋„ ์žˆ๊ณ ,์ฝ”๋“œ์˜ ํ’ˆ์งˆ๋„ ํ•œ์ธต ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๐Ÿ“Œ any ๋Œ€์‹  unknown

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฒ˜์Œ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ˆ˜ ์ค‘ ํ•˜๋‚˜๋Š” 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)

์ œ๋„ค๋ฆญ(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์žฅ๋ถ€ํ„ฐ๋Š” ๋‹ค์Œ์ฃผ ์›”์š”์ผ๋ถ€ํ„ฐ ์ž‘์„ฑํ•ด๋ณด์ž.
์ฑ… ๋‚ด์šฉ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•ด์™”์ง€๋งŒ ๊พธ์ค€ํžˆ ์ž‘์„ฑํ•œ ๋‚˜์—๊ฒŒ ๋ฐ•์ˆ˜๋ฅผ ๐Ÿ‘๐Ÿป..
profile
โ˜„๏ธ

0๊ฐœ์˜ ๋Œ“๊ธ€