πŸ“˜TypeScript - κ³ κΈ‰νƒ€μž…

zooyahoΒ·2022λ…„ 9μ›” 10일
0
post-thumbnail

πŸ”΅ μœ λ‹ˆμ˜¨ νƒ€μž…μ— λ”°λ₯Έ νƒ€μž…κ°€λ“œ

  • μœ λ‹ˆμ˜¨ νƒ€μž…μ΄ μ§€λ‹Œ μœ μ—°μ„±μ„ ν™œμš©ν•  수 있게 ν•˜λ©° λŸ°νƒ€μž„ μ‹œ μ½”λ“œλ₯Ό μ •ν™•ν•˜κ²Œ ν•΄μ€€λ‹€.
  • νŠΉμ • μ†μ„±μ΄λ‚˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜κΈ° 전에 그것이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κ±°λ‚˜ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ° 전에 이 νƒ€μž…μœΌλ‘œ μ–΄λ–€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” κ°œλ… λ˜λŠ” μš©μ–΄μ΄λ‹€.
  • in을 μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μž μ •μ˜ νƒ€μž…μ„ κ΅¬λΆ„ν•˜μ—¬ μž‘μ„±ν•  수 μžˆλ‹€.
  • classλ₯Ό μœ λ‹ˆμ˜¨μœΌλ‘œ μ •μ˜ν•œ νƒ€μž… μ‚¬μš© μ‹œ instanceofλ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ뢄해쀀닀.
type Combinable = string | number;
type Numeric = number | boolean;
type Universal = Combinable & Numeric;

function add(n1: Combinable, n2: Combinable) {
  if (typeof n1 === "string" || typeof n2 === "string") {
    return n1.toString() + n2.toString();
  }

  return n1 + n2;
}

πŸ‘‰πŸ» if (typeof n1 === "string" || typeof n2 === "string") 이 문을 νƒ€μž… κ°€λ“œλΌκ³  ν•œλ‹€.
πŸ‘‰πŸ» ν•˜μ§€λ§Œ typeofμœΌλ‘œλŠ” μ‚¬μš©μž μ •μ˜ νƒ€μž…μ„ ꡬ뢄할 수 μ—†λ‹€.

type UnknownEmployee = Employee | Admin;
function printEmployeeInformation(emp: UnknownEmployee) {
  if ("privileges" in Employee) {
    // νƒ€μž… κ°€λ“œ
    console.log("privileges: " + emp.privileges);
  }
  if ("startDate" in Admin) {
    // νƒ€μž… κ°€λ“œ
    console.log("startDate: " + Admin.startDate);
  }
}

classνƒ€μž…μ—μ„œμ˜ νƒ€μž…κ°€λ“œ

  • class 자체적으둜 νƒ€μž…μ΄ 될수 μžˆλ‹€. 클래슀 자체의 νƒ€μž…μ€ typeof 클래슀둜 확인할 수 μžˆλ‹€.
  • μΈμŠ€ν„΄μŠ€λ‘œ(new A()) λ§€κ°œλ³€μˆ˜λ₯Ό λ³΄λ‚΄μ•Όν•œλ‹€.
class A { aaa(){} }
class B { bbb(){} }

function aorb(param: A | B){
  if(param instanceof A){
    param.aaa();
  }
}
aorb(new A());
aorb(new B());

πŸ”΅ κ΅¬λ³„λœ μœ λ‹ˆμ–Έ μ‚¬μš©ν•˜κΈ°

  • type속성을 μ‚¬μš©ν•˜μ—¬ ꡬ별
interface Bird {
  type: "bird";
  flyingSpeed: number;
}
interface Horse {
  type: "horse";
  runningSpeed: number;
}

type Animal = Bird | Horse;

function moveAnimal(animal: Animal) {
  switch (animal.type) {
    // μžλ™μ™„μ„±μœΌλ‘œ 톡해 μ •ν™•ν•œ ꡬ별을 ν•  수 있음.
    case "bird": {
      console.log(animal.flyingSpeed);
      break;
    }
    case "horse": {
      console.log(animal.runningSpeed);
      break;
    }
  }
}

moveAnimal({ type: "bird", flyingSpeed: 200 });
// moveAnimal({type:'bird',runningSpeed:100 }); errorλ°œμƒ

πŸ”΅ ν˜• λ³€ν™˜(typecasting)

  • ν˜• λ³€ν™˜μ΄λž€ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ 직접 κ°μ§€ν•˜μ§€ λͺ»ν•˜λŠ” νŠΉμ • νƒ€μž…μ˜ 값을 νƒ€μž…μŠ€ν¬λ¦½νŠΈμ— μ•Œλ €μ£ΌλŠ” 역할을 ν•œλ‹€.
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” HTML νŒŒμΌμ„ μ‚΄νŽ΄λ³΄κ³  λΆ„μ„ν•˜μ§€ λͺ»ν•œλ‹€.
const inputEl = document.getElementById("input-field");

inputEl.value = "hello"; // errorλ°œμƒ

πŸ‘‰πŸ» valueκ°€ HTMLElementνƒ€μž…μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” errorκ°€ λ°œμƒν•œλ‹€.
πŸ‘‰πŸ» 기본적으둜 λͺ¨λ“  HTML μš”μ†Œκ°€ νƒ€μž…μœΌλ‘œμ„œ κ°–λŠ” μ œλ„€λ¦­ νƒ€μž…μ΄ νŠΉμ • HTMlμš”μ†ŒμΈ 속성을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.
πŸ‘‰πŸ» λ”°λΌμ„œ inputElκ°€ λ‹¨μˆœνžˆ null이 μ•„λ‹Œ HTML inputEelement νƒ€μž…μž„μ„ TSμ—κ²Œ μ•Œλ €μ•Ό ν•œλ‹€. μ΄λ•Œ ν˜•λ³€ν™˜μ„ μ‚¬μš©ν•œλ‹€.

● ν˜•λ³€ν™˜ 방법

: λ³€ν™˜ν•˜κ³ μžν•˜λŠ” μš”μ†Œ μ•žμ΄λ‚˜ νƒ€μž…μŠ€ν¬λ¦½νŠΈμ— νƒ€μž…μ„ μ•Œλ €μ£Όκ³ μž ν•˜λŠ” μœ„μΉ˜ μ•žμ— νƒ€μž…μ„ μΆ”κ°€ν•œλ‹€.

1️⃣

const inputEl = <HTMLInputElement>document.getElementById("input-field");

inputEl.value = "hello"; // errorλ°œμƒ

πŸ‘‰πŸ» <HTMLInputElement>은 ν˜„μž¬ μ‚¬μš© 쀑인 νƒ€μž…μ— λŒ€ν•œ 정보λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ”κ²Œ μ•„λ‹Œ λΉŒλ“œ 도ꡬ와 λ¦¬μ•‘νŠΈλ‘œ ꡬ문 λΆ„μ„λ˜μ–΄ 결과적으둜 화면에 λ Œλ”λ§ν•˜κ³ μž ν•˜λŠ”κ²Œ 무엇인지 μ•Œμ•„λ‚΄λŠ”λ° μ‚¬μš©ν•œλ‹€.

2️⃣

const inputEl = document.getElementById("input-field")! as HTMLInputElement;

inputEl.value = "hello";

πŸ‘‰πŸ» jsxꡬ문과 κ΅¬λ³„ν•˜κΈ° μœ„ν•΄ asν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
πŸ‘‰πŸ» document.getElementById("input-field")!λŠ” HTMLInputElementνƒ€μž…μ˜ 값을 λ°˜ν™˜ν•˜λ―€λ‘œ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.

● !

  • λŠλ‚Œν‘œ μ•žμ˜ ν‘œν˜„μ‹μ„ null, undefinedκ°€ μ•„λ‹ˆλΌλŠ” 것을 μ•Œλ¦°λ‹€.
  • ! μ‚¬μš©μ€ μΆ”μ²œν•˜μ§€ μ•ŠλŠ” λ°©μ‹μ΄λ―€λ‘œ if문을 μ‚¬μš© ν•˜λŠ”κ²ƒμ„ ꢌμž₯ν•œλ‹€.

πŸ‘Ύ λŠλ‚Œν‘œμ˜ λŒ€μ•ˆ

const inputEl = document.getElementById("input-field");

if (inputEl) {
  // ν‘œν˜„μ‹μ˜ 결과에 λŒ€ν•œ 값에 μ ‘κ·Όν•΄μ•Ό ν•œλ‹€.
  (inputEl as HTMLInputElement).value = "hello";
}

πŸ”΅ 인덱슀 속성

[prop: type]: type

  • 인덱슀 νƒ€μž…μ„ μ„€μ •ν•œλ‹€.
  • πŸ”₯ μœ μ—°μ„±μ„ μ œκ³΅ν•˜κΈ°μ— μ‚¬μš©ν•˜κ³ μž ν•˜λŠ” 속성 이름과 ν•„μš”ν•œ μ†μ„±μ˜ 개수λ₯Ό 미리 μ•Œ ν•„μš”κ°€ μ—†λ‹€.

πŸ‘Ύ μ‚¬μš©μž μž…λ ₯의 μœ νš¨μ„± 검사λ₯Ό ν•˜λŠ” 경우

interface ErrorContainer {
  // λ°˜λ“œμ‹œ λ¬Έμžμ—΄μ˜ ν‚€, 값을 지녀야 ν•œλ‹€.
  [prop: string]: string; // 인덱슀 νƒ€μž…μ„ μ„€μ •!!
  // [prop: number]: string;
}

const errorBag: ErrorContainer = {
  // 1: "Not a valid email", πŸ‘‰πŸ» 1도 λ¬Έμžμ—΄λ‘œ ν•΄μ„λ˜κΈ° λ•Œλ¬Έμ— λ¬Έμ œμ—†λ‹€.
  email: "Not a valid email",
  username: "Not a valid username",
};

πŸ”΅ ν•¨μˆ˜ μ˜€λ²„λ‘œλ“œ

  • λ‹€μ–‘ν•œ λ§€κ°œλ³€μˆ˜λ₯Ό μ§€λ‹Œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ—¬λŸ¬ 가지 κ°€λŠ₯ν•œ 방법을 μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ λ‚΄μ—μ„œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

πŸ‘Ύ #01

type Combinable = string | number;

function add(n1: Combinable, n2: Combinable) {
  if (typeof n1 === "string" || typeof n2 === "string") {
    return n1.toString() + n2.toString();
  }

  return n1 + n2;
}

const result = add("Max", " Siri");
// μ΄λ•Œ λ¬Έμžμ—΄μ΄ λ°˜ν™˜λœλ‹€λŠ” 것을 TSλŠ” μ•Œμ§€ λͺ»ν•΄ λ¬Έμžλ©”μ„œλ“œμ‚¬μš©μ„ ν•˜μ§€λͺ»ν•œλ‹€.
result.split(" "); // error

πŸ‘‰πŸ» const result = add('Max',' Siri') as string;
: as string으둜 ν˜•λ³€ν™˜μ„ λͺ…μ‹œμ μœΌλ‘œ μž‘μ„±ν•˜λ©΄ λ˜μ§€λ§Œ μ½”λ“œκ°€ κΈΈμ–΄μ§„λ‹€λŠ” 단점이 μžˆλ‹€.
πŸ‘‰πŸ» μ΄λ•Œ ν•¨μˆ˜ μ˜€λ²„λΌμ΄λ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

πŸ‘Ύ #02 - ν•¨μˆ˜ μ˜€λ²„λΌμ΄λ“œ μ‚¬μš©

type Combinable = string | number;

function add(n1: number, n2: number): number;
function add(n1: string, n2: string): string;
function add(n1: number, n2: string): string;
function add(n1: string, n2: number): string;
function add(n1: Combinable, n2: Combinable) {
  if (typeof n1 === "string" || typeof n2 === "string") {
    return n1.toString() + n2.toString();
  }
  return n1 + n2;
}

const result = add("Max", " Siri");
result.split(" "); // λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ”κ²ƒμ„ 인식함

πŸ”΅ 선택적 체이닝

  • μ„ νƒμ μœΌλ‘œ μ‚¬μš©ν•  μš”μ†Œ λ‹€μŒμ— ?λ₯Ό μΆ”κ°€ν•œλ‹€.
  • typescript 3.7버전 이상뢀터 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

πŸ‘Ύ #01
: 객체 λ°μ΄ν„°μ˜ μ€‘μ²©λœ 속성과 객체에 μ•ˆμ „ν•˜κ²Œ μ ‘κ·Όν•  수 μžˆκ²Œν•œλ‹€.
: λ°±μ—”λ“œμ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜¬ 경우, 일뢀 데이터가 κ°œλ°œμžκ°€ μž‘μ„±ν•œλŒ€λ‘œ λΆˆλŸ¬μ™€μ§€μ§€ μ•Šμ•˜μ„ λ•Œ 선택적 체이닝을 μ‚¬μš©ν•˜μ—¬ μ—λŸ¬λ₯Ό λ°©μ§€ν•œλ‹€.

const fetchedUserData = {
  id: "u1",
  name: "job",
  // job: { title: "CEO", description: "My own company"}
};
console.log(fetchedUserData?.job.title); // error

πŸ”΅ Null 병합

  • ?? : null, undefuned일 경울 폴백값을 μ €μž₯ν•œλ‹€.
  • tsλŠ” dom apiλ₯Ό 톡해 κ°€μ Έμ˜¨ μš”μ†ŒλŠ” null인지 νŒλ‹¨ν•˜μ§€ λͺ»ν•œλ‹€.
  • null이라면 폴백(fallback)값을 μ €μž₯ν•˜λ„λ‘ ν•œλ‹€.
const a = null;
console.log(a ?? "DEFAULT"); // DEFAULT
profile
즐겁게 κ°œλ°œν•˜μž μ₯¬μ•Όν˜ΈπŸ‘»

0개의 λŒ“κΈ€