TypeScript

  • A javaScript Superset

  • A Language building up on javaScript

  • Adds new Features + Advantages to javascript (μƒˆλ‘œμš΄ 것이 μ•„λ‹ˆλ‹€)

  • Browser can't execute it

  • Compiled to js

const add = (num1, num2) => num1 + num2;

console.log(add('1','2'));

add('1','2') Unwanted Behavior at Runtime

result 23

Mitigation Stategies

Add if check to add fuction Validate & sanitize user input

const button = document.querySelector("button");
const input1 = document.querySelector("num1");
const input2 = document.querySelector("num2");

const add = (num1, num2) => num1 + num2;

button.addEventListener('click', () => consle.log(input1.value, input2.value));

this is not a technical error

it's not an error which is thrown but it's a logical error

the value of an input element is always a number

const add = (num1, num2) => {
  if(typeof num1 === "number" && typeof num2 === "number") {
    return num1 + num2
  } 
  return Number(num1) + Number(num2);
}

using typescript

const button = document.querySelector("button");
const input1 = document.querySelector("num1")! as HTMLInputElement;
const input2 = document.querySelector("num2");

const add = (num1: number, num2: number) => num1 + num2;

button.addEventListener('click', () => consle.log(input1.value, input2.value));
tsc using-ts.ts

compiler error

μ—¬κΈ°μ„œ !λŠ” μ ˆλŒ€ null이 μ˜€μ§€ μ•ŠλŠ”λ‹€λŠ” λœ»μ΄λ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μΆ”κ°€ν•˜λŠ”κ²ƒμ€ typeκ³Ό dataκ°€ 맀우 μ€‘μš”ν•˜λ‹€.

μž₯점

  • clean code

  • 였λ₯˜ λ°©μ§€(예기치 μ•Šμ€ 상황을 ν”Όν•  수 μžˆλ‹€.)

  • μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •

  • μ»΄νŒŒμΌν•˜μ—¬ μ΄μ „λ²„μ „μ˜ λΈŒλΌμš°μ €λ„ μ§€μ›ν•œλ‹€.(Next-gen JavaScript)

  • Non-javaScript Features like Interfaces or Generics

  • Meta-Programming Features like Decorators

  • Rich Configuration Options

  • Modern Tooling that helps even in non-TypeScript Projects

lite server

npm install --save-dev lite-server
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "lite-server"
}

Core Types

  • number

  • String

  • Boolean

  • Object

  • Array

  • Tuple

  • Enum

  • Any

number

function add(n1: number, n2: number) {
  return n1 + n2;
}

const number1 = '5';
const number2 = 2.8;

const result = add(number1, number2);
console.log(result);

typeScript's type system only helps you during development.

λΈŒλΌμš°μ €λŠ” 지원해주지 μ•ŠλŠ”λ‹€.

JavaScript uses "dynamic types" (resolved at runtime), TypeScript uses "static types" (set during development).

Object Types

const person = {
  name: 'sla'
};

console.log(person.nickname);

nickname을 μ„€μ •ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ nickname을 ν™•μΈν•˜κ³ μž ν•œλ‹€λ©΄ κ°œλ°œν™˜κ²½μ—μ„œ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ 였λ₯˜λ₯Ό μ•Œλ €μ€€λ‹€.

Property 'nickname' does not exist on type '{ name: string; age: number; }'.

6 console.log(person.nickname);

const person: {
  name: string;
} = {
  name: 'sla'
};

console.log(person.name);

Array

const person = {
  name: 'sla',
  hobbies: ['Sports', 'Cooking']
};

for (const hobby of person.hobbies) {
  console.log(hobby.toLocaleUpperCase());
}

console.log(person.name);

toLocaleUpperCaseλ₯Ό μΌμ„λ•ŒλŠ” λ¬Έμ œκ°€ μ—†λ‹€.

for (const hobby of person.hobbies) {
  console.log(hobby.map());
}

map은 Array λ©”μ†Œλ“œκΈ° λ•Œλ¬Έμ— νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μ—λŸ¬λ₯Ό λΏœλΏœν•΄μ€€λ‹€.

Tuple

const person: {
  name: string;
  age: number;
  hobbies: string[];
  role: [number, string];
} = {
  name: 'sla',
  hobbies: ['Sports', 'Cooking'],
  role: [2, 'author']
};

Enum

const ADMIN = 0;

const person = {
  name: 'sla',
  hobbies: ['Sports', 'Cooking'],
  role: ADMIN
};

jsμ—μ„œ μƒμˆ˜κ΄€λ¦¬λ₯Ό ν•  λ•ŒλŠ” const와 λŒ€λ¬Έμž λ³€μˆ˜λͺ…을 μ΄μš©ν•˜μ—¬ ν•˜μ˜€λ‹€.

enum은 μ—΄κ±°ν˜•μœΌλ‘œ μ‰½κ²Œ ν•  수 μžˆλ‹€.

typescript둜 λ°”κΎΌλ‹€λ©΄

enum Role { ADMIN, READ_ONLY, AUTHOR };

const person = {
  name: 'sla',
  hobbies: ['Sports', 'Cooking'],
  role: Role.ADMIN
};

enum Role { ADMIN, READ_ONLY, AUTHOR }; μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. λ°°μ—΄μ²˜λŸΌ 0, 1, 2에 ν•΄λ‹Ήλœλ‹€.

λ³€ν™˜ν•œ νŒŒμΌμ—μ„œ 확인할 수 μžˆλ‹€.

var Role;
(function (Role) {
    Role[Role["ADMIN"] = 0] = "ADMIN";
    Role[Role["READ_ONLY"] = 1] = "READ_ONLY";
    Role[Role["AUTHOR"] = 2] = "AUTHOR";
})(Role || (Role = {}));
enum Role { ADMIN = 5, READ_ONLY = 'READ_ONLY', AUTHOR };

수λ₯Ό λ³€κ²½ν•  수 μžˆλŠ” μˆ«μžλ„ 되고 ν…μŠ€νŠΈλ„ λœλ‹€.

any

  • μ΅œλŒ€ν•œ μ“°λŠ” 것을 ν”Όν•˜μž

  • λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ λ‚˜νƒ€λ‚΄μ§€ μ•Šκ³  μœ μΆ”λ₯Ό ν†΅ν•œλ‹€λ©΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈ μž₯점 x

Union Types

function combine(input1: number | string, input2: number | string) {
  let result;
  if (typeof input1 === 'number' && typeof input2 === 'number') {
    result = input1 + input2;
  } else {
    result = input1.toString() + input2.toString();
  }

  return result;
}

const combinedAges = combine(30, 26);

console.log(combinedAges)

| 을 μ΄μš©ν•˜μ—¬ νƒ€μž…μ„ μ§€μ •ν•  수 μžˆλ‹€.

Type Aliases

type Combinable = number | string;

function combine(input1: Combinable, input2: Combinable) {
  // ...code
}

type을 μ΄μš©ν•˜μ—¬ 상단에 μ§€μ •ν•  수 μžˆλ‹€.

Function Return Types and Void

function add(n1: number, n2: number): number {
  return n1 + n2
}

parameter λ§€κ°œλ³€μˆ˜ μ˜†μ— : λ₯Ό μ΄μš©ν•˜μ—¬ returnκ°’μ˜ νƒ€μž…μ„ μ •μ˜ν•΄μ€€λ‹€.

function printResult(num: number): void {
  console.log('Result: ' + num);
}

return값이 없을 λ•Œλ‚˜, return;만 ν• λ•Œ void둜 μ •μ˜ν•œλ‹€.

undefined 인 κ²½μš°μ€ μ•ˆλ κΉŒ?

function printResult(num: number): undefiend {
  console.log('Result: ' + num);
  return;
}

return; 이런 상황을 말할 수 μžˆλ‹€. ν•˜μ§€λ§Œ void 둜 μ“΄λ‹€.

Function Types

function add(n1: number, n2: number): number {
  return n1 + n2
}

let combineValues: (a: number, b: number) => number;

combineValues = add;

console.log(combineValues(8, 8));

λ³€μˆ˜μ˜ νƒ€μž…μ„ ν•¨μˆ˜λ‘œ μ§€μ •ν•  λ•Œ function이라고 ν•˜μ§€ μ•ŠλŠ”λ‹€. (a: number, b: number) => number; 으둜 μ§€μ •ν•œλ‹€.

Function Types and Callbacks

function add(n1: number, n2: number, cb: (num: number) => void): number {
  cb(result);
  return n1 + n2
}

console.log(add(1, 2, (num) => console.log(num)));

μΈμžμ— λŒ€ν•œ μ •μ˜λŠ” λ§€κ°œλ³€μˆ˜μ—μ„œ ν•œλ‹€. μ˜μ‹¬μ΄ λ“€μ–΄ ν™•μΈν•˜λŠ” 방법은 addν•¨μˆ˜λ₯Ό 호좜 ν•  λ•Œ 마우슀λ₯Ό 올렀보면 νƒ€μž…μ΄ μ§€μ •λ˜μ–΄ μžˆλ‹€.

The Unknown Type

let userInput: unknown;
let useName: string;

userInput = 5;
userInput = 'sla';

userName = userInput;

μ΄λ ‡κ²Œ ν•˜λ©΄ λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ‚œλ‹€. unknown둜 μ„€μ •ν•œκ±΄ string에 ν• λ‹Ήν•  수 μ—†λ‹€.

κ·Έλ ‡λ‹€λ©΄ anyλŠ”?

let userInput: any;
let userName: string;

userInput = 5;
userInput = 'sla';

userName = userInput;

문제 μ—†λ‹€. any둜 μ„€μ •ν•˜λŠ” 것은 μžλ°”μŠ€ν¬λ¦½νŠΈμ²˜λŸΌ μœ μ—°ν•˜κ²Œ μ“°κ² λ‹€λŠ” 뜻이고 기본적으둜 νƒ€μž…κ²€μ‚¬λ₯Ό λΉ„ν™œμ„±ν™”ν•˜κ³  νƒ€μž…μŠ€ν¬λ¦½νŠΈλ₯Ό μ“°λŠ” 것을 ν¬κΈ°ν•˜κ² λ‹€ λŠ” λœ»μ΄λ‹€.

userInput에 ν• λ‹Ήν•˜λŠ” 법

let userInput: unknown;
let userName: string;

userInput = 5;
userInput = 'sla';

if (typeof userInput === 'string') {
  userName = userInput;
}

extra checkλ₯Ό μΆ”κ°€ν•œλ‹€.

The Never Type

function generateError(message: string, code: number): never {
  throw {message: message, errorCode: code};
  // while (true) {}
}

generateError('An error occurred!', 500);

ν•¨μˆ˜μ—μ„œ μ ˆλŒ€ return이 없을 λ•Œ μ‚¬μš©ν•œλ‹€.

generateError에 마우슀λ₯Ό 올리면 voidκ°€ λœ¨μ§€λ§Œ 훨씬 λͺ…ν™•ν•˜λ‹€.

Last updated

Was this helpful?