๐Ÿ‘ŠTYPESCRIPT

๋ธ”๋ ˆ์–ด(blair)ยท2020๋…„ 8์›” 11์ผ
1

TypeScript

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

๐Ÿค–TYPESCRIPT ?

  • TypeScript JavaScript์˜ superset์ด๋‹ค.
    * ์ฆ‰ JavaScript๋ผ๋Š” ์–ธ์–ด ์œ„์—์„œ ๋™์ž‘ํ•˜๋Š” ์–ธ์–ด๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.
    • JavaScript + @(=type์ง€์ •)
    • JavaScript ํƒ€์ž…์ด ๋Š์Šจํ•œ ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— TypeScript๋ฅผ ์‚ฌ์šฉํ•ด
      ๋ช…ํ™•ํ•œ ํƒ€์ž…์„ ์ง€์ •ํ•ด์คŒ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•˜๋Š” ์‹ค์ˆ˜๋“ค์„ ์ค„์—ฌ์ฃผ๊ณ  ์ข€ ๋” ์ข‹์€ ์ฝ”๋“œ๋ฅผ ์งค ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

๐ŸฝBasic Type

Boolean

Number

String

// Boolean
let isDone: boolean = false;

// Number
let decimal: number = 6;

// String
let fullName: string = `Bob Bobbington`;

Array

  • ๊ฐ ํƒ€์ž…์— []๋ฅผ ๋ถ™์—ฌ ํ•ด๋‹น ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ๋‚˜ํƒ€๋‚ด๊ธฐ
  • ์ผ๋ฐ˜์ ์ธ ๋ฐฐ์—ด ํƒ€์ž… Array์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ๋‹ˆ์–ธ ํƒ€์ž…(๋‹ค์ค‘ ํƒ€์ž…)์˜ โ€˜๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž๋ฅผ ๋™์‹œ์— ๊ฐ€์ง€๋Š” ๋ฐฐ์—ดโ€™๋„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐฐ์—ด์ด ๊ฐ€์ง€๋Š” ํ•ญ๋ชฉ์˜ ๊ฐ’์„ ๋‹จ์–ธํ•  ์ˆ˜ ์—†๋‹ค๋ฉด any๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// Array
// 1. 	
let list: number[] = [1, 2, 3];
// 2. 
let list: Array<number> = [1, 2, 3];
// 3.
let array: (string | number)[] = ['Apple', 1, 2, 'Banana', 'Mango', 3];
// Or
let array: Array<string | number> = ['Apple', 1, 2, 'Banana', 'Mango', 3];
//4.
let someArr: any[] = [0, 1, {}, [], 'str', false];

Tuple

  • ํŠœํ”Œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ณ ์ •๋œ ์ˆ˜์˜ ์š”์†Œ ํƒ€์ž…์€ ์•Œ๊ณ  ์žˆ์ง€๋งŒ, ๊ฐ’์˜ ์ข…๋ฅ˜๊ฐ€ ๋‹ค๋ฅธ ๋ฐฐ์—ด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฌธ์ž์—ด๊ณผ ์ˆซ์ž์˜ ์Œ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
// Tuple
let x: [string, number];
// Initialize it
x = ["hello", 10]; // OK
// Initialize it incorrectly
x = [10, "hello"]; // Error

Enum

  • enum์€ ์ˆซ์ž๊ฐ’ ๋ฐ์ดํ„ฐ ์…‹์— ์‚ฌ๋žŒ์ด ๋” ์นœ์ˆ™ํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๊ธฐ๋ณธ์ ์œผ๋กœ enum์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 1์”ฉ ์ฆ๊ฐ€ ๋ฉค๋ฒ„์˜ ๋ฒˆํ˜ธ ๋งค๊ธฐ๊ธฐ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. ๋ฉค๋ฒ„ ์ค‘ ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด์ „ ์˜ˆ์ œ๋ฅผ 0 ๋Œ€์‹  1๋กœ ์‹œ์ž‘๊ฐ€๋Šฅ.
  • ๋˜๋Š” enum์˜ ๋ชจ๋“  ๊ฐ’์„ ์ˆ˜๋™์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • enum์˜ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์€ ์ˆซ์ž ๊ฐ’์—์„œ enum์˜ ๊ฐ’ ์ด๋ฆ„์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ’์ด 2์ด์ง€๋งŒ ์œ„์˜ ์ƒ‰์ƒ enum์— ๋งคํ•‘๋œ ๊ฒƒ์ด ํ™•์‹คํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•ด๋‹น ์ด๋ฆ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
// Enum
enum Color {Red, Green, Blue}
let c: Color = Color.Green;

enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;

enum Color {Red = 1, Green = 2, Blue = 4}
let c: Color = Color.Green;

enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
alert(colorName);

Any(๋ชจ๋“ ํƒ€์ž…)

  • ๊ฐ’์„ ์ž์‹  ๋˜๋Š” ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋™์  ์ฝ˜ํ…์ธ ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์•Œ์ง€ ๋ชปํ•˜๋Š” ๋ณ€์ˆ˜ ์œ ํ˜•์„ ์„ค๋ช…ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ปดํŒŒ์ผ์‹œ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜์ง€ ์•Š๊ณ  ์ง€๋‚˜๊ฐ€๋„๋ก ํ•ด์•ผ ํ• ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ. ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์„ ์œ„ํ•ด any ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.
// Any
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean

Void

  • void๋Š” ํƒ€์ž…์ด ์ „ํ˜€ ์—†๋‹ค๋Š” ๊ฒƒ์—์„œ any์˜ ๋ฐ˜๋Œ€ ์˜๋ฏธ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ์œ ํ˜•์œผ๋กœ ์ด ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ void ํƒ€์ž…์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์€ undefined ๋˜๋Š”null ๋งŒ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค.
// Void
function warnUser(): void {
    alert("This is my warning message");
}
let unusable: void = undefined;

Null ๊ณผ Undefined

  • TypeScript์—์„œ undefined์™€ null์€ ์‹ค์ œ๋กœ ๊ฐ๊ฐ undefined์™€ null์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. void์™€ ๋งค์šฐ ๋น„์Šทํ•˜๊ฒŒ, ์ด ํƒ€์ž…๋“ค์€ ๊ทธ ์ž์ฒด๋กœ ๋งค์šฐ ์œ ์šฉํ•˜์ง€๋Š” ์•Š๋‹ค.
// Null ๊ณผ Undefined
let u: undefined = undefined;
let n: null = null;

๊ฐ์ฒด: Object

  • ๊ธฐ๋ณธ์ ์œผ๋กœ typeof ์—ฐ์‚ฐ์ž๊ฐ€ "object"๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์—ฌ๋Ÿฌ ํƒ€์ž…์˜ ์ƒ์œ„ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค.
    ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ํƒ€์ž… ์ง€์ •์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ์ฒด ์†์„ฑ(Properties)๋“ค์— ๋Œ€ํ•œ ํƒ€์ž…์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
// Object
let obj: object = {};
let arr: object = [];
let func: object = function () {};
let nullValue: object = null;
let date: object = new Date();

let userA: { name: string, age: number } = {
  name: 'HEROPY',
  age: 123
};
let userB: { name: string, age: number } = {
  name: 'HEROPY',
  age: false, // Error
  email: 'thesecon@gmail.com' // Error
};
  • ๋ฐ˜๋ณต์ ์ธ ์‚ฌ์šฉ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ, interface๋‚˜ type์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.
interface IUser {
  name: string,
  age: number
}

let userA: IUser = {
  name: 'HEROPY',
  age: 123
};

let userB: IUser = {
  name: 'HEROPY',
  age: false, // Error
  email: 'thesecon@gmail.com' // Error
};

interface

  • ์ธํ„ฐํŽ˜์ด์Šค(Interface)๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ์ผ์ข…์˜ ๊ทœ์น™์ด๋ฉฐ ๊ตฌ์กฐ์ด๋‹ค.
    ๋‹ค์Œ๊ณผ ๊ฐ™์ด interface ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†์„ฑ์— ?๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํƒ์  ์†์„ฑ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
// interface
// โ€˜IUserโ€™์—์„œ โ€˜Iโ€™๋Š” Interface๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ณ„์นญ์œผ๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
interface IUser {
  name: string,
  age: number,
  isAdult?: boolean
}

let user1: IUser = {
  name: 'Neo',
  age: 123,
  isAdult: true
};

// Error - TS2741: Property 'isAdult' is missing in type '{ name: string; age: number; }' but required in type 'IUser'.
let user2: IUser = {
  name: 'Evan',
  age: 456
};

Never

  • Never์€ ์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์–ด๋– ํ•œ ํƒ€์ž…๋„ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋นˆ ๋ฐฐ์—ด์„ ํƒ€์ž…์œผ๋กœ ์ž˜๋ชป ์„ ์–ธํ•œ ๊ฒฝ์šฐ, Never๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
function error(message: string): never {
  throw new Error(message);
}

const never: [] = [];
never.push(3);

์œ ๋‹ˆ์–ธ(Union)

  • 2๊ฐœ ์ด์ƒ์˜ ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ ์œ ๋‹ˆ์–ธ(Union)์ด๋ผ๊ณ  ํ•œ๋‹ค.
    |(vertical bar)๋ฅผ ํ†ตํ•ด ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•˜๋ฉฐ, ()๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค.
let union: (string | number);
union = 'Hello type!';
union = 123;
union = false;

๐ŸทReact ๐ŸคŸ๐Ÿป TypeScript

ํ…Œ์ŠคํŠธ (ํ™˜๊ฒฝ) ์…‹ํŒ…

  • npx create-react-app typescript-react-demo --typescript ๋กœ ์„ค์น˜ํ•˜๋ฉด ํŽธ๋ฆฌํ•˜๊ฒŒ React ๐ŸคŸ๐Ÿป TypeScript ํ•จ๊ป˜ ์‚ฌ์šฉ๊ฐ€
    * npx : create-react-app์„ ์‹คํ–‰์‹œํ‚ค๋Š” command.
    • jsx๋Œ€์‹  tsx๋กœ ์…‹ํŒ…๋˜์–ด์žˆ๊ณ  tsconfig.json์ด ์ƒ์„ฑ๋œ ๊ตฌ์กฐ์˜ ํด๋”๊ฐ€ ์…‹ํŒ…๋œ๋‹ค.

tsconfig rules

  • tsconfig์—๋Š” ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์ด ์žˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ทœ์น™๋“ค์€ typescript๊ฐ€ ์–ผ๋งˆ๋‚˜ strictํ• ์ง€ ์…‹ํŒ…ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ๋“ค์–ด allowSyntheticDefaultImports : false
      • syntetic import๋ฅผ ํ—ˆ์šฉํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.
    • noImplicitAny : false
      • any type์˜ ํ‘œํ˜„์‹๊ณผ ์„ ์–ธ๋ฌธ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ์ค€๋‹ค.
      • ์ฆ‰ ํƒ€์ž…์„ ์“ฐ์ง€ ์•Š์•„๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ์ด rule์„ false๋กœ ์ฃผ์ง€ ์•Š๊ณ  ํƒ€์ž…์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ณ  ๋ฉˆ์ถ”๊ฒŒ ๋œ๋‹ค.

definitely typed ์‚ฌ์šฉ

definitely typed ํ™œ์šฉํ•ด์„œ Styled-Components์‚ฌ์šฉํ•˜๊ธฐ

  • Styled-Components์— ๋Œ€ํ•ด์„œ typescript๋Š” styled๊ฐ€ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— definitely typed์— ์žˆ๋Š” Styled-Components type์„ installํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
    • npm install @types/styled-components (=์ด์ œ typeScript๋Š” styled-components์˜ ๋ชจ๋“  ํƒ€์ž…์„ ์•Œ๊ณ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋จ)
    • definitely typed (github repo)๋Š” npm js์— ์†ํ•œ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ์ด๋‹ค.
    • ์—ฌ๊ธฐ์—๋Š” ์ˆ˜๋งŽ์€ type๊ณผ interface๋“ค์ด ์žˆ๋‹ค.
    • https://github.com/DefinitelyTyped/DefinitelyTyped

์ฆ‰ typescript + react์‚ฌ์šฉํ•˜๋ฉฐ ์œ ๋ช…ํ•œ library๋ฅผ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๋ฉด @types/[library]๋ฅผ ์„ค์น˜ typescript๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํƒ€์ž…์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉํ•˜๋ ค๋Š” library๊ฐ€ @types๊ฐ€ ์—†๋‹ค๋ฉด?

  • tsconfig.json์—์„œ "noImplicitAny": false ๋ฅผ ์„ค์ •ํ•ด์ฃผ์ž.
    • type์„ ๋ชป์ฐพ์•˜๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ณดํ†ต ์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ @types๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†๋‹ค.

์ฐธ๊ณ 

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ๋ธ”๋ ˆ์–ด์˜ ๊ฐœ์ธ ๋ธ”๋กœ๊ทธ ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉฐ ๋‚˜๋ˆ„๊ณ  ์„ฑ์žฅํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค :)

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