Typescriptλ₯Ό μ€ννκΈ°μ μμ νκ²½μ€μ ν λΆλΆμ λ€μκ³Ό κ°λ€.
typescriptμ file extensionμ .tsμ΄λ€.
index.ts
Typescript option μ€μ μ tsconfig.jsonμμ μ€μ νλ€
νλ‘μ νΈ ν΄λμ tsc --init λͺ
λ Ήμ΄λ₯Ό μ¬μ©νλ©΄ tsconfig.jsonμ λͺ¨λ μ»΄νμΌλ¬ μ΅μ
μ΄ μμΌλ©° λλΆλΆ μ£Όμ μ²λ¦¬κ° λμλ€.
(νμν λΆλΆμ μ£Όμμ ν΄μ ν΄μ μ°λ©΄ λ¨.)
watch modeλ₯Ό μ€ννλ €λ©΄ λͺ λ Ήμ΄λ‘ tsc μ λ ₯
"noEmitOnError": true => μλ¬κ° λ¬μ λ μ»΄νμΌ ν΄μ£Όμ§ μκ² νλ μ΅μ
"watch": true => tsμμ λ³κ²½ν μ¬νλ€μ μ¦κ°μ μΌλ‘ jsλ‘ μ»΄νμΌ ν΄μ£Όλ μ΅μ
"target":"ECMA version" => μ»΄νμΌλ ECMA Script Versionμ μ§μ ν΄μ£Όλ μ΅μ
"outDir" : "folder" => μ»΄νμΌ λ νμΌλ€μ μ§μ ν ν΄λ
λ³μ λ° λ°νκ°μ νμ μ μ§μ ν μ μλ€.
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
λ°νκ°μ νμ μ§μ μμΉ : 맀κ°λ³μ λ£λμ리μ μ½λλΈλ μ¬μ΄μ λ°νκ°μ νμ μ μ§μ ν΄μ€λ€.
κ°μ λ°ννμ§ μλ ν¨μλ₯Ό μ μΈνλλ° μ¬μ©λλ€.
ν¨μμ void νμ μ μ μΈνλ©΄ μ€νμ λμ§λ§ λ°ννμ§λ μλλ€.
!
μλ°μ€ν¬λ¦½νΈ ν¨μλ λ°νμ μ€μ ν¨μ λ³Έλ¬Έμ returnλ¬Έμ΄ μλ κ²½μ° ν¨μλ₯Ό μ€ννμ λ undefined λ°ννλ€.
νμ§λ§ voidνμ μ μ¬μ©νλ©΄ μ΄μ κ°μ μ€μλ₯Ό λ°©μ§ν μ μλ€.
μ λ λ°νμ νμ§ μλ ν¨μμ μ¬μ©νλ€.
μ λλ‘ μ€νμ΄ μ’ λ£λμ§ μλ ν¨μλ μ€λ₯λ₯Ό λ°μμν€κΈ° μν΄μλ§ μ‘΄μ¬νλ ν¨μλ₯Ό μλ₯Ό λ€ μ μλ€.
μ λλ‘ μ€νμ΄ μ’ λ£λμ§ μλ ν¨μ 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 λΈλ‘μ μ€νλμ§ μλλ€.
number,string,boolean,custom typeμ ν λΉν μ μλ€.
κ·Έλ¬λ νμ
체ν¬μ μ₯μ μ μκ³ μ½λμ κ°λ
μ±λ λ¨μ΄μ§ μ μμ΄ λλλ‘ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
컀μ€ν
νμ
μ¬μ©μκ° μ μν νμ
anyμ λΉμ·νλ λ¨Όμ νμ μ μ§μ νκ±°λ μ’νμ§ μμΌλ©΄ μ‘°μμ΄ νμ©λμ§ μλλ€.
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κ³Ό 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λ λΉμ·νκ² μ¬μ©ν μ μμ§λ§ λ€μκ³Ό κ°μ μ°¨μ΄μ μ΄ μλ€.
typeμ μ¬λ¬ λ°μ΄ν° νμ μ μ§μ ν μ μμ§λ§ interfaceλ κ°μ²΄μ λ°μ΄ν° νμ λ§μ μ§μ ν μ μλ€.
Declartion Merging
typeμ μ΄λ―Έ μ μΈν μλ³μλͺ
μ μ€λ³΅ μ μΈμ΄ μλ λΏλ§ μλλΌ μ€λ³΅μ μΈλ λ€μμ μλ³μλͺ
μ νμ
μ ν©μ³μ§μ§μλλ€.(can not merge)
interfaceλ μ€λ³΅μ μΈμ΄ λκ³ μ€λ³΅λ λ€μμ μλ³μλͺ
λΌλ¦¬ μλ‘ λ€λ₯Έ νλ‘νΌν°λ₯Ό ν©μΉ μ μλ€. (can merge)
extends
interface Song {
artistName: string;
};
interface Song {
songName: string;
};
const song: Song = {
artistName: "Freddie",
songName: "The Chain"
};
μμ κ°μ΄ Songμ΄λΌλ interfaceκ° 2λ² μ€λ³΅μ μΈλλ€ν΄λ μλ‘μ νλ‘νΌν°λ₯Ό ν©μΉ μ μκ² λλ€.
νμ μ€ν¬λ¦½νΈλ μ€λ³΅μ μΈλ interfaceλ₯Ό μλμ μΌλ‘ νλλ‘ ν©μ³μ€ μ μλ κΈ°λ₯μ΄ λ΄μ₯λμ΄μκΈ° λλ¬Έμ΄λ€.
νμ§λ§ typeμΌλ‘ μ€λ³΅μ μΈνλ €νλ©΄ μλ¬κ° λ°μνλ€.
ν¨μμμ μ°μ΄λ κ²½μ°
μΈν°νμ΄μ€μμ μ°μ΄λ κ²½μ°
μ΄λ ν λ³μλ νλ‘νΌν°μ νμ μ μ°Έμ‘°ν μ μλ μ°μ°μ
let s = "hello";
let n: typeof s;
typeof μ°μ°μλ₯Ό μ¬μ©νλ©΄ λ€λ₯Έ λ³μμ νμ μ μ¬μ©ν μ μλ€.
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μ κΊ½μ κ΄νΈ μμλ λ¬Έμμ΄,μ«μ λ± ν¨μκ° μλ λ°μ΄ν°νμ μ μ¬μ©ν μ μλ€.
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
interface Iinfo {
name :"jev",
email:"jev.com"
}
typem InfoKeys = keyof Iinfo // Iinfo === "name" | "jev.com"