πŸ§—
JIN-DevNote
  • ν”„λ‘ νŠΈμ—”λ“œ μƒμ‘΄μ½”μŠ€ 3κΈ°
  • 0μ£Όμ°¨
    • 1.μ™€μΉ΄νƒ€μž„ μ„€μΉ˜
    • 2.git-training
  • 1μ£Όμ°¨
    • 1.κ°œλ°œν™˜κ²½
    • 2.Typescript
    • 3.React
    • 4.Testing Library
    • 5.Parcel & ESLint
  • 2μ£Όμ°¨
    • 1.JSX
  • 3μ£Όμ°¨
    • 1.React Component
    • 2.React State
  • 4μ£Όμ°¨
    • 1.Express
    • 2.Fetch API & Cors
    • 3.React의 hook
    • 4.useRef & Custom hook
    • 5.usehooks-ts
  • 5μ£Όμ°¨
    • 1.Tdd
    • 2.React Testing library
    • 3.MSW
    • 4.Playwright
  • 6μ£Όμ°¨
    • 1.External Store
    • 2.Tsyringe
    • 3.Redux λ”°λΌν•˜κΈ°
    • 4.usestore-ts
  • 7μ£Όμ°¨
    • 1.Routing
    • 2.Routes
    • 3.Router
    • 4.Navigation
  • 8μ£Όμ°¨
    • 1.Design System
    • 2.Style Basics
    • 3.CSS in JS
    • 4.styled-components
    • 5.props와 attrs
    • 6.Global Style & Theme
Powered by GitBook
On this page
  • REPL(Read-Eval-Print-Loop)
  • Interface vs Type
  • Interface
  • Type
  • νƒ€μž… μΆ”λ‘ κ³Ό νƒ€μž… 단언
  • νƒ€μž… μΆ”λ‘ 
  • νƒ€μž… 단언
  • Union Type vs Intersection Type
  • Union Type
  • Intersection Type
  • Optional Parameter
  • References
  1. 1μ£Όμ°¨

2.Typescript

REPL(Read-Eval-Print-Loop)

ν„°λ―Έλ„μ—μ„œ κ°„λ‹¨ν•˜κ²Œ REPL을 μ“°κ³  μ‹ΆμœΌλ©΄ ts-nodeλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

npx ts-node

Interface vs Type

Interface와 Type Alias λ‹€μ†Œ λΉ„μŠ·ν•΄λ³΄μ΄λŠ” 것은 μ‚¬μ‹€μ΄λ‚˜ μ‚¬μš©μž μ •μ˜ νƒ€μž…μ΄ ν•  수 μ—†λŠ” 것을 μΈν„°νŽ˜μ΄μŠ€λŠ” ν•  수 μžˆλ‹€. ν•  수 μžˆλŠ” 것 쀑 ν•˜λ‚˜λŠ” μΈν„°νŽ˜μ΄μŠ€λŠ” 선언을 병합할 수 μžˆλ‹€λŠ” 점이닀.

μ•„λž˜μ˜ νƒ€μž…λ“€μ€ λ‚΄κ°€ ν˜„μž¬ μ‹€λ¬΄μ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” ν”„λ‘œλͺ¨μ…˜ νƒ€μž…λ“€ 쀑 일뢀뢄을 κ°€μ Έμ™”λ‹€.

Interface

μΈν„°νŽ˜μ΄μŠ€λŠ” λͺ…μ‹œμ μœΌλ‘œ ν™•μž₯을 μ‚¬μš©ν•΄μ„œ μ •μ˜λ₯Ό 해쀄 μˆ˜λ„ μžˆλ‹€.

export interface PromotionCoupon {
  promoId: string,
  name: string,
  issuanceType: PromotionIssuance,
  createdAt: string,
  expiryAt: string,
  code: string,
  discountType: PromotionDiscount,
  discountRate: number,
}

export interface PromotionCouponList extends PromotionCoupon {
  targetCount: number,
  issuanceCount: number,
}

또 Type Aliasμ—μ„œ ν•˜μ§€ λͺ»ν•˜λŠ” μ„ μ–Έ 병합을 ν•  수 μžˆλ‹€.

interface ButtonInterface {
  onInit():void;
  onClick():void;
}

...

interface ButtonInterface {
  onToggle():void;
}

μœ„μ™€ 같이 μ„ μ–Έ λ˜μ—ˆμ„ λ•Œ μΈν„°νŽ˜μ΄μŠ€λŠ” 였λ₯˜κ°€ λ‚˜μ§€ μ•ŠλŠ”λ‹€.

Type

νƒ€μž…μ€ λ³‘ν•©ν•˜κ³ μž ν•˜λŠ” νƒ€μž…κ³Ό & 기호λ₯Ό ν™œμš©ν•΄μ„œ νƒ€μž… 병합이 κ°€λŠ₯ν•˜λ‹€.

export type PromotionOwnerList = {
  uuid: string,
  email: string,
  nickname: string,
  userPromoStatusId: string,
  promoId: string,
  maxUseAt: string,
  usedAt: string | null,
  isUsed: boolean,
  createdAt: string,
  isChecked?: boolean,
}

export type PromotionCandidateList = User & {
  provider: Provider,
  emailCert: boolean,
  privacyAgree: boolean,
  eventAgree: boolean,
  createdAt: string,
  isChecked?: boolean,
}
type ButtonType = {
  onInit():void;
  onClick():void;
}

// [였λ₯˜]
// 'ButtonType' μ‹λ³„μžκ°€ μ€‘λ³΅λ˜μ—ˆλ‹€.
type ButtonType = {
  onToggle():void;
}

νƒ€μž…μ—μ„œλŠ” 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

νƒ€μž… μΆ”λ‘ κ³Ό νƒ€μž… 단언

νƒ€μž… μΆ”λ‘ 

let x = 3;

let y = 'hello';

μœ„μ™€ 같이 x에 λŒ€ν•œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šλ”λΌλ„ numberνƒ€μž…μœΌλ‘œ y에 λŒ€ν•œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šλ”λΌλ„ stringνƒ€μž…μœΌλ‘œ κ°„μ£Όλœλ‹€.

νƒ€μž… 단언

let assertion:any = "νƒ€μž… μ–΄μ„€μ…˜μ€ 'νƒ€μž…μ„ 단언'ν•œλ‹€.";

// 방법 1: assertion λ³€μˆ˜μ˜ νƒ€μž…μ„ string으둜 단언 처리
let assertion_count:number = (<string>assertion).length;
let assertion:any = "νƒ€μž… μ–΄μ„€μ…˜μ€ 'νƒ€μž…μ„ 단언'ν•œλ‹€.";

// 방법 2: assertion λ³€μˆ˜μ˜ νƒ€μž…μ„ string으둜 단언 처리
let assertion_count:number = (assertion as string).length;

두 방법 λͺ¨λ‘ κ²°κ³ΌλŠ” λ™μΌν•˜λ‹€. ν•˜μ§€λ§Œ JSX와 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” as λ¬Έλ²•λ§Œ ν—ˆμš©λœλ‹€.

보톡 JSXμ—μ„œ 많이 μ“°λŠ” νƒ€μž… λ‹¨μ–Έμ—λŠ” divνƒœκ·Έμ—μ„œ μ΄λ²€νŠΈκ°€ λ°œμƒν•œ μƒνƒœμ—μ„œ ν•΄λ‹Ή divμ•ˆμ˜ inputμ—μ„œ 값을 가져와야 ν•˜λŠ” κ²½μš°μ— νƒ€μž… 단언을 많이 μ‚¬μš©ν–ˆλ‹€.

  const onChangeCategory = useCallback((e: React.FormEvent<HTMLDivElement>) => {
    const { value } = (e.target as HTMLInputElement);
    ...
  }, []);

Union Type vs Intersection Type

Union Type

μœ λ‹ˆμ˜¨ νƒ€μž…(Union Type)은 Aμ΄κ±°λ‚˜ B이닀 λΌλŠ” 의미의 νƒ€μž…μ΄λ‹€.

보톡 μ§€μ •λœ κ°’ μ΄μ™Έμ˜ 값이 λ“€μ–΄κ°€μ§€ μ•Šμ•„μ•Ό ν•  λ•Œ μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ§€μ •ν•΄μ„œ 많이 μ‚¬μš©ν•˜λŠ” νŽΈμ΄λ‹€.

export type PromotionCategory = 'COUPON' | 'LINK';
export type PromotionDiscount = 'FREE' | 'DISCOUNT';

Intersection Type

μΈν„°μ„Ήμ…˜ νƒ€μž…(Intersection Type)은 μ—¬λŸ¬ νƒ€μž…μ„ λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ” ν•˜λ‚˜μ˜ νƒ€μž…μ΄λ‹€.

export type PromotionCandidateList = User & {
  provider: Provider,
  emailCert: boolean,
  privacyAgree: boolean,
  eventAgree: boolean,
  createdAt: string,
  isChecked?: boolean,
}
interface Person {
  name: string;
  age: number;
}
interface Developer {
  name: string;
  skill: number;
}
type Capt = Person & Developer;

Optional Parameter

JavaScriptμ—μ„œλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•˜μ˜€μ„ λ•Œ, λŸ°νƒ€μž„ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šκ³  undefined 값을 μ–»κ²Œ λœλ‹€.

export type PromotionCandidateList = User & {
  provider: Provider,
  emailCert: boolean,
  privacyAgree: boolean,
  eventAgree: boolean,
  createdAt: string,
  isChecked?: boolean, <- option
}
function printName(obj: { first: string; last?: string }) {
  // ...
}
// λ‘˜ λ‹€ OK
printName({ first: "Bob" });
printName({ first: "Alice", last: "Alisson" });

References

Previous1.κ°œλ°œν™˜κ²½Next3.React

Last updated 1 year ago

typescript κ³΅μ‹λ¬Έμ„œ
yamoo9.gitbook.io
joshua1988.github.io