Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

34 Commits

Folders and files

NameName
Last commit message
Last commit date
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

νƒ€μž…μŠ€ν¬λ¦½νŠΈ μš”μ•½

    Microsoft C#,  Angular μ‚¬μš©μ— κ°œλ°œμžκ°€ λ§Œλ“¬

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ˜ μž₯점

 API
   1-1. μ•ˆμ“Έκ²½μš° api μ—μ„œ 데이터 처리 ν• λ•Œ , μ–΄λŠκ²Œ λ“€μ–΄μ˜¬μ§€ μ˜ˆμƒμ„ λͺ»ν•œλ‹€. ide μ—μ„œ 좔적을 λͺ»ν•œλ‹€. μ˜€νƒ€ λ°©μ§€ λΆˆκ°€λŠ₯
   1-2. api의 데이터λ₯Ό 예츑 ν•  수 μžˆμ–΄μ„œ Good!
   
   2. Function
   2-1. ν•¨μˆ˜μ˜ 인자λ₯Ό 잘λͺ» λ„£λŠ” μ‹€μˆ˜λ₯Ό λ°©μ§€κ°€ κ°€λŠ₯ν•˜λ‹€
   2-2. ν•¨μˆ˜ κ²°κ³Όκ°’μ˜ ν˜• νƒ€μž…μ„ μ•Œμ•„μ„œ ν”„λ‘œν†  νƒ€μž… λ©”μ„œλ“œλ₯Ό ν™œμš© ν• μˆ˜ μžˆλ‹€

   3. dynamically Typed => stataically typed
   3-1. μ»΄νŒŒμΌμ‹œ νƒ€μž…μ„ κ²°μ •ν•΄ μ‹€μˆ˜λ₯Ό 쀄인닀
   3-2. λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ—μ„œ μ•ˆμ •μ„±μ„ 높일 수 μžˆλ‹€
   
   4. OOP μ‚¬μš©κ°€λŠ₯(extends, implements, interface)
   5. module 지원

νƒ€μž…μŠ€ν¬λ¦½νŠΈ ν™˜κ²½ μ„€μ • 및 μ‹€ν–‰ 방법

    2-1. μš°μ„  node λ₯Ό μ„€μΉ˜ν•˜μž( node ver > 10, npm version)
    2-2. npm i -g typescript (κΈ€λ‘œλ²Œ μ„€μΉ˜, μ–΄λ””μ—μ„œλ‚˜ μ‹€ν–‰ν• μˆ˜μžˆκ²Œμ„€μ •)
    2-3. tsc 파일λͺ… (파일 컴파일)
    2-4. tsc --init (tsconfig.json) μ„€μ •νŒŒμΌμ„ κΈ°μ€€μœΌλ‘œ 컴파일 ν•œλ‹€(μˆ˜λ™ μƒμ„±μ‹œ λ¬Έμ œμƒκΉ€)
    2-5. tsc --project (tsconfig.json μˆ˜λ™μœΌλ‘œ μ„€μΉ˜μ‹œ μ΄λ ‡κ²Œν•΄μ•Όμ μš©λœλ‹€..)
    2-6. tsc *.ts --watch (전체 파일 watch)                                                ㅏ
    2-7. sourceMap : js 둜 λΉŒλ“œλœ νŒŒμΌμ„ λ””λ²„κ·Έμ‹œ μž‘κ³ μ‹Άμ„λ•Œ μ‚¬μš©ν•˜λŠ” 것, js typescript λ₯Ό μ—°κ²°ν•΄μ£ΌλŠ” 맡이닀 

λ³€μˆ˜μ™€ ν•¨μˆ˜ νƒ€μž… μ •μ˜

    !!μ°¨ν›„ λ³€μˆ˜μ— 값을 μΆ”κ°€λ‘œ μ§€μ •ν• λ•Œ μ§€μ •λœ νƒ€μž…λ§Œ μΆ”κ°€ ν•  수 μžˆλ‹€.

    λ¬Έμžμ—΄
    let str: string
    
    숫자 
    let num: number
    
    λΆˆλ¦¬μ–Έ
    let bool: boolean
    
    λ°°μ—΄ 
     : μ–΄λ–€ νƒ€μž…μœΌλ‘œλ§Œ 배열이 생성될것인지 결정함
    let numberArr: number[]
    let numberGenericArr: Array<Number>
   
    let strArr: string[]
    let objectArr: object[]
    
    νŠœν”Œ
      : 각 배열을 λ‹€λ₯Έ νƒ€μž…λ“€μ„ μ„žμ–΄μ„œ 각 μΈλ±μŠ€μ— μ •μ˜ν•΄μ„œ μ‚¬μš©(인덱슀 μ΄ˆκ³Όμ‹œ λΈ”κ°€λŠ₯)
    
    let person: [string, number] = ["jin", 20]
    let state: [any, function] // λ¦¬μ•‘νŠΈ useState κ°€ νŠœν”Œ μ‚¬μš©  
    
    객체
      : 객체 μ•ˆ ν‚€ 값을 μ§€μ •ν•˜κ³ , ν‚€ κ°’μ˜ νƒ€μž…μ„ μ§€μ •ν•΄μ•Όν•œλ‹€
    
    let personObj: { name: string, age: number, isAudult: boolean} = { name: 'jin', age: 20, isAudult:true }

μ œλ„€λ¦­

   // 1. μ‚¬μš©λ°©λ²• μ‚¬μš©λ°©λ²• ν•¨μˆ˜μ— <T>라고 λ„£κ³  μ‚¬μš©ν•˜κ³  싢은 νƒ€μž… λ°˜ν™˜κ°’ or μΈμžμ— λ„£μ–΄μ„œ ν™œμš© λœλ‹€
  // 2. μž₯점
  // 2-1 λ°˜ν™˜κ°’μ— νƒ€μž…μ„ μ œλ„€λ¦­ μ„ μ–Έλœκ±Έ μ‚¬μš© ν•˜λ©΄ μ–΄λŠ μΈμžλ“  μ£Όμž…ν•œ μ œλ„€λ¦­ νƒ€μž…μ— μ˜ν•΄ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€(μž¬ν™œμš©μ΄ μ’‹λ‹€) πŸ‘
  // : μ—†μ„κ²½μš° μœ λ‹ˆμ˜¨ νƒ€μž…κ°’μ΄ λ°˜ν™˜κ°’μ΄ μ–΄μ •μ©‘ν• λ•Œ μ½”λ“œμ˜ μˆ˜κ³ λŸ‰μ΄ λ“€μ–΄κ°„λ‹€. νƒ€μž…μ²΄ν¬λ₯Ό ν•΄μ•Όλ˜μ„œ
  // 	: μ•„λ‹ˆλ©΄ 각 λ§žλŠ” ν•¨μˆ˜λ₯Ό μƒμ„±ν•΄μ•Όν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ μ‘΄μž¬ν•œλ‹€
  function logText<T>(text: T): T {
  	console.log(text)
  	return text;
  }
  // λ°˜ν™˜κ°’μ„ ν‘œκΈ°ν•˜κΈ°μ— λ°˜ν™˜κ°’μ˜ νƒ€μž…μ˜ 닀양성을 μ •ν™•νžˆ μΆ”λ‘ ν• μˆ˜μžˆλ‹€
  logText(10).toLocaleString();
  logText<string>('hello').split('')


    //2-2 같은 λͺ¨μ–‘μ˜ μΈν„°νŽ˜μ΄μŠ€μ— νƒ€μž…μ„ κΈ°μž…ν•΄ μž¬μ‚¬μš© κ°€λŠ₯ν•˜λ‹€ πŸ‘
    interface DropdownItem<T> {
			value: T;
			selected: boolean;
		}

  const emails: DropdownItem<string>[] = [
	{value: 'naver.com', selected: true},
	{value: 'gmail.com', selected: false},
	{value: 'hanmail.net', selected: false},
  ];

  const numberOfProducts: Array<DropdownItem<number>> = [
  	{value: 1, selected: true},
  	{value: 2, selected: false},
    {value: 3, selected: false},
  ];

// ν•¨μˆ˜μ—μ„œ 넣은 T λ₯Ό 인자의 νƒ€μž… μΈν„°νŽ˜μ΄μŠ€, 배열에도 적용 κ°€λŠ₯ν•˜λ‹€
    function createDropdownItem<T>(item: DropdownItem<T>) {
	// function logTextLength<T>(text: T[]) T[] : 단점이 μ œλ„€λ¦­μœΌλ‘œ μ„ μ–Έλœ λ°°μ—΄ μ•„μ΄ν…œμ˜ 인자λ₯Ό λͺ¨λ₯Έλ‹€. κ·Έλž˜μ„œ μ‚¬μš©ν•˜κΈ°μ–΄λ ΅λ‹€
	// 3. μΆ”κ°€ κΈ°λŠ₯
	// 3-1 ν™•μž₯자 κΈ°λŠ₯(<T extends { length: number }>
    // : μ°¨μž…μ„ λͺ¨λ₯΄λ‹ˆ ν•¨μˆ˜μ•ˆμ—μ„œ ν™œμš©μ„±μ΄ λ–¨μ–΄μ§ˆμˆ˜ 밖에 μ—†λ‹€.
    // : ν™•μž₯을 ν•˜λ©΄μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν• λ•Œ μ œν•œμ μΌμˆ˜λ°–μ— μ—†λ‹€(ν™•μž₯쑰건에 좩쑱이 λ˜μ–΄μ•Όν•œλ‹€)
	interface LengthType {
		length: number;
	}

	function logTextLength<T extentds LengthType>(text: T): void {
		console.log(text.length)
	}

	// length λΌλŠ” ν”„λ‘œνΌν‹°λ₯Ό μΆ©μ’…ν•˜κΈ° μœ„ν•΄ 값이 μ œν•œλœλ‹€
	logTextLength(10); // ❌ μˆ«μžμ—΄ 10은 length λΌλŠ” μˆ«μžνƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ œκ³΅ν•˜μ§€ μ•ŠλŠ”λ‹€
	logTextLength({leng: '1'}); //❌ μ •ν™•νžˆ objectμ•ˆμ— length λΌλŠ” 킀값에 number νƒ€μž…μ΄ λ“€μ–΄μ™€μ•Όλœλ‹€
	logTextLength({length: 1});
	logTextLength('hello world');
	logTextLength([1,2,3]);

	// 3-2: keyof νƒ€μž… μ œν•œ
	interface ShoppingItem {
		name: string;
		price: number;
		stock: number;
	}

	// ꡳ이 λ§Œλ“  μ–΅μ§€ μ˜ˆμ œλŒ€, μ œλ„€λ¦­μ— ν‚€λ₯Ό ν™•μž₯μ—μ„œ itemOption 의 ν‚€ 값을 μ œν•œμ„ 쀬닀. κ·Έλž˜μ„œ μ΄λ„˜μ²˜λŸΌ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€? λ”±νžˆ ν•„μš”μ„±μ€ λͺ¨λ₯΄κ²Ÿλ‹€  
	function getShoppingFindItemOption<T extends keyof ShoppingItem>(id: number, itemOption: T): undefined | ShoppingItem[T] {
		const items: ShoppingItem[] = [
			{ id: 1, stock: 1, price: 10, name: "watch"}, {id: 2, stock: 2, price: 20, name: "book"}
		]

		const filterItem = items.filter(i => i.id === id)

		return filterItem[0][itemOption];
	};

νƒ€μž… μΆ”λ‘ 

    let a; // any 
    let hello = "hello" // string
    hello = 10 // X μΆ”λ‘ μœΌλ‘œ 이미 μ„ μ–Έλ˜μ„œ λ°”κΏ€ 수 μ—†λ‹€

    function getB(b = 10) {      // νƒ€μž…κ³Ό νƒ€μž…μ΄ λ§Œλ‚ κ²½μš°λ„ μΆ”λ‘ ν•΄μ€€λ‹€!!
    	let c = 'hi'; // string μΆ”λ‘ 
    
	// 기본값을 λ„£μœΌλ©΄ κΈ°λ³Έκ°’μœΌλ‘œ μΆ”λ‘ λ˜κ³  νƒ€μž…λΌλ¦¬ μΆ©λŒν•  경우
	// Best Common type (νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ•Œκ³ λ₯΄μ¦˜) 기반으둜 μΆ”λ‘ ν•΄μ€€λ‹€ 
	// string + number = string 이기에 μΆ”λ‘ ν–ˆλ‹€
	  return b + c;
    }

// νƒ€μž… μΆ”λ‘  κΈ°λ³Έ 3
interface DropDown<T> {
	value: T;
	title: string;
}

interface DetailedDropdown<K> extends Dropdown<K> {
	description: string;
	tag: K
}

// μ œλ„€λ¦­λ„ νƒ€μž…μ΄ μƒμ†κΉŒμ§€ν•΄μ„œ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€μ—λ„ μ—°μ†λœλ‹€ => 좔둠이 μž˜λ˜μ„œ νŽΈλ¦¬ν•˜λ‹€
const detailedItem: DetailedDropdown<string> = {
	description: "",
	tag: "",
	value: "",
	title: "abc"
}

νƒ€μž… 단언

    // νƒ€μž… 단언(type assertion)
    // νƒ€μž…μ΄ μ •ν™•ν•˜λ‹€κ³  κ°œλ°œμžκ°€ μ„ μ–Έν•˜λŠ”κ²ƒμ΄λ‹€
	// as [Type]
    var a;
    a = 20;
    a = 'a';

    // var b = a νƒ€μž…μŠ€ν¬λ¦½νŠΈκ°€ μΆ”λ‘ ν• μˆ˜μ—†λ‹€ any , number string μˆ˜μ‹œλ‘œ λ°”λ€ŒκΈ°λ•Œλ¬Έμ—
    var b = a as string // κ°œλ°œμžκ°€ μΆ”λ‘ ν•΄μ€˜μ„œ string 으둜 μ„ μ–Έ ν• μˆ˜ μž‡λ‹€

    // DOM API μ‘°μž‘
    // <div id="app">hi</div>

    var div = document.querySelector('div');  // HTMLDivElement 라고 μΆ”μ •ν•΄μ€€λ‹€
    if (div) { // 쑴재 유무λ₯Ό 체크 ν•΄μ•Ό ν•œλ‹€
    	div.innerText
    }

νƒ€μž… κ°€λ“œ

  // μœ λ‹ˆμ˜¨ νƒ€μž…μΌ 경우 κ³΅ν†΅λœ λΆ€λΆ„ μ™Έμ—λŠ” μ‰½κ²Œ μ‚¬μš©ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€
  // 이 μƒν™©μΌλ•ŒλŠ” λŒ€λΉ„ν•΄μ„œ νƒ€μž… κ°€λ“œ ν˜•μ‹μœΌλ‘œ μ‰½κ²Œ μ„ μ–Έ ν•  수 μžˆλ‹€
  // νƒ€μž… κ°€λ“œ ν•¨μˆ˜μ—†μ΄λŠ” if νƒ€μž… 단언을 ν™œμš©ν•΄μ„œ μ„ μ–Έ ν•  수 μžˆλ‹€

  if ((tony as Developer).skill) {
    const skill = (tony as Developer).skill;
  } else if ((tony as Person).age) {
    const age = (tony as Person).age;
  }

  // νƒ€μž… κ°€λ“œ ν•¨μˆ˜λŠ”  주둜 is + λͺ…사 ν•¨μˆ˜λͺ…μœΌλ‘œ λ§Œλ“ λ‹€, ν•¨μˆ˜ 리턴 νƒ€μž…μ— is 라고 μ„ μ–Έν•œλ‹€
  function isDeveloper(target: Person | Developer): target is Developer {
    return (target as Developer).skill !== undefined;
  }

  // νƒ€μž… κ°€λ“œλ‘œ 인해 μ΄μš©ν•΄ μ‰½κ²Œ ν™œμš© κ°€λŠ₯ ν•˜λ‹€.
  if (isDeveloper(tony)) {
    tony.skill;
  } else {
    tony.age;
  }

νƒ€μž… ν˜Έν™˜

νƒ€μž… ν˜Έν™˜μ΄λž€ νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ—μ„œ νŠΉμ • νƒ€μž…μ΄ λ‹€λ₯Έ νƒ€μž…μ— 잘 λ§žλŠ”μ§€λ₯Ό μ˜λ―Έν•œλ‹€.

 // μΈν„°νŽ˜μ΄μŠ€, class, function, generic λ‹€ νƒ€μž… ν˜Έν™˜μ΄ μž˜λ˜λŠ”μ§€ ν™•μΈν•œλ‹€
 // 이미 선언함 λ³€μˆ˜μ— μž¬μ„ μ–Έν• λ•Œ νƒ€μž… λ²”μœ„μ— λ”°λΌμ„œ κ²°μ • ν•œλ‹€ 

 // μΈν„°νŽ˜μ΄μŠ€, 클래슀일경우 μ„ μ–Έλœ ν”„λ‘œνΌν‹°μ˜ λ²”μœ„
 
  // μΈν„°νŽ˜μ΄μŠ€
  interface Developer {
   name: string;
   skill: string;
  }

  interface Person {
    name: string;
  }
  
  class Person {
    name: string;
  }

  let developer: Developer;
  let person: Person;

  // developer = person // 인간은 개발자λ₯Ό μΆ©μ‘±μ‹œν‚¬μˆ˜μ—†λ‹€
  person = developer // κ°œλ°œμžλŠ” μΈκ°„μ˜ ν•„μš”μ‘°κ±΄μ„ μΆ©μ‘± ν•  수 μžˆλ‹€

  // ν•¨μˆ˜μΌ 경우 인자 및 리턴 κ°’
  // 리턴 νƒ€μž…μ΄μ—¬λ„ ν•΄λ‹Ήλ˜λŠ”μ§€ 체크 ν•΄μ•Όν•œλ‹€
  let add = (a: number) => {}
  let sum = (a: number, b: number) => {}
  
  // add = sum // ν•¨μˆ˜μ˜ μΈμžνƒ€μž…λ„ λΉ„κ΅λœλ‹€
  sum = add; // ν¬ν•¨κ΄€κ³„λ‘œ λΉ„κ΅λœλ‹€

  // μ œλ„€λ¦­μΌ κ²½μš°λŠ” ν™œμš©λ˜μ„œ λ¦¬ν„΄λ˜λŠ” κ°’μ˜ λ²”μœ„
  // 거의 μ•ˆλ˜λŠ” κ±° κ°™μŒ νƒ€μž…μ΄ μ„ μ–Έν• λ•ŒλΆ€ν„° λ‹€λ₯΄λ‹ˆ ν˜Έν™˜ μžμ²΄κ°€ 뢈 κ°€λŠ₯
  interface Empty<T> {}

  let empty1: Empty<string>;
  let empty2: Empty<number>;

  interface NotEmpty<T> {
    Data: T
  } 

  let notEmpty1: NotEmpty<string>
  let notEmpty2: NotEmpty<number>

  // number != string
  notEmpty1 = notEmpty2
  notEmpty2 = notEmpty1

μœ ν‹Έλ¦¬ν‹° νƒ€μž…

μœ ν‹Έλ¦¬ν‹° νƒ€μž…μ€ 이미 μ •μ˜ν•΄ 놓은 νƒ€μž…μ„ λ³€ν™˜ν• λ•Œ μ‚¬μš©ν•˜κΈ° 쒋은 νƒ€μž… 문법

  • Partial: νŠΉμ • νƒ€μž… λΆ€λΆ„ μ§‘ν•©(map)
interface Product {
  id: number;
  name: string;
  price: number;
  brand: string;
  stock: number;
  some?: any;
}

// μœ„μ— μƒν’ˆ μΈν„°νŽ˜μ΄μŠ€μ™€ μ€‘λ³΅λœλ‹€. λΆˆν•„μš”ν•˜κ²Œ λ‚­λΉ„κ°€ μ‹¬ν•˜λ‹€
interface ProductDetail {
	id: number;name: string;price: number;
}

// function displayProductDetail(shoppingItem: ProductDetail) {}

// μ‰½κ²Œ μž¬ν™œμš© κ°€λŠ₯ν•˜λ‹€, μ›ν•œλŠ” ν•„λ“œκ°’λ§Œ 선택 ν•  수 μžˆλ‹€
type ShoppingItem = Pick<Product, 'id' | 'name' | 'price'>

function displayProductDetail(shoppingItem: ShoppingItem) {
	const { name, price, id } = shoppingItem
}

Omit νŠΉμ •ν•œ ν”„λ‘œνΌν‹°λ§Œ μ œμ™Έν•˜κ³  μž…λ ₯ν•˜λŠ” ν•¨μˆ˜

Pick νŠΉμ •ν•œ ν”„λ‘œνΌν‹°λ§Œ μ„ νƒν•˜λŠ” ν•¨μˆ˜

Partial 직접 κ΅¬ν˜„ν•˜κΈ°

// # 1 직접 일일이 κ΅¬ν˜„
type UserProfileUpdate1 = {
	username?: UserProfile['username'];
	email?: UserProfile['email'];
	profilePhotoUrl?: UserProfile['profilePhotoUrl']
}

// # 2 ν‚€ 값을 λ°°μ—΄λ‘œ λ§Œλ“€μ–΄μ€Œ, [선택값(p) in 전체 객체 key κ°’]?: νƒ€μž…[선택값[P]]
type UserProfileUpdate2 = {
	[p in 'username' | 'email' | 'profilePhotoUrl' ]? : UserProfile[p]
}

// νƒ€μž…μ˜ ν‚€λ§Œ λΉΌμ„œ μ‚¬μš©ν• μˆ˜μž‡μ—‡μ§€ => ν‚€λ§Œ 쏙쏙 λΊ„μˆ˜μžˆλŠ” μž₯점
type UserProfileKeys = keyof UserProfile

// # 3 [선택값(p) in νƒ€μž…μ˜ Key의 μ§‘ν•©]?: νƒ€μž…[선택값]
type UserProfileUpdate3 = {
	[p in keyof  UserProfile]?: UserProfile[p]
}

// # 4 μ œλ„€λ¦­μœΌλ‘œ type을 μœ λ™μ μœΌλ‘œ λ°›μ„μˆ˜μžˆκ³  μ–Έμ œλ“ μ§€ ν™œμš©κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ°
type Subset<T> = {
	[p in keyof T]?: T[p];
}

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages