๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/TypeScript

[ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScript) ] ๋น„๊ตฌ์กฐํ• ๋‹น๋ฌธ๋ฒ•์— type ์„ ์–ธํ•˜๊ธฐ

by YWTechIT 2022. 6. 21.
728x90

๐Ÿ“ ๋น„๊ตฌ์กฐ ํ• ๋‹น ๋ฌธ๋ฒ•์— type ์„ ์–ธํ•˜๊ธฐ

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด๋กœ ๋œ ๋ณ€์ˆ˜์— ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๋ฌธ๋ฒ•(destructuring assignment)์„ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ ์ž์ฃผ ์žˆ๋‹ค. typescript๋กœ ๋น„๊ตฌ์กฐํ™”ํ• ๋‹น ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜๋กœ ๊บผ๋‚ธ ๊ฐ’์— ํƒ€์ž…์„ ์ •ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งˆ์ฃผํ•˜๋Š”๋ฐ objectํ˜•์€ ๊ฐ€๋” ํƒ€์ž…์„ ์–ด๋–ป๊ฒŒ ์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ฆฌ๊ณค ํ•œ๋‹ค. ์ด๋ฒˆ ๊ธ€์€ ๊ฑฐ์ฐฝํ•œ ๊ธ€๋ณด๋‹จ ๋ฏธ์„ธ๋จผ์ง€์ฒ˜๋Ÿผ ์ž‘์€ ํŒ์ด์ง€๋งŒ ์ข…์ข… ํ—ท๊ฐˆ๋ฆด ๋•Œ ๋„์›€์ด ๋˜๋ฏ€๋กœ ๊ฐ€๋ฒผ์šด ๋งˆ์Œ์œผ๋กœ ์ฝ์–ด๋ณด์ž.

 

ํ•˜๋‹จ ์ฝ”๋“œ๋ธ”๋ก์— ๋‚˜์™€์žˆ๋“ฏ์ด user๋ฅผ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น ์ดํ›„ ํƒ€์ž…์„ ์ž˜๋ชป ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ๋Š” AS-IS์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ € ๋ฌธ๋ฒ•์€ ํƒ€์ž…์„ ์ •ํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด์˜ ์›๋ž˜ ์†์„ฑ๋ช…์„ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ํ• ๋‹นํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ์—ฌ๊ธฐ์„  string์œผ๋กœ ๋ฐ”๊พผ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๋ณธ๋ž˜ ์˜๋„๋ผ๋ฉด TO-BE์ฒ˜๋Ÿผ ์„ ์–ธํ•ด์•ผ firstname๊ณผ lastname์— ํƒ€์ž…์„ ์–ธ์ด ๋œ๋‹ค.

const user = { firstname: 'ted', lastname: 'an' }
const { firstname, lastname } = user;

// AS-IS
const { firstname: string, lastname: string } = user;

// TO-BE
const { firstname, lastname }: { firstname: string; lastname: string } = user;

์ƒ๋‹จ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๊ตณ์ด type casting๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ž˜ ์ฝ์–ด๋‚ด๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ๋ณดํ†ต api ํ˜ธ์ถœ ์ดํ›„ res๊ฐ’์„ ๋ฐ›์„ ๋•Œ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž…์„ ์ฝ์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿด ๋• type assertion์„ ์ข…์ข… ์ด์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‹จ ์ฝ”๋“œ ๋ธ”๋ก 9๋ฒˆ ๋ผ์ธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ req.query์˜ type์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์—๋Ÿฌ๋ฅผ ๋ฟœ๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ์ด๋Ÿด ๋•, ์‘๋‹ตํ•˜๋Š” ๊ฐ’์ด ๊ฐ•ํ•˜๊ฒŒ(key๊ฐ’ + value ํƒ€์ž…์„ ์•„๋Š” ๊ฒฝ์šฐ)์ •ํ•ด์ ธ์žˆ๋Š”์ง€, ์•ฝํ•˜๊ฒŒ(key์™€ value์˜ ํƒ€์ž…๋งŒ ์•„๋Š”๊ฒฝ์šฐ) ์ •ํ•ด์ ธ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณธ๋‹ค.

728x90

์ด๋ฒˆ ๊ฒฝ์šฐ๋Š” query ๋‚ด๋ถ€์˜ property์˜ key๊ฐ€ returnUrl์œผ๋กœ ์ •ํ•ด์ ธ์žˆ๊ณ , value๊ฐ€ stringํ˜•์œผ๋กœ ๊ณ ์ •๋˜์–ด์žˆ๋‹ค๋Š” ์ ์„ ์•Œ๊ณ  ์žˆ์–ด, TO-BE 2์ฒ˜๋Ÿผ type assertion์„ ์„ ์–ธํ–ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ์˜๋„๋Œ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํƒ€์ž…์„ ์ฝ์—ˆ๋‹ค. ๋งŒ์•ฝ, ๋Š์Šจํ•˜๊ฒŒ ํƒ€์ž…๋งŒ ์•„๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด TO-BE 1, TO-BE 1-1์ฒ˜๋Ÿผ ์ž‘์„ฑ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์•Œ์•„๋‘์ž.

const res = {
  query: {
    returnUrl: '/auth-web/my-accounts',
  },
  ...
}

// AS-IS
// ts2741: Property 'returnUrl' is missing in type '{ [key: string]: string | string[]; }' but required in type '{ returnUrl: string; }'.
const { returnUrl }: { returnUrl: string } = req.query

// TO-BE 1
const { returnUrl }: { [key: string]: string | string[] } = req.query

// TO-BE 1-1
type ReqQueryType = {
  [key in string]: string | string[]
}
const { returnUrl }: ReqQueryType = req.query

// TO-BE 2
const { returnUrl } = req.query as { returnUrl: string }

 

Reference

  - MDN-Destructuring_assignment

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€