Skip to content

Latest commit

ย 

History

History
336 lines (247 loc) ยท 6.42 KB

File metadata and controls

336 lines (247 loc) ยท 6.42 KB

TypeScript

$ mkdir ts-practice
$ cd ts-practice
npm install -g typescript
tsc --init
npm install --save typescript

TypeScript๋ž€?

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ๋œ ์–ธ์–ด๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— "ํƒ€์ž…"์„ ๋ถ€์—ฌํ•œ ์–ธ์–ด๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋‹ฌ๋ฆฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํŒŒ์ผ์„ ํ•œ๋ฒˆ ๋ณ€ํ™˜ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. (=์ปดํŒŒ์ผ)

TypeScript Handbook ํ•œ๊ธ€ ๋ฌธ์„œ

์™œ TypeScript?

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋Š” ํŠน์ • ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜์˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์ „์— ์ง€์ •ํ•œ ํƒ€์ž…์ด ์•„๋‹Œ ๊ฐ’์ด ์„ค์ •๋  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์—๋Ÿฌ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

TypeScript ๊ธฐ๋ณธ ํƒ€์ž…

Boolean, Number, String, Object, Array, Tuple, Enum, Any, Void, Null, Undefined, Never

Boolean

์ฐธ๊ณผ ๊ฑฐ์ง“

let isLoggedIn: boolean = false;

Number

let num: number = 10;

String

let str: string = "hi";

Array

let arr: number[] = [1, 2, 3];
let arr: Array<number> = [1, 2, 3];

Tuple

๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋˜๊ณ  ๊ฐ๊ฐ์˜ ์š”์†Œ๊ฐ€ ํƒ€์ž…์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๋ฐฐ์—ด

let arr: [string, number] = ["hi", 10];

Enum

ํŠน์ • ๊ฐ’(์ƒ์ˆ˜)๋“ค์˜ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.

enum Avengers {
  IronMan,
  Thor,
}
let hero: Avengers = Avengers.Capt;

Any

๋ชจ๋“  ํƒ€์ž…์— ๋Œ€ํ•ด ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.

let str: any = "hi";
const product : any = {
  id: "1",
  name: "์Šฌํฌ",
  price: 129000,
  sizes: ["M", "L"]
};

const parsedProduct: {
  name: string;
  price: number;
} = JSON.parse(
  "{"name": "์Šฌํฌ", "price"; 12000}"
)

Void

๋ณ€์ˆ˜์—๋Š” undefined์™€ null๋งŒ ํ• ๋‹นํ•˜๊ณ  ํ•จ์ˆ˜์—๋Š” ๋ฐ˜ํ™˜ ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์ด๋‹ค.

let unuseful: void = undefined;
function notuse(): void {
  console.log("sth");
}

Never

ํ•จ์ˆ˜์˜ ๋์— ์ ˆ๋Œ€ ๋„๋‹ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ์ง€๋‹Œ ํƒ€์ž…์ด๋‹ค.

function neverEnd(): never {
  while (true) {}
}

ํ•จ์ˆ˜์—์„œ ํƒ€์ž… ์ •์˜

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐฐ์—ด์˜ ๋‚ด์žฅํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋„ ํƒ€์ž… ์œ ์ถ”๊ฐ€ ์‰ฝ๋‹ค. ํ•จ์ˆ˜์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋ฉด ๋ฐ˜ํ™˜ ํƒ€์ž…์„ void๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

Interface

interface๋Š” ํด๋ž˜์Šค ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

ํŠน์ • ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•จ์„ ๋ช…์‹œํ•  ๋•Œ interface๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. implements๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ํŠน์ • interface์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ตฌํ˜„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•œ๋‹ค.

์ผ๋ฐ˜ ๊ฐ์ฒด๋ฅผ interface๋กœ ํƒ€์ž… ์„ค์ •ํ•˜๊ธฐ

interface Person {
  name: string;
  age?: number;
}
interface Developer {
  name: string;
  age?: number;
  skills: string[];
}

Person๊ณผ Developer์˜ ํ˜•ํƒœ๊ฐ€ ์œ ์‚ฌํ•œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

interface Person {
  name: string;
  age?: number;
}
interface Developer extends Person {
  skills: string[];
}

์ด์™€ ๊ฐ™์ด extendsํ•ด ์ƒ์† ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

๋ฌผ์Œํ‘œ๋Š” ์„ค์ •์„ ํ•ด๋„ ๋˜๊ณ  ์•ˆํ•ด๋„ ๋˜๋Š” ๊ฐ’์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

React.FC

Donโ€™t use FunctionComponent

/FC

type GreetingsProps = {
  name: string;
  children: React.ReactNode;
};

React.FC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ props ํƒ€์ž…์„ Generics๋กœ ๋„ฃ์–ด ์‚ฌ์šฉํ•œ๋‹ค. props์— ๊ธฐ๋ณธ์ ์œผ๋กœ children์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š”๋ฐ children์ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์—†์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ Props ํƒ€์ž… ์•ˆ์— children์„ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค.

const Greetings: React.FC<GreetingsProps> = ({ name, mark }) => (
  <div>
    Hello, {name} {mark}
  </div>
);

Greetings.defaultProps = {
  mark: "!",
};

mark๋ฅผ defaultProps๋กœ ๋„ฃ์—ˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.

const Greetings = ({ name, mark }: GreetingsProps) => (
  <div>
    Hello, {name} {mark}
  </div>
);

React.FC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ž˜ ์ž‘๋™ํ•œ๋‹ค.

์ด์™€ ๊ฐ™์€ ์ด์œ ๋กœ ํ˜„์žฌ๋Š” React.FC๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ์— ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ๋Š” props ์„ค์ •ํ•˜๊ธฐ

component์˜ props ์ค‘ ์ƒ๋žตํ•ด๋„ ๋˜๋Š” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๋ฌผ์Œํ‘œ(?)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

type GreetingsProps = {
  name: string;
  mark: string;
  optional?: string;
};

์ปดํฌ๋„ŒํŠธ์—์„œ ํ•จ์ˆ˜ ํƒ€์ž…์˜ props ๋ฐ›์•„์˜ค๊ธฐ

Greetings.tsx

type GreetingsProps = {
  name: string;
  mark: string;
  optional?: string;
  onClick: (name: string) => void; // ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜
};

function Greetings({ name, mark, optional, onClick }: GreetingsProps) {
  const handleClick = () => onClick(name);
  return (
    <div>
      Hello, {name} {mark}
      {optional && <p>{optional}</p>}
      <div>
        <button onClick={handleClick}>Click Me</button>
      </div>
    </div>
  );
}

App.tsx

const App: React.FC = () => {
  const onClick = (name: string) => {
    console.log(`${name} says hello`);
  };
  return <Greetings name="Hello" onClick={onClick} />;
};

Generics

์ œ๋„ˆ๋ฆญ์€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜, ํด๋ž˜์Šค, interface, type์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๋•Œ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํƒ€์ž…์— ๋Œ€ํ•˜์—ฌ ํ˜ธํ™˜์„ ๋งž์ถฐ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค.

function merge<A, B>(a: A, b: B): A & B {
  return {
    ...a,
    ...b,
  };
}

const merged = merge({ foo: 1 }, { bar: 1 });

<ํƒ€์ž… ์ด๋ฆ„>์„ ๋„ฃ์–ด ์‚ฌ์šฉํ•˜๋ฉด ์ œ๋„ˆ๋ฆญ์— ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž…์—๋Š” ๋ญ๋“ ์ง€ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์šฉํ•  ๋•Œ ํƒ€์ž…์ด ๊นจ์ง€์ง€ ์•Š๋Š”๋‹ค.

Typescript์—์„œ useState

useState๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ํƒ€์ž…์„ ์œ ์ถ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ƒํƒœ๊ฐ€ null์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์„ ๋•Œ ์ œ๋„ˆ๋ฆญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

type Information = { name: string; description: string };
const [info, setInformation] = useState<Information | null>(null);

enum

enum Job {
  Knight = "Knight",
  Archer = "Archer",
  Mage = "Mage",
  Priest = "Priest",
  Thief = "Thief",
}

enum Size {
  S = "S",
  M = "M",
  L = "L",
  XL = "XL",
}

let product: {
  sizes: Size[];
} = {
  sizes: [Size.M, Size.S],
};

ํƒ€์ž… ๋ณ„์นญ

type Cart = string[];

const cart : Cart = {
  "์Šฌํฌ",
  "์Šฌ",
};

interface User {
  cart: Cart;
}

interface๋ฅผ ๊ถŒ์žฅ

Union ํƒ€์ž…

~ ์ด๊ฑฐ๋‚˜ (|)

if๋ฌธ, in ์—ฐ์‚ฐ์ž ํ™œ์šฉ ๊ฐ€๋Šฅ