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

Last updated