Skip to content

preCrew/SunAh

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

12 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ToDoList 배포

https://csn-ah22.github.io/todolist/

DeepScan grade

skills

  • Library: React
  • Language: TypeScript, Dart-Sass
  • TypeScript Version: 4.7.4
  • Sass Version: 1.53.0

κΈ°λŠ₯μ„€λͺ…

  • 였늘의 λ‚ μ§œ, μš”μΌ, μ›” 이 μˆœμ„œλŒ€λ‘œ ν‘œμ‹œλ¨
  • 할일 μΆ”κ°€ 및 μ‚­μ œ κΈ°λŠ₯
  • 마감 λ‚ μ§œ μΆ”κ°€ κΈ°λŠ₯

[μ œλ„€λ¦­]

  • λ¦¬μ•‘νŠΈμ˜ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€λ•Œ 자주 ν™œμš©λ˜λŠ” νŠΉμ§•μ΄λ‹€
  • 특히, ν•œκ°€μ§€ νƒ€μž…λ³΄λ‹€ μ—¬λŸ¬ κ°€μ§€ νƒ€μž…μ—μ„œ λ™μž‘ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜λŠ”λ° μ‚¬μš©λœλ‹€

μ œλ„€λ¦­μ˜ ν•œ 쀄 μ •μ˜μ™€ μ˜ˆμ‹œ

  • μ œλ„€λ¦­μ΄λž€ νƒ€μž…μ„ 마치 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μ²˜λŸΌ μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€
function getText<T>(text: T): T {
  return text;
}
λ¨Όμ € ν•¨μˆ˜μ˜ 이름 λ°”λ‘œ 뒀에 <T> λΌλŠ” μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€. 
그리고 ν•¨μˆ˜μ˜ μΈμžμ™€ λ°˜ν™˜ 값에 λͺ¨λ‘ T λΌλŠ” νƒ€μž…μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. 
μ΄λ ‡κ²Œ 되면 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  λ•Œ λ„˜κΈ΄ νƒ€μž…μ— λŒ€ν•΄ νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μΆ”μ •ν•  수 있게 λ©λ‹ˆλ‹€. 
λ”°λΌμ„œ, ν•¨μˆ˜μ˜ μž…λ ₯ 값에 λŒ€ν•œ νƒ€μž…κ³Ό 좜λ ₯ 값에 λŒ€ν•œ νƒ€μž…μ΄ λ™μΌν•œμ§€ 검증할 수 있게 λ©λ‹ˆλ‹€.
  • μœ„ ν•¨μˆ˜λŠ” μ œλ„€λ¦­ κΈ°λ³Έ 문법이 적용된 ν˜•νƒœμ΄λ‹€
  • getText<string>('hi') λ₯Ό 호좜 ν–ˆμ„ λ•Œ ν•¨μˆ˜μ—μ„œ μ œλ„€λ¦­μ΄ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄μž
  • λ¨Όμ € ν•¨μˆ˜μ—μ„œ μ œλ„€λ¦­ νƒ€μž…μ΄ 으둜 λœλ‹€
 function getText<string>(text: T): T {
  return text;
}       
  • 그리고 λ‚˜μ„œ ν•¨μˆ˜μ˜ 인자둜 hi λΌλŠ” 값을 μ•„λž˜μ™€ 같이 λ„˜κΈ°κ²Œ 되면
function getText<string>(text: string): string {
  return text;
}        
  • μœ„μ™€ 같은 μ½”λ“œκ°€ 처음의 κΈ°λ³Έμ œλ„€λ¦­ μ½”λ“œμ™€ 같은 의미λ₯Ό κ°€μ§€κ²Œ λœλ‹€

μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λŠ” 이유

function logText(text: any): any {
  return text;
}        
  • μœ„μ˜ μ½”λ“œλŠ” ν•¨μˆ˜μ˜ 인자둜 μ–΄λ–€ νƒ€μž…μ΄ λ“€μ–΄κ°”κ³  μ–΄λ–€ 값이 λ°˜ν™˜λ˜λŠ”μ§€λŠ” μ•Œ μˆ˜κ°€ μ—†λ‹€

  • μ™œλƒν•˜λ©΄ anyλΌλŠ” νƒ€μž…μ€ νƒ€μž… 검사λ₯Ό ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έ

  • μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•  수 μžˆλŠ” 것이 μ œλ„€λ¦­μ΄λ‹€

function logText<T>(text: T): T {
  return text;
}        
  • 두가지 λ°©λ²•μœΌλ‘œ ν˜ΈμΆœν• μˆ˜ μžˆλ‹€
// #1
const text = logText<string>("Hello Generic");
// #2
const text = logText("Hello Generic");

μ œλ„€λ¦­ νƒ€μž… λ³€μˆ˜

function logText<T>(text: T): T {
  console.log(text.length); // Error: T doesn't have .length
  return text;
}        
  • μœ„ μ½”λ“œκ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€λŠ” μ΄μœ λŠ” text에 .lengthκ°€ μžˆλ‹€λŠ” λ‹¨μ„œλŠ” 어디에도 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€
  • κ·Έλž˜μ„œ 이런 κ²½μš°μ—λŠ” μ•„λž˜μ™€ 같이 μ œλ„€λ¦­μ— νƒ€μž…μ„ 쀄 μˆ˜κ°€ μžˆλ‹€
function logText<T>(text: T[]): T[] {
  console.log(text.length); // μ œλ„€λ¦­ νƒ€μž…μ΄ 배열이기 λ•Œλ¬Έμ— `length`λ₯Ό ν—ˆμš©ν•©λ‹ˆλ‹€.
  return text;
}        

ν˜Ήμ€ 더 λͺ…μ‹œμ μœΌλ‘œ μ•„λž˜μ™€ 같이 μ‚¬μš©ν• μˆ˜ μžˆλ‹€

function logText<T>(text: Array<T>): Array<T> {
  console.log(text.length);
  return text;
}        
ν•¨μˆ˜μ— [1,2,3]처럼 숫자둜 이뀄진 배열을 λ°›μœΌλ©΄ λ°˜ν™˜ κ°’μœΌλ‘œ numberλ₯Ό λŒλ €μ£ΌλŠ” 것이죠.
이런 λ°©μ‹μœΌλ‘œ μ œλ„€λ¦­μ„ μ‚¬μš©ν•˜λ©΄ κ½€ μœ μ—°ν•œ λ°©μ‹μœΌλ‘œ ν•¨μˆ˜μ˜ νƒ€μž…μ„ μ •μ˜ν•΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.        

μ œλ„€λ¦­ νƒ€μž…

  • μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€μ— λŒ€ν•΄ μ•Œμ•„λ³΄μž μ•„λž˜μ˜ 두 μ½”λ“œλŠ” 같은 μ˜λ―Έμ΄λ‹€
function logText<T>(text: T): T {
  return text;
}
// #1
let str: <T>(text: T) => T = logText;
// #2
let str: {<T>(text: T): T} = logText;        
  • μœ„μ™€ 같은 λ³€ν˜• λ°©μ‹μœΌλ‘œ μ œλ„€λ¦­ μΈν„°νŽ˜μ΄μŠ€ μ½”λ“œλ₯Ό λ‹€μŒκ³Ό 같이 μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
interface GenericLogTextFn {
  <T>(text: T): T;
}
function logText<T>(text: T): T {
  return text;
}
let myString: GenericLogTextFn = logText; // Okay        

λ˜λŠ”

 interface GenericLogTextFn<T> {
  (text: T): T;
}
function logText<T>(text: T): T {
  return text;
}
let myString: GenericLogTextFn<string> = logText;       

μ œλ„€λ¦­ 클래슀

class GenericMath<T> {
  pi: T;
  sum: (x: T, y: T) => T;
}

let math = new GenericMath<number>();
μ œλ„€λ¦­ 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ 클래슀 이름 였λ₯Έμͺ½μ— <T>λ₯Ό λΆ™μ—¬μ€λ‹ˆλ‹€.
그리고 ν•΄λ‹Ή 클래슀둜 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ 
νƒ€μž…μ— μ–΄λ–€ 값이 λ“€μ–΄κ°ˆ μ§€ μ§€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.
쑰금 전에 μ‚΄νŽ΄λ³Έ μΈν„°νŽ˜μ΄μŠ€μ²˜λŸΌ 
μ œλ„€λ¦­ ν΄λž˜μŠ€λ„ 클래슀 μ•ˆμ— μ •μ˜λœ 속성듀이 
μ •ν•΄μ§„ νƒ€μž…μœΌλ‘œ 잘 λ™μž‘ν•˜κ²Œ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.          

μ œλ„€λ¦­ μ œμ•½ 쑰건

μž μ‹œ 이전 μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄μž

function logText<T>(text: T): T {
  console.log(text.length); // Error: T doesn't have .length
  return text;
}          
인자의 νƒ€μž…μ— μ„ μ–Έν•œ TλŠ” 아직 μ–΄λ–€ νƒ€μž…μΈμ§€ ꡬ체적으둜 μ •μ˜ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— length μ½”λ“œμ—μ„œ 였λ₯˜κ°€ λ‚©λ‹ˆλ‹€. 
이럴 λ•Œ λ§Œμ•½ ν•΄λ‹Ή νƒ€μž…μ„ μ •μ˜ν•˜μ§€ μ•Šκ³ λ„ length 속성 μ •λ„λŠ” ν—ˆμš©ν•˜λ €λ©΄ μ•„λž˜μ™€ 같이 μž‘μ„±ν•©λ‹ˆλ‹€.
interface LengthWise {
  length: number;
}

function logText<T extends LengthWise>(text: T): T {
  console.log(text.length);
  return text;
}
  • μœ„μ™€ 같이 μž‘μ„±ν•˜κ²Œ 되면 νƒ€μž…μ— λŒ€ν•œ κ°•μ œλŠ” μ•„λ‹ˆμ§€λ§Œ length에 λŒ€ν•΄ λ™μž‘ν•˜λŠ” 인자만 λ„˜κ²¨λ°›μ„ 수 있게 λœλ‹€
logText(10); // Error, 숫자 νƒ€μž…μ—λŠ” `length`κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 였λ₯˜ λ°œμƒ
logText({ length: 0, value: 'hi' }); // `text.length` μ½”λ“œλŠ” 객체의 속성 μ ‘κ·Όκ³Ό 같이 λ™μž‘ν•˜λ―€λ‘œ 였λ₯˜ μ—†μŒ          

객체의 속성을 μ œμ•½ν•˜λŠ” 방법

function getProperty<T, O extends keyof T>(obj: T, key: O) {
  return obj[key];  
}
let obj = { a: 1, b: 2, c: 3 };

getProperty(obj, "a"); // okay
getProperty(obj, "z"); // error: "z"λŠ” "a", "b", "c" 속성에 ν•΄λ‹Ήν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.          

μ œλ„€λ¦­μ„ μ„ μ–Έν•  λ•Œ λΆ€λΆ„μ—μ„œ< 첫 번째 인자둜 λ°›λŠ” 객체에 μ—†λŠ” 속성듀은 μ ‘κ·Όν•  수 μ—†κ²Œλ” μ œν•œν•˜μ˜€λ‹€

[클래슀 νƒ€μž…μ •μ˜]

Accessor (μ ‘κ·Όμž)

  • μ•„λž˜ κ°„λ‹¨ν•œ μ½”λ“œλ₯Ό μ œμ‹œν•œλ‹€

  • ꡬ성 λͺ©λ‘μ€ λ‹€μŒκ³Ό κ°™λ‹€

  • Class

    • field (λ³€μˆ˜ μ΄ˆκΈ°ν™”)
    • get
    • set
class Developer {
  private name: string;
  
  get name(): string {
    return this.name;
  }

  set name(newValue: string) {
    if (newValue && newValue.length > 5) {
      throw new Error('이름이 λ„ˆλ¬΄ κΉλ‹ˆλ‹€');
    }
    this.name = newValue;
  }
}
const josh = new Developer();
josh.name = 'Josh Bolton'; // Error
josh.name = 'Josh';

Abstract Class (μΆ”μƒν΄λž˜μŠ€)

  • 좔상 클래슀(Abstract Class)λŠ” μΈν„°νŽ˜μ΄μŠ€μ™€ λΉ„μŠ·ν•œ 역할을 ν•˜λ©΄μ„œλ„ 쑰금 λ‹€λ₯Έ νŠΉμ§•μ„ κ°–λŠ”λ‹€
  • 좔상 ν΄λž˜μŠ€λŠ” νŠΉμ • 클래슀의 상속 λŒ€μƒμ΄ λ˜λŠ” 클래슀이며 μ’€ 더 μƒμœ„ λ ˆλ²¨μ—μ„œ 속성, λ©”μ„œλ“œμ˜ λͺ¨μ–‘을 μ •μ˜ν•œλ‹€
abstract class Developer {
  abstract coding(): void; // 'abstract'κ°€ λΆ™μœΌλ©΄ 상속 받은 ν΄λž˜μŠ€μ—μ„œ 무쑰건 κ΅¬ν˜„ν•΄μ•Ό 함
  drink(): void {
    console.log('drink sth');
  }
}

class FrontEndDeveloper extends Developer {
  coding(): void {
    // Developer 클래슀λ₯Ό 상속 받은 ν΄λž˜μŠ€μ—μ„œ 무쑰건 μ •μ˜ν•΄μ•Ό ν•˜λŠ” λ©”μ„œλ“œ
    console.log('develop web');
  }
  design(): void {
    console.log('design web');
  }
}
const dev = new Developer(); // error: cannot create an instance of an abstract class
const josh = new FrontEndDeveloper();
josh.coding(); // develop web
josh.drink(); // drink sth
josh.design(); // design web

[μ—°μ‚°μžλ₯Ό μ΄μš©ν•œ νƒ€μž…μ •μ˜]

μœ λ‹ˆμ˜¨ νƒ€μž… (OR 논리연산이라 μƒκ°ν•˜λ©΄ νŽΈν•¨)

  • μœ λ‹ˆμ˜¨ νƒ€μž…(Union Type)μ΄λž€ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ OR μ—°μ‚°μž(||)와 같이 Aμ΄κ±°λ‚˜ B이닀 λΌλŠ” 의미의 νƒ€μž…μ΄λ‹€.
  • ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„° textμ—λŠ” λ¬Έμžμ—΄ νƒ€μž…μ΄λ‚˜ 숫자 νƒ€μž…μ΄ λͺ¨λ‘ 올 수 μžˆλ„λ‘ λ§Œλ“€μˆ˜ μžˆλ‹€
function logText(text: string | number) {
  // ...
}
  • μ•„λž˜μ˜ κ²½μš°λŠ” anyλ₯Ό μ‚¬μš©ν• κ²½μš° toFixe() κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€ (μ†Œμˆ˜μ  μžλ¦Ώμˆ˜μ— 따라 자λ₯΄λŠ” κΈ°λŠ₯)
// anyλ₯Ό μ‚¬μš©ν•˜λŠ” 경우
function getAge(age: any) {
  age.toFixed(); // μ—λŸ¬ λ°œμƒ, age의 νƒ€μž…μ΄ any둜 μΆ”λ‘ λ˜κΈ° λ•Œλ¬Έμ— 숫자 κ΄€λ ¨λœ APIλ₯Ό μž‘μ„±ν•  λ•Œ μ½”λ“œκ°€ μžλ™ μ™„μ„±λ˜μ§€ μ•ŠλŠ”λ‹€.
  return age;
}
  • μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ‚¬μš©ν•˜μ—¬ if문에 따라 toFixe()κΈ°λŠ₯을 μ‚¬μš©ν• μ§€ ν•˜μ§€ μ•Šμ„μ§€ κ²°μ •ν• μˆ˜ μžˆμ–΄ 였λ₯˜κ°€ 생기지 μ•ŠλŠ”λ‹€
// μœ λ‹ˆμ˜¨ νƒ€μž…μ„ μ‚¬μš©ν•˜λŠ” 경우
function getAge(age: number | string) {
  if (typeof age === 'number') {
    age.toFixed(); // 정상 λ™μž‘, age의 νƒ€μž…μ΄ `number`둜 μΆ”λ‘ λ˜κΈ° λ•Œλ¬Έμ— 숫자 κ΄€λ ¨λœ APIλ₯Ό μ‰½κ²Œ μžλ™μ™„μ„± ν•  수 μžˆλ‹€.
    return age;
  }
  if (typeof age === 'string') {
    return age;
  }
  return new TypeError('age must be number or string');
}

Intersection Type (AND 논리연산이라 μƒκ°ν•˜λ©΄ νŽΈν•¨)

  • μΈν„°μ„Ήμ…˜ νƒ€μž…(Intersection Type)은 μ—¬λŸ¬ νƒ€μž…μ„ λͺ¨λ‘ λ§Œμ‘±ν•˜λŠ” ν•˜λ‚˜μ˜ νƒ€μž…μ„ μ˜λ―Έν•¨
  • interface λ‘κ°œλ₯Ό μ •μ˜ν•˜κ³  ν•˜λ‚˜μ˜ λ³€μˆ˜μ— ν•©μΉ˜λŠ”κ²ƒμ„ 말함
interface Person {
  name: string;
  age: number;
}
interface Developer {
  name: string;
  skill: number;
}
type Capt = Person & Developer;
  • 결과적으둜 Capt λΌλŠ” νƒ€μž…μ€ μ•„λž˜μ™€ 같은 ꡬ성을 κ°€μ§„λ‹€
{
  name: string;
  age: number;
  skill: string;
}

Union Type을 μ“Έ λ•Œ μ£Όμ˜ν•  점

  • μ•„λ§ˆ λ…Όλ¦¬μ μœΌλ‘œ μœ λ‹ˆμ˜¨ νƒ€μž…μ€ OR, μΈν„°μ„Ήμ…˜μ€ AND라고 생각할텐데 μΈν„°νŽ˜μ΄μŠ€μ™€ 같은 νƒ€μž…μ„ λ‹€λ£° λ•ŒλŠ” 이와 같은 논리적 사고λ₯Ό μ£Όμ˜ν•΄μ•Όν•œλ‹€
interface Person {
  name: string;
  age: number;
}
interface Developer {
  name: string;
  skill: string;
}
function introduce(someone: Person | Developer) {
  someone.name; // O 정상 λ™μž‘
  someone.age; // X νƒ€μž… 였λ₯˜
  someone.skill; // X νƒ€μž… 였λ₯˜
}
  • μ—¬κΈ°μ„œ introduce() ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°μΈ somenone의 νƒ€μž…μ„ Person, Developer λ‘˜μ€‘ ν•˜λ‚˜λ‘œ μ •μ˜λ˜λ„λ‘ λ§Œλ“€μ—ˆλ‹€
  • μœ λ‹ˆμ˜¨ νƒ€μž…μ€ A도 될 수 있고 B도 될 수 μžˆλŠ” νƒ€μž…μ΄μ§€λΌκ³  μƒκ°ν•˜λ©΄ νŒŒλΌλ―Έν„°μ˜ νƒ€μž…μ΄ Person도 되고 Developer도 λ ν…Œλ‹ˆκΉŒ
  • ν•¨μˆ˜ μ•ˆμ—μ„œ λ‹Ήμ—°νžˆ 이 μΈν„°νŽ˜μ΄μŠ€λ“€μ΄ μ œκ³΅ν•˜λŠ” 속성듀인 ageλ‚˜ skillλ₯Ό μ‚¬μš©ν•  수 μžˆκ² μ§€λΌκ³  생각할 수 μžˆλŠ”λ° μ΄λŠ” 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚¨λ‹€
  • νƒ€μž…μŠ€ν¬λ¦½νŠΈ κ΄€μ μ—μ„œλŠ” introduce() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ‹œμ μ— Person νƒ€μž…μ΄ μ˜¬μ§€ Developer νƒ€μž…μ΄ μ˜¬μ§€ μ•Œ μˆ˜κ°€ μ—†λ‹€
  • λ•Œλ¬Έμ— μ–΄λŠ νƒ€μž…μ΄ λ“€μ–΄μ˜€λ“  간에 였λ₯˜κ°€ μ•ˆ λ‚˜λŠ” λ°©ν–₯으둜 νƒ€μž…μ„ μΆ”λ‘ ν•˜κ²Œ λœλ‹€

Intersection Type을 μ“Έ λ•Œ μ£Όμ˜ν•  점

const capt: Person = { name: 'capt', age: 100 };
introduce(capt); // λ§Œμ•½ `introduce` ν•¨μˆ˜ μ•ˆμ—μ„œ `someone.skill` 속성을 μ ‘κ·Όν•˜κ³  있으면 ν•¨μˆ˜μ—μ„œ 였λ₯˜ λ°œμƒ

const tony: Developer = { name: 'tony', skill: 'iron making' };
introduce(tony); // λ§Œμ•½ `introduce` ν•¨μˆ˜ μ•ˆμ—μ„œ `someone.age` 속성을 μ ‘κ·Όν•˜κ³  있으면 ν•¨μˆ˜μ—μ„œ 였λ₯˜ λ°œμƒ

function introduce(someone: Person | Developer) {
  console.log(someone.name); // O 정상 λ™μž‘
}
  • 결과적으둜 introduce() ν•¨μˆ˜ μ•ˆμ—μ„œλŠ” λ³„λ„μ˜ νƒ€μž… κ°€λ“œ(Type Guard)λ₯Ό μ΄μš©ν•˜μ—¬ νƒ€μž…μ˜ λ²”μœ„λ₯Ό μ’νžˆμ§€ μ•ŠλŠ” 이상
  • κΈ°λ³Έμ μœΌλ‘œλŠ” Personκ³Ό Developer 두 νƒ€μž…μ— κ³΅ν†΅μ μœΌλ‘œ λ“€μ–΄μžˆλŠ” 속성인 name만 μ ‘κ·Όν•  수 μžˆλ‹€.

[μΈν„°νŽ˜μ΄μŠ€]

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ“°μ§€ μ•Šμ•˜μ„ 경우 ↓↓

      let person = { name: 'Capt', age: 28 };
      
      function logAge(personObj: { age: number }) {
          console.log(personObj.age); // 좜λ ₯=28
      }
      logAge(person); // person객체λ₯Ό 전달
    
  • 맀우 λ³΅μž‘μŠ€λŸ¬μ›€

  • μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ“°λ©΄ 깔끔해진닀

      // μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ“΄ 경우
      interface personAge {
          age: number;
      }
    
      function logAge(obj: personAge) {
          console.log(obj.age);
      }
      let person = { name: 'Capt', age: 28 };
      logAge(person); //
    
  • νƒ€μž… 슀크립트 μΈν„°νŽ˜μ΄μŠ€ νŠΉμ§•

    • 인자둜 λ°›λŠ” 객체의 속성 κ°œμˆ˜μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 속성 개수λ₯Ό μΌμΉ˜μ‹œν‚€μ§€ μ•Šμ•„λ„ λœλ‹€
    • μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–Έλœ μ†μ„±μ˜ μˆœμ„œλ₯Ό μ§€ν‚€μ§€ μ•Šμ•„λ„ 상관없닀

μΈν„°νŽ˜μ΄μŠ€μ˜ 속성

μ˜΅μ…˜μ†μ„±

  • λ°›λŠ” κ²½μš°λŠ” μ†μ„±μ˜ 개수λ₯Ό μΌμΉ˜μ‹œν‚€μ§€ μ•Šμ•„λ„ λœλ‹€κ³  ν–ˆλ‹€

  • ν•˜μ§€λ§Œ λ³΄λ‚΄λŠ” 경우(ν˜ΈμΆœν•˜λŠ”κ²½μš°) λ°˜λ“œμ‹œ μ†μ„±μ˜ κ°œμˆ˜μ™€ νƒ€μž…μ„ λ§žμΆ°μ•Ό ν•˜λŠ”λ°

  • μ˜΅μ…˜μ†μ„±μ„ μ΄μš©ν•΄μ„œ νŠΉμ • 속성을 ν•„μˆ˜κ°€ μ•„λ‹ˆκ²Œ μ§€μ •ν• μˆ˜ μžˆλ‹€

  • μ†μ„±μ˜ 끝에 ?λ₯Ό 뢙이면 μ‚¬μš©ν• μˆ˜ μžˆλ‹€

      // μ˜΅μ…˜μ†μ„± μ‚¬μš©
      interface CraftBeer {
          name: string;
          hop?: number;  
      }
    
       let myBeer = {
           name: 'Saporo'
       };
      function brewBeer(beer: CraftBeer) {
          console.log(beer.name); // Saporo
      }
      brewBeer(myBeer); //호좜
    

μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž…μ²΄ν‚Ή

  • μΈν„°νŽ˜μ΄μŠ€μ— μ •μ˜λ˜μ–΄μžˆμ§€ μ•Šμ€ 속성을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄!

              interface CraftBeer {
                      brand?: string;
              }
    
              function brewBeer(beer: CraftBeer) {
                      // ..
              }
    
              let myBeer = { brandon: 'what' }';
              brewBeer(myBeer as CraftBeer);
    
  • λ§Œμ•½ μ˜ν•˜μ§€ μ•Šμ€ 속성듀을 μΆ”κ°€λ‘œ μ‚¬μš©ν•˜κ³  싢을 λ•ŒλŠ” μ•„λž˜μ˜ 방법을 μ‚¬μš©ν•œλ‹€

              interface CraftBeer {
              brand?: string;
              [propName: string]: any;
              }
    

ν•¨μˆ˜ νƒ€μž…

  • μΈν„°νŽ˜μ΄μŠ€λŠ” ν•¨μˆ˜μ˜ νƒ€μž…μ„ μ •μ˜ν•  λ•Œμ—λ„ μ‚¬μš©ν•  수 μžˆλ‹€

  • ν•¨μˆ˜μ˜ 인자의 νƒ€μž…κ³Ό λ°˜ν™˜ κ°’μ˜ νƒ€μž…μ„ μ •μ˜ν•œλ‹€

              interface login {
                      (username: string, password: string): boolean;
              }
      
              let loginUser: login;
                      loginUser = function(id: string, pw: string) {
                      console.log('둜그인 ν–ˆμŠ΅λ‹ˆλ‹€');
                      return true;
              }
    

클래슀 νƒ€μž…

  • ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν΄λž˜μŠ€κ°€ 일정 쑰건을 λ§Œμ‘±ν•˜λ„λ‘ νƒ€μž… κ·œμΉ™μ„ μ •ν•  수 μžˆλ‹€

              interface CraftBeer {
                       beerName: string;
              nameBeer(beer: string): void;
              }
    
              class myBeer implements CraftBeer {
                      beerName: string = 'Baby Guinness';
                      nameBeer(b: string) {
              this.beerName = b;
              }
              constructor() {}
              }
    

μΈν„°νŽ˜μ΄μŠ€ ν™•μž₯

  • νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” μ—¬λŸ¬ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속받아 μ‚¬μš©ν•  수 μžˆλ‹€

      interface Person{
              name: String;
      }
    
      interface Developer extends Person, Drinker{
              skill: string;
      }
    
      interface Drinker {
              drink: string;
      }
    
      let fe = {} as Developer;
      fe.name = 'josh';
      fe.skill = 'typeScript';
      fe.drink = 'Beer';
    
      console.log("ν™•μΈν•΄λ³Όκ²Œμš”: " + fe.drink);
    

ν•˜μ΄λΈŒλ¦¬λ“œ νƒ€μž…

  • μΈν„°νŽ˜μ΄μŠ€ μ—­μ‹œ μ—¬λŸ¬ κ°€μ§€ νƒ€μž…μ„ μ‘°ν•©ν•˜μ—¬ λ§Œλ“€ 수 μžˆλ‹€

  • μ•„λž˜λŠ” ν•¨μˆ˜ νƒ€μž…μ΄λ©΄μ„œ 객체 νƒ€μž…μ„ μ •μ˜ν•  수 μžˆλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³  μžˆλ‹€

              interface CraftBeer {
                      (beer: string): string;
              brand: string;
              brew(): void;
              }
    
              function myBeer(): CraftBeer {
                      let my = (function(beer: string) {}) as CraftBeer;
                       my.brand = 'Beer Kitchen';
              my.brew = function() {};
              return my;
              }
    
              let brewedBeer = myBeer();
              brewedBeer('My First Beer');
              brewedBeer.brand = 'Pangyo Craft';
              brewedBeer.brew();
    

Type Script

νƒ€μž…μŠ€ν¬λ¦½νŠΈλ‘œ λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ™€ 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ— νƒ€μž…μ„ μ •μ˜ν•  수 μžˆλ‹€

  • μ‚¬μš©λ°©λ²•
    • λ³€μˆ˜λͺ…: νƒ€μž…
    • νƒ€μž… ν‘œκΈ°(Type Annotation)라고 ν•œλ‹€

[λ³€μˆ˜]

String

let str: string = 'hi';

Number

let num: number = 10;

Boolean

let isLoggedIn: boolean = false;

Array

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

Tuple

νŠœν”Œμ€ λ°°μ—΄μ˜ 길이가 κ³ μ •λ˜κ³  각 μš”μ†Œμ˜ νƒ€μž…μ΄ μ§€μ •λ˜μ–΄ μžˆλŠ” λ°°μ—΄ ν˜•μ‹μ„ μ˜λ―Έν•œλ‹€

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

λ§Œμ•½ μ •μ˜ν•˜μ§€ μ•Šμ€ νƒ€μž…, 인덱슀둜 μ ‘κ·Όν•  경우 였λ₯˜κ°€ λ°œμƒλ¨

arr[1].concat('!'); // Error, 'number' does not have 'concat'
arr[5] = 'hello'; // Error, Property '5' does not exist on type '[string, number]'.

Any

λͺ¨λ“  νƒ€μž…μ—μ„œ ν—ˆμš©λœλ‹€

let str: any = 'hi';
let num: any = 10;
let arr: any = ['a', 2, true];

Void

λ³€μˆ˜μ—λŠ” undefined와 null만 ν• λ‹Ήν•˜κ³ , ν•¨μˆ˜μ—λŠ” λ°˜ν™˜ 값을 μ„€μ •ν• μˆ˜ μ—†λŠ” νƒ€μž…μ„ μ§€μ •ν•œλ‹€

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

[ν•¨μˆ˜]


크게 3κ°€μ§€ νƒ€μž…μ„ μ •μ˜ν•  수 μžˆλ‹€

  • ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°(λ§€κ°œλ³€μˆ˜)νƒ€μž…
  • ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…
  • ν•¨μˆ˜μ˜ ꡬ쑰 νƒ€μž…

κΈ°λ³Έ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ EX

function sum(a, b) {
  return a + b;
}

νƒ€μž… 슀크립트λ₯Ό μ μš©ν•œ 이후

function sum(a: number, b: number): number {
  return a + b; //ν•¨μˆ˜μ˜ λ°˜ν™˜ 값에 νƒ€μž… μΆ”κ°€
}
  • ν•¨μˆ˜μ˜ λ°˜ν™˜ 값에 νƒ€μž…μ„ μ •ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” void라도 μ‚¬μš©ν•œλ‹€

ν•¨μˆ˜μ˜ 인자

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν•¨μˆ˜μ˜ 인자λ₯Ό λͺ¨λ‘ ν•„μˆ˜ κ°’μœΌλ‘œ κ°„μ£Όν•œλ‹€
λ”°λΌμ„œ ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ„€μ •ν•˜λ©΄ undefined λ‚˜ null 이라도 인자둜 λ„˜κ²¨μ•Όν•˜λ©°
μ»΄νŒŒμΌλŸ¬μ—μ„œ μ •μ˜λœ λ§€κ°œλ³€μˆ˜ 값이 λ„˜μ–΄μ™”λŠ”μ§€ ν™•μΈν•œλ‹€
μ •μ˜λœ λ§€κ°œλ³€μˆ˜κ°’λ§Œ λ°›μ„μˆ˜ 있고 μΆ”κ°€λ‘œ 인자λ₯Ό λ°›μ„μˆ˜ μ—†λ‹€

function sum(a: number, b: number): number {
  return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // μ—λŸ¬, μ§€μ •λœ λ§€κ°œλ³€μˆ˜κ°’μ„ λ„˜μŒ
sum(10); // μ—λŸ¬, μ§€μ •λœ λ§€κ°œλ³€μˆ˜κ°’ 보닀 적음

μœ„μ˜ μ–˜κΈ°λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 본래 νŠΉμ„±κ³Ό λ°˜λŒ€λœλ‹€
ν•˜μ§€λ§Œ λ§€κ°œλ³€μˆ˜μ˜ 갯수 만큼 인자λ₯Ό λ„˜κΈ°μ§€ μ•Šμ•„λ„ λ˜λŠ” νŠΉμ„±μ„ μ΄μš©ν•˜κ³  μ‹Άλ‹€λ©΄
? λ₯Ό μ΄μš©ν•΄μ„œ μ•„λž˜μ™€ 같이 μ •μ˜ν•  수 μžˆλ‹€

function sum(a: number, b?: number): number {
  return a + b;
}
sum(10, 20); // 30
sum(10, 20, 30); // error, too many parameters
sum(10); // 10

ν•¨μˆ˜μ—μ„œ λ°”λ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄

function sum(a: number, b = '100'): number {
 return a + b;
} 
sum(10, undefined); // 110
sum(10); // 110

About

πŸ’Ύ μ„ μ•„ repository

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published