[TIL 210823] ๐Ÿท๏ธTypescript Handbook์—์„œ ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์  1

Ko Seoyoungยท2021๋…„ 8์›” 23์ผ
0

โœ… Today I Learned

๋ชฉ๋ก ๋ณด๊ธฐ
5/16
post-thumbnail

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“œ๋ถ์—์„œ ์ƒˆ๋กœ ์•Œ๊ฒŒ๋œ ์  1

The Basics

  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์ ํƒ€์ดํ•‘(dynamic typing) ์–ธ์–ด์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์•„์•ผ๋งŒ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ •์ ํƒ€์ดํ•‘(static typing)์„ ํ•จ์œผ๋กœ์จ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „ ํƒ€์ž… ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

  2. tsc๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค

    tsc hello.ts : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์—๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , hello.tsํŒŒ์ผ์„ jsํŒŒ์ผ๋กœ ์ปดํŒŒ์ผํ•œ hello.js ํŒŒ์ผ์„ output์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

    tsc --noEmitOnError hello.ts : ์˜ค๋ฅ˜๊ฐ€ ๋ณด๊ณ ๋œ ๊ฒฝ์šฐ ์ถœ๋ ฅ์„ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์—๋Ÿฌ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ๋งŒ output์„ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.

    tsc --target es2015 hello.ts : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ES3๋ฌธ๋ฒ•์œผ๋กœ ์ปดํŒŒ์ผ์„ํ•˜๋Š”๋ฐ, --target ์˜ต์…˜์œผ๋กœ ECMAScript ๋ฒ„์ „์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ช…๋ฐฑํ•œ ํƒ€์ž…๋ช…์‹œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

    let msg = "hello there!"; : msg๊ฐ€ string์ž„์ด ๋ช…๋ฐฑํ•จ

  4. Type annotation์€ ์ ˆ๋Œ€ ํ”„๋กœ๊ทธ๋žจ ๋Ÿฐํƒ€์ž„ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋‹ˆ ์ฃผ์˜ (๋Ÿฐํƒ€์ž„์— ์ „ํ˜€ ๊ด€์—ฌ x)

  5. noImplicitAny : noImplicitAny์˜ต์…˜์€ any ํƒ€์ž…์œผ๋กœ ์•”์‹œํ•œ ํ‘œํ˜„์‹๊ณผ ์„ ์–ธ์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” any๋กœ ์ง€์ •๋œ ๋ณ€์ˆ˜์˜ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ any๋Š” ๊ฐ€์žฅ ๊ด€๋Œ€ํ•œ ํƒ€์ž…์ด๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ข…์ข… any ํƒ€์ž…์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๋ณธ ๋ชฉ์ ์„ ํ—›๋˜๊ฒŒ ํ•˜๋ฉฐ ๋ฒ„๊ทธ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ํ•œ ํ”ผํ•ด์•ผํ•  ํƒ€์ž…์ด๋‹ค. (๋Œ€์‹  unknown ์‚ฌ์šฉ)

  6. strictNullChecks : null๊ณผ undefined๋ฅผ ๋”์šฑ ๋ช…๋ฐฑํžˆ ๋‹ค๋ฃฌ๋‹ค. null๊ณผ undefined๊ฐ€ ๋ช…๋ฐฑํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฑท์žก์„ ์ˆ˜ ์—†๋Š” ๋ฒ„๊ทธ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ด ๋‘˜์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค!

Everyday Types

  1. optional ํƒ€์ž…(?) ์‚ฌ์šฉ์„ ํ•  ๋•, undefined ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ prop์œผ๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ ๋Œ€์‹  ํ•ด๋‹น ๊ฐ’์ด undefined์ด ๋˜๊ธฐ ๋•Œ๋ฌธ)

  2. Union Type์€ ๋‘๊ฐœ ์ด์ƒ์˜ ํƒ€์ž…์œผ๋กœ ํ˜•์„ฑ๋œ ํƒ€์ž…์ด๋‹ค. (ex) value: string | number)

  3. Type Alias๋ž€ ํƒ€์ž…์— ์ด๋ฆ„์„ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. (ํƒ€์ž…์„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…)

    (ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋งจ๋‚  ์“ฐ๋Š” ํ˜•ํƒœ์ธ๋ฐ, ์ด๋ฆ„์„ ์ œ๋Œ€๋กœ ๋ชฐ๋ž๋‹ค ๐Ÿ˜‚)

  4. Interface ์„ ์–ธ์€ object ํƒ€์ž…์— ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

    // Type Alias
    type Point = {
      x: number;
      y: number;
    };
    
    // Interface
    interface Point {
      x: number;
      y: number;
    }
  5. Type Aliases๊ณผ Interfaces์˜ ์ฐจ์ด์ ?

    • interface๋Š” extends๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒ€์ž…์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

    • interface๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์กด์žฌํ•˜๋Š” interface์— ์ƒˆ๋กœ์šด ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

      ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ์ธ ์ทจํ–ฅ์— ๋”ฐ๋ผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

  6. Type Assertions์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํƒ€์ž…์„ ๊ตฌ์ฒด์ ์œผ๋กœ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ• ๋•Œ ์ด๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ช…์‹œํ•ด ์ค„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ ๋•Œ ์ง€์›Œ์ง€๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์—์„œ๋Š” ์ „ํ˜€ ํšจ์šฉ์ด ์—†๋‹ค!)

  7. Literal Type์€ string์˜ ๋ฌธ์žฅ๊ทธ๋Œ€๋กœ๋ฅผ, number์˜ ํŠน์ • ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ํƒ€์ž…์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

    (ex) align: "left" | "right" | "center", returnType: -1 | 0 | 1)

    (+ boolean์€ ์›๋ž˜ true | false union ํƒ€์ž…์œผ๋กœ ๋˜์–ด์žˆ์Œ)

  8. as const ๋Š” const์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ํƒ€์ž…์‹œ์Šคํ…œ์—์„œ object์˜ ๋ชจ๋“  ์†์„ฑ์ด ์ผ๋ฐ˜์ ์ธ string ๋˜๋Š” number ํƒ€์ž… ๋Œ€์‹  literal ํƒ€์ž…์ด๋ผ๋Š”๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค.

const req = { url: "https://example.com", method: "GET" } as const;
  1. null / undefined
    • strictNullChecks off: null๊ณผ undefined๋Š” ์–ด๋–ค ํƒ€์ž…์—๋“  ํ• ๋‹น๊ฐ€๋Šฅ
    • strictNullChecks on: nul์ด ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋ผ๋ฉด ์‚ฌ์šฉํ•˜๊ธฐ ์ „ null์ธ์ง€ ์ฒดํฌํ•ด์•ผํ•จ
    • Non-null Assertion Operator(!) : null ๋˜๋Š” undefined๊ฐ€ ์•„๋‹˜์ด ํ™•์‹คํ•  ๋•Œ x!.toString() ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํƒ€์ž…์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. โ†’ ํ•˜์ง€๋งŒ ๋Ÿฐํƒ€์ž„๊ณผ๋Š” ๊ด€๋ จ ์—†์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผํ•จ
  2. bigint : const oneHundred: bigint = BigInt(100) ๋˜๋Š” 100n;
  3. Symbol() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ „์—ญ์ ์œผ๋กœ ๊ณ ์œ ํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
const firstName = Symbol("name");
const secondName = Symbol("name");
 
if (firstName === secondName) {
 // firstName ๊ณผ secondName์€ ๊ณ ์œ ํ•œ ํƒ€์ž…์„ ๊ฐ–๋Š”๋‹ค.
 // Can't ever happen
}
profile
Web Frontend Developer ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป #React #Nextjs #ApolloClient

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