νμ
μ€ν¬λ¦½νΈ μμ½
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 ] ;
}