πŸ‘‹ λ‚΄κ°€ μ •λ¦¬ν•˜λŠ” TypeScript κΈ°λ³Έ 문법

κΉ€μ² μ€€Β·2022λ…„ 2μ›” 21일
0

TypeScript

λͺ©λ‘ 보기
1/3

ν¬μŠ€νŒ… μ™„λ£Œ μƒνƒœ : false

μž‘μ„± 쀑..

πŸ“² Configuration

Typescriptλ₯Ό μ‹€ν–‰ν•˜κΈ°μ— μ•žμ„œ ν™˜κ²½μ„€μ •ν•  뢀뢄은 λ‹€μŒκ³Ό κ°™λ‹€.

  • typescript의 file extension은 .ts이닀.
    index.ts

  • Typescript option 섀정은 tsconfig.jsonμ—μ„œ μ„€μ •ν•œλ‹€

  • ν”„λ‘œμ νŠΈ 폴더에 tsc --init λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ tsconfig.json에 λͺ¨λ“  컴파일러 μ˜΅μ…˜μ΄ 있으며 λŒ€λΆ€λΆ„ 주석 μ²˜λ¦¬κ°€ λ˜μžˆλ‹€.
    (ν•„μš”ν•œ 뢀뢄은 주석을 ν•΄μ œν•΄μ„œ μ“°λ©΄ 됨.)

  • watch modeλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ λͺ…λ Ήμ–΄λ‘œ tsc μž…λ ₯

options

  • "noEmitOnError": true => μ—λŸ¬κ°€ 났을 λ•Œ 컴파일 해주지 μ•Šκ²Œ ν•˜λŠ” μ˜΅μ…˜

  • "watch": true => tsμ—μ„œ λ³€κ²½ν•œ 사항듀을 μ¦‰κ°μ μœΌλ‘œ js둜 컴파일 ν•΄μ£ΌλŠ” μ˜΅μ…˜

  • "target":"ECMA version" => 컴파일될 ECMA Script Version을 μ§€μ •ν•΄μ£ΌλŠ” μ˜΅μ…˜

  • "outDir" : "folder" => 컴파일 될 νŒŒμΌλ“€μ„ 지정할 폴더

⭐️ Typescript νŠΉμ„±

  • λ³€μˆ˜ 및 λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ 지정할 수 μžˆλ‹€.

  • TypeScriptλŠ” λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ νƒ€μž…μ„ μœ μΆ”ν•˜μ—¬ νƒ€μž…μ„ μ§€μ •ν•œλ‹€.

λ”°λΌμ„œ μœ μΆ”κ°€λŠ₯ν•œ 데이터 νƒ€μž…μ΄λΌλ©΄ λͺ…μ‹œμ μœΌλ‘œ νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

  • ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜μ™€ λ°˜ν™˜κ°’μ˜ νƒ€μž… 지정
function taxcount(state: string, income: number, dependent: number): number {
  if (state === "seoul") return income * 0.06 - dependent * 500;
  if (state === "busan") return income * 0.05 - dependent * 500;
}

λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž… 지정 μœ„μΉ˜ : λ§€κ°œλ³€μˆ˜ 뒀에 :type

λ°˜ν™˜κ°’μ˜ νƒ€μž… 지정 μœ„μΉ˜ : λ§€κ°œλ³€μˆ˜ λ„£λŠ”μžλ¦¬μ™€ μ½”λ“œλΈ”λŸ­ 사이에 λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ 지정해쀀닀.

  • TypeScriptμ—μ„œ μ΄ˆκΉƒκ°’μ—†μ΄ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ any Type으둜 μœ μΆ”ν•œλ‹€.

πŸ“š Type

void

값을 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ”λ° μ‚¬μš©λœλ‹€.

ν•¨μˆ˜μ— void νƒ€μž…μ„ μ„ μ–Έν•˜λ©΄ 싀행은 λ˜μ§€λ§Œ λ°˜ν™˜ν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

!
μžλ°”μŠ€ν¬λ¦½νŠΈ ν•¨μˆ˜λŠ” λŸ°νƒ€μž„ 쀑에 ν•¨μˆ˜ 본문에 return문이 μ—†λŠ” 경우 ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ undefined λ°˜ν™˜ν•œλ‹€.

ν•˜μ§€λ§Œ voidνƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ 이와 같은 μ‹€μˆ˜λ₯Ό 방지할 수 μžˆλ‹€.

never

μ ˆλŒ€ λ°˜ν™˜μ„ ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μ— μ‚¬μš©ν•œλ‹€.

μ ˆλŒ€λ‘œ 싀행이 μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜λ‚˜ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€κΈ° μœ„ν•΄μ„œλ§Œ μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό 예λ₯Ό λ“€ 수 μžˆλ‹€.

μ ˆλŒ€λ‘œ 싀행이 μ’…λ£Œλ˜μ§€ μ•ŠλŠ” ν•¨μˆ˜ ex) stateκ°’μœΌλ‘œ μΈν•œ λ¬΄ν•œ λ¦¬λ Œλ”λ§

never type으둜 μ„ μ–Έν•œ ν•¨μˆ˜λŠ” end pointκ°€ μžˆλŠ” 즉, 끝날 수 μžˆλŠ” ν•¨μˆ˜λŠ” μ—λŸ¬κ°€ λ‚œλ‹€.

  • ν™”μ‚΄ν‘œ ν•¨μˆ˜λŠ” never type을 λ°˜ν™˜ν•œλ‹€.

  • neverλŠ” μ–΄λ–€ νƒ€μž…κ³Όλ„ ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” νƒ€μž…μœΌλ‘œ λ…Όλ¦¬μ μœΌλ‘œ λκΉŒμ§€ 싀행될 수 μ—†λŠ” ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ never이 λœλ‹€.

const logger = () => {
while(true){
	console.log('μ„œλ²„κ°€ μ‹€ν–‰ 쀑 μž…λ‹ˆλ‹€.')
}
}

function padLeft(value:string,padding:string|number) : string{
if(typeof padding === "number") { 
  returnArray(padding+1).join("") + value
}
  if(typeof padding === "string") {
   return padding + value
  }
}

else return padding // padding값은 λ‚˜μ˜¬ 상황이 μ—†λ‹€. 즉, else 블둝은 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.


any

number,string,boolean,custom type을 ν• λ‹Ήν•  수 μžˆλ‹€.
κ·ΈλŸ¬λ‚˜ νƒ€μž… 체크의 μž₯점을 μžƒκ³  μ½”λ“œμ˜ 가독성도 λ–¨μ–΄μ§ˆ 수 μžˆμ–΄ λ˜λ„λ‘ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

μ»€μŠ€ν…€ νƒ€μž…
μ‚¬μš©μžκ°€ μ •μ˜ν•œ νƒ€μž…

unknown

any와 λΉ„μŠ·ν•˜λ‚˜ λ¨Όμ € νƒ€μž…μ„ μ§€μ •ν•˜κ±°λ‚˜ μ’νžˆμ§€ μ•ŠμœΌλ©΄ μ‘°μž‘μ΄ ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€.

custom type

type,interface,enum으둜 custom type을 λ§Œλ“€ 수 μžˆλ‹€.

type
type ν‚€μ›Œλ“œλŠ” μƒˆλ‘œμš΄ νƒ€μž…μ„ μ„ μ–Έν•˜κ±°λ‚˜ νƒ€μž… 별칭을 μ‚¬μš©ν•΄ 이미 μ‘΄μž¬ν•˜λŠ” νƒ€μž…μ— λ‹€λ₯Έ 이름을 λΆ™μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

type Foot = number // Footνƒ€μž…μ€ 숫자
type Pound = number // Poundνƒ€μž…μ€ 숫자

type Patient = {
	name : string;
  	height : Foot;
  	weight : Pound
}

let patient : Patient {
	name : "Jev",
    height : 184,
    weight : 78
}

type alias & interface

typeκ³Ό interfaceλŠ” λ‘˜ λ‹€ νƒ€μž…μ„ 지정해쀄 수 μžˆλŠ” κΈ°λŠ₯이닀.
type은 μ—¬λŸ¬ 데이터 νƒ€μž…μ„ 지정해쀄 수 μžˆμ§€λ§Œ interfaceλŠ” 객체에 λŒ€ν•΄μ„œλ§Œ νƒ€μž…μ„ 지정해쀄 수 μžˆλ‹€.

type
type은 μ‹λ³„μžμ— λŒ€ν•˜μ—¬ 객체뿐만 μ•„λ‹ˆλΌ μ—¬λŸ¬ 데이터 νƒ€μž…μ„ 지정해쀄 수 μžˆλ‹€.


type person = {
	name : string,
	height:number
}

type weight = number

type sum = (a:number,b:number) => number 

type fun1 = typeof sum

type obj = {
  // λ©”μ„œλ“œλͺ…을 μž…λ ₯해주지 μ•Šμ•„λ„ 됨.
(a:number,b:number):number
}

const sumFun1 : sum = (a, b) => a + b;
// type으둜 μ •μ˜ν•œ 객체 λ©”μ„œλ“œλ₯Ό ν•¨μˆ˜ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  수 있음.
const sumFun2 : obj = (a, b) => a + b;

μœ„μ²˜λŸΌ type은 객체λ₯Ό ν¬ν•¨ν•˜μ—¬ μ›μ‹œ νƒ€μž…,ν•¨μˆ˜ λ“± λ‹€μ–‘ν•œ νƒ€μž…μ„ μœ λ™μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

interface
객체 νƒ€μž…μ„ ν‘œν˜„ν•˜λŠ”λ°μ— μ‚¬μš©λœλ‹€.

interface Person {
height : number;
name : string;
birth : number;
  ...
}
  
interface obj {
  // λ©”μ„œλ“œλͺ…을 적어주지 μ•Šμ•„λ„ 됨.
  (a: number, b: number): number;
}  

// 객체 λ©”μ„œλ“œ νƒ€μž…μ„ νƒ€μž…μœΌλ‘œ μ‚¬μš©ν•  μˆ˜λ„ 있음.
const f1:obj = (a + b) => a + b 

νŠΉμ§•
Intersection
typeκ³Ό interface둜 μ„ μ–Έν•œ λ‹€μˆ˜μ˜ 객체 νƒ€μž…μ€ ν•˜λ‚˜μ˜ νƒ€μž…μœΌλ‘œ ν•©μΉ  수 μžˆλ‹€.

λ‘κ°œμ˜ νƒ€μž…μ„ ν•©μΉ˜κΈ° μœ„ν•΄ &μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

λ‹€λ§Œ λ‹€μˆ˜μ˜ νƒ€μž…μ„ ν•©μΉœ μ‹λ³„μžλŠ” type으둜 μ§€μ •ν•΄μ€˜μ•Όν•œλ‹€.

type + type => type

// κ°€λŠ₯
type Name = {
  name: β€œstring”
};

type Age = {
  age: number
};

type Person = Name & Age;

interface + interface => type

// κ°€λŠ₯
interface Name {
  name: β€œstring”
};

interface Age {
  age: number
};

type Person = Name & Age;

interface + type => type

// κ°€λŠ₯
interface Name {
  name: β€œstring”
};

type Age = {
  age: number
};

type Person = Name & Age;

interface + interface => interface >> μ—λŸ¬

// λΆˆκ°€λŠ₯
interface Name {
  name: β€œstring”
};

interface Age {
  age: number
};

interface Person = Name & Age; // μ΄κ±°λŠ” μ•ˆλ¨.

(type으둜 μ„ μ–Έν•œ νƒ€μž…κ³Ό interface둜 μ„ μ–Έν•œ νƒ€μž…λ„ ν•©μΉ  수 μžˆλ‚˜?)

차이점
typeκ³Ό interfaceλŠ” λΉ„μŠ·ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ λ‹€μŒκ³Ό 같은 차이점이 μžˆλ‹€.

  1. type은 μ—¬λŸ¬ 데이터 νƒ€μž…μ„ 지정할 수 μžˆμ§€λ§Œ interfaceλŠ” 객체의 데이터 νƒ€μž…λ§Œμ„ 지정할 수 μžˆλ‹€.

  2. Declartion Merging
    type은 이미 μ„ μ–Έν•œ μ‹λ³„μžλͺ…에 쀑볡 선언이 μ•ˆλ λΏλ§Œ μ•„λ‹ˆλΌ μ€‘λ³΅μ„ μ–Έλœ λ‹€μˆ˜μ˜ μ‹λ³„μžλͺ…μ˜ νƒ€μž…μ€ ν•©μ³μ§€μ§€μ•ŠλŠ”λ‹€.(can not merge)
    interfaceλŠ” 쀑볡선언이 되고 μ€‘λ³΅λœ λ‹€μˆ˜μ˜ μ‹λ³„μžλͺ…끼리 μ„œλ‘œ λ‹€λ₯Έ ν”„λ‘œνΌν‹°λ₯Ό ν•©μΉ  수 μžˆλ‹€. (can merge)

  3. extends

interface Song {
  artistName: string;
};

interface Song {
  songName: string;
};

const song: Song = {
  artistName: "Freddie",
  songName: "The Chain"
};

μœ„μ™€ 같이 Songμ΄λΌλŠ” interfaceκ°€ 2번 μ€‘λ³΅μ„ μ–Έλœλ‹€ν•΄λ„ μ„œλ‘œμ˜ ν”„λ‘œνΌν‹°λ₯Ό ν•©μΉ  수 있게 λœλ‹€.

νƒ€μž…μŠ€ν¬λ¦½νŠΈλŠ” μ€‘λ³΅μ„ μ–Έλœ interfaceλ₯Ό μžλ™μ μœΌλ‘œ ν•˜λ‚˜λ‘œ 합쳐쀄 수 μžˆλŠ” κΈ°λŠ₯이 λ‚΄μž₯λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ΄λ‹€.

ν•˜μ§€λ§Œ type으둜 μ€‘λ³΅μ„ μ–Έν•˜λ €ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

Generic

ν•¨μˆ˜μ—μ„œ μ“°μ΄λŠ” 경우

μΈν„°νŽ˜μ΄μŠ€μ—μ„œ μ“°μ΄λŠ” 경우

typeof

μ–΄λ– ν•œ λ³€μˆ˜λ‚˜ ν”„λ‘œνΌν‹°μ˜ νƒ€μž…μ„ μ°Έμ‘°ν•  수 μžˆλŠ” μ—°μ‚°μž

let s = "hello";
let n: typeof s;

typeof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ λ³€μˆ˜μ˜ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

ReturnType

ReturnType은 ν•¨μˆ˜μ˜ 리턴값에 λŒ€ν•œ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλŠ” μ—°μ‚°μžμ΄λ‹€.

function f1():{a:number,b:string}


type T0 = ReturnType<() => string> // T0의 νƒ€μž… : string

type T1 = ReturnType<(s:string) => void> // T1의 νƒ€μž… : void  

type T2 = ReturnType<typeof f1>  // T2의 νƒ€μž… : f1ν•¨μˆ˜ λ°˜ν™˜κ°’μ˜ νƒ€μž…{a:number,b:string}

type T7 = ReturnType<string> //Type 'string' does not satisfy the constraint '(...args: any) => any'.                    
                     

μœ„μ™€ 같이 ReturnType의 κΊ½μ‡ κ΄„ν˜Έ μ•ˆμ—λŠ” ν•¨μˆ˜κ°€ λ“€μ–΄κ°€μ•Όν•˜λ©° ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ˜ νƒ€μž…μ„ λŒλ €μ€€λ‹€.

이미 μ„ μ–Έν•œ ν•¨μˆ˜μ˜ νƒ€μž…μ„ μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” typeof μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€.

μ£Όμ˜ν•  점은 ReturnType의 κΊ½μ‡ κ΄„ν˜Έ μ•ˆμ—λŠ” λ¬Έμžμ—΄,숫자 λ“± ν•¨μˆ˜κ°€ μ•„λ‹Œ λ°μ΄ν„°νƒ€μž…μ„ μ‚¬μš©ν•  수 μ—†λ‹€.

declare

ν•¨μˆ˜ νƒ€μž… μ§€μ •ν•˜λŠ” 법

1. ν•¨μˆ˜ μ„ μ–Έλ¬Έ νƒ€μž… μ§€μ •ν•˜λŠ”λ²•

function f1(a:number,b:number):number {
	return a + b
}

이 λ•Œ μ£Όμ˜ν•  것은 λ°˜ν™˜κ°’μ΄ voidλ‚˜ anyκ°€ μ•„λ‹ˆλΌλ©΄ return(λ°˜ν™˜κ°’)을 λͺ…μ‹œν•΄μ€˜μ•Όν•œλ‹€.
Error

function f1(a:number,b:number):number {
} /*A function whose declared type is 
neither 'void' nor 'any' must return a value.*/

λ°˜ν™˜κ°’μ΄ void

function f1(a:number,b:number) : void {}	

2. ν™”μ‚΄ν‘œ ν•¨μˆ˜ νƒ€μž… μ§€μ •ν•˜λŠ” 법

// ν•¨μˆ˜ν‘œν˜„μ‹ μ„ μ–Έκ³Ό λ™μ‹œμ— νƒ€μž…ν• λ‹Ή
const f1 = (a: number, b: number): number => a + b;
const f2 = (a: number, b: number): void => {}

// λ”°λ‘œ 지정해둔 νƒ€μž…μ„ ν•¨μˆ˜ν‘œν˜„μ‹μ— ν• λ‹Ή
type sum = (a: number, b: number) => number;
const f3 : sum = (x,y) => x + y

keyof

  • νŠΉμ • 객체 νƒ€μž…μ˜ λͺ¨λ“  ν‚€κ°’λ“€ μœ λ‹ˆμ˜¨ ν˜•νƒœλ‘œ λ°˜ν™˜

interface Iinfo {
name :"jev",
email:"jev.com"
}

typem InfoKeys = keyof Iinfo // Iinfo === "name" | "jev.com"

as (type assertion)

0개의 λŒ“κΈ€