π νμ μμ€ν (2)
νμ μ€ν¬λ¦½νΈμ νμ μμ€ν μ€ κ°μ²΄ λνΌ νμ , μμ¬ μμ± μ²΄ν¬, ν¨μ ννμ, νμ κ³Ό μΈν°νμ΄μ€μ μ°¨μ΄μ λν΄μ μ 리ν΄λ³΄μ νλ€.
π¦ κ°μ²΄ λνΌ νμ
λ¬Έμμ΄μ μ
λ ₯νκ³ .μ μ°μΌλ©΄ κ°μ²΄μ²λΌ μ°λ¦¬λ λ€μν λ©μλλ₯Ό μ΄μ©ν μ μλ€. μ΄λ κ² κ°λ₯ν κ²μ μλ°μ€ν¬λ¦½νΈκ° .μ μ°λ μκ° stringμμ String κ°μ²΄ λνΌλ‘ νμ
λ³νμ΄ μ΄λ£¨μ΄μ§λ€. κ°μ²΄λ‘ λ³νν΄ λ©μλλ₯Ό μ¬μ©ν νμλ κ°μ²΄ νμ
μμ λ€μ μμνμΌλ‘ λμκ°λ€.
μ΄λ κ² μ μ©ν κ°μ²΄ λνΌ νμ μ΄μ§λ§ μ μλ νμ μ 보면 μ€νκ° λκΈ° μ½κ² λμ΄μλ€.
- μμν:
string, κ°μ²΄λνΌ:String - μμν:
number, κ°μ²΄λνΌ:Number - μμν:
boolean, κ°μ²΄λνΌ:Boolean
function getStringLen(foo: String) {
return foo.length
}
getStringLen("hello")
getStringLen(new String("hello"))
function isGreeting(phrases: String) {
return ["hello", "good day"].includes(phrases) // Argument of type 'String' is not assignable to parameter of type 'string'.
}ν¬κ² λ¬Έμ κ° λμ§ μμ κ² κ°μ 보μ΄μ§λ§ μμνμ κ°μ²΄λνΌμ ν λΉν μ μλ λ°λ©΄ κ°μ²΄ λνΌλ μμνμ ν λΉν μ μκΈ° λλ¬Έμ μ€νλ‘ μΈν μλ¬κ° λ°μν κ²μ λ³Ό μ μλ€. μ§μ κ°μ²΄ λνΌλ₯Ό ν λΉνμ§ μκ² μ£Όμν΄μΌ ν¨μ 보μ¬μ£Όλ μμ λ€.
β μμ¬ μμ± μ²΄ν¬
μμ¬μμ± μ²΄ν¬λ μ°λ¦¬κ° μ μν΄ μ€ νμ μ μμ±λ€ μΈμ μΆκ°λ μμ±μ΄ μλμ§ νμΈνλ κ³Όμ μ μλ―Ένλ€.
interface Dog {
age: number
name: string
}
const dog1: Dog = {
age: 1,
name: "λ°λμ΄",
bark() {
// 'bark' does not exist in type 'Dog'.
console.log("μ§κΈ°")
},
}μ μμ μμ Dogνμ
μ bark μμ±μ΄ μκΈ° λλ¬Έμ μλ¬κ° λ°μνμ§λ§ μμ λ°°μ λ ꡬ쑰μ νμ΄νμ μλ―Έλ‘ λ³΄μμ λλ νμν μμ±μΈ ageμ nameμ΄ μκΈ° λλ¬Έμ μλ¬κ° λμ§ μμμΌ ν κ² κ°λ€.
const dog2 = {
age: 1,
name: "λ°λμ΄",
bark() {
console.log("μ§κΈ°")
},
}
const r: Dog = dog2κ°μ 쑰건μ΄μ§λ§ μμ μμ μλ λ€λ₯΄κ² μλ¬κ° λ°μνμ§ μμλ€.
interface Options {
title: string
darkMode?: boolean
}
function createWindow(options: Options) {
if (options.darkMode) {
// setDarkMode()
}
}
createWindow({
title: "Spider",
darkmode: true,
}) // 'darkmode' does not exist in type 'Options'. Did you mean to write 'darkMode'?
const o1: Options = documentλμ μ°¨μ΄μ μ λκΉ?
μμ μλ¬κ° λ°μν μμ λ€μ μμ¬μμ± μ²΄ν¬κ° μ§νλμκΈ° λλ¬Έμ μλ¬κ° λ°μνλ€. μμ¬μμ± μ²΄ν¬κ° λ°μνλ 쑰건μ dog1μ²λΌ κ°μ²΄ 리ν°λ΄μ ν λΉνκ±°λ createWindowμ²λΌ ν¨μμ λ§€κ°λ³μλ₯Ό μ λ¬ν λ μ μ©λλ€.
μλ¬κ° λ°μνμ§ μμ κ²½μ°λ λ³μλ₯Ό ν΅ν΄ κ°μ μ λ¬νμ λλ‘ μμ λ³μλ₯Ό μ λ¬νλ©΄ μμ¬ μμ± μ²΄ν¬κ° μ΄λ£¨μ΄μ§μ§ μλλ€. μ°λ¦¬κ° μ μν μμ±λ§ μΆκ°λκ² νλ κ²½μ°μ μμ¬μμ± μ²΄ν¬λ₯Ό μ μ©ν΄ μ€λ₯λ₯Ό μ°Ύμ μ μλ μ₯μ μ΄ μλ€. νμ§λ§ ꡬ쑰μ νμ΄νμ κ΄μ κ³Ό μΆ©λνκΈ° λλ¬Έμ νμν λμ μ μ νκ² μ¬μ©ν νμκ° μμ΄ λ³΄μλ€.
π ν¨μ ννμ
μλ°μ€ν¬λ¦½νΈμμ ν¨μλ₯Ό μ¬μ©νλ λ°©λ²μλ ν¨μ μ μΈλ¬Έκ³Ό ν¨μ ννμμ΄ μλ€. νμ
μ€ν¬λ¦½νΈλ ν¨μ ννμμΌ λ λ§€κ°λ³μμ λ°ν κ°μ νμ
μΌλ‘ μ μΈν μ μλ μ₯μ μ κ°κ³ μλ€.
function add(a: number, b: number) {
return a + b
}
function sub(a: number, b: number) {
return a - b
}
function mul(a: number, b: number) {
return a * b
}
function div(a: number, b: number) {
return a / b
}
type BinaryFn = (a: number, b: number) => number
const add: BinaryFn = (a, b) => a + b
const sub: BinaryFn = (a, b) => a - b
const mul: BinaryFn = (a, b) => a * b
const div: BinaryFn = (a, b) => a / bμμ μμ λ ν¨μ μ μΈλ¬Έμ μ΄μ©ν΄ λ§€κ°λ³μμ νμ
μ μ ν΄ μ€ κ²½μ°μ΄κ³ , μλλ ν¨μ ννμμ BinaryFnνμ
μ μ΄μ©ν΄ λ§€κ°λ³μμ λ°ν κ°μ νμ
μ νλ²μ μ μν κ²½μ°μ΄λ€. ν¨μ μ μΈλ¬Έμ κ²½μ° μΌμΌμ΄ λ§€κ°λ³μμ νμ
μ μ ν΄ μ£Όμ΄μΌ νκ³ , μ ν νμ
μ μ¬ μ¬μ©ν μ μλ λ°λ©΄, ν¨μ ννμμ κ²½μ° ν¨μμ νμν λ§€κ°λ³μμ λ°ν κ°μ νμ
μ νλ²μ ννν΄ ν¨μ¬ κ°κ²°νλ©΄μλ μ¬ μ¬μ©μ±λ λμ΄λ κ²μ λ³Ό μ μλ€.
async function checkedFetch(input: RequestInfo, init?: RequestInit) {
const response = await fetch(input, init)
if (!response.ok) {
throw new Error(`${response.status}`)
}
return response
}
const checkedFetch: typeof fetch = async (input, init) => {
const response = await fetch(input, init)
if (!response.ok) {
throw new Error(`${response.status}`)
}
return response
}μμ μμ λ λ΄κ° μ£Όλ‘ μ°λ―μ΄ κ°κ°μ λ§€κ°λ³μμ νμ
μ μ ν΄ μ€ λͺ¨μ΅μ΄κ³ , μλλ λ΄μ₯λ fetch νμ
μΌλ‘ ν¨μ¬ κ°κ²°νκ² λνλΈ λͺ¨μ΅μ΄λ€. μ΄λ κ² λμΌν λ§€κ°λ³μμ λ°ν κ°μ νμ
μ κ°μ§λ ν¨μμ κ²½μ° ν¨μ μ 체μ νμ
μ μ ν΄ μ¬ μ¬μ©νλ κ²μ΄ ν¨μ¨μ μΈ κ²μ μλ‘κ² μκ² λμλ€.
π₯ νμ VS Interface
νμ κ³Ό interfaceλ νμ κ³ λ―Όλλ λ¬Έμ λ€. 곡ν΅μ μ΄ λ§κΈ° λλ¬Έμ μ΄λ€ μ μ κΈ°μ€μΌλ‘ μ¬μ©ν΄μΌ ν κΉ κ³ λ―Όλλ κ²½μ°κ° λ§μλ€. μ΄λ¬ν κ³ λ―Όμ λ λ€ κ°λ₯ν 곡ν΅μ μμ μμλμλ€.
곡ν΅μ
1) νμ μ μ
type TState = {
name: String
capital: string
}
interface IState {
name: string
capital: string
}λ λ€ λμΌνκ² μ»€μ€ν νμ μ μ μν μ μλ€.
2) Indexμ ν¨μ μ μ
type TDict = { [key: string]: string }
interface IDict {
[key: string]: string
}
type TFn = (x: number) => string
interface IFn {
(x: number): string
}λ λ€ λμΌνκ² indexμ ν¨μλ₯Ό μ μν μ μλ€.
3) Genericκ³Ό νμ₯
type TPair<T> = {
first: T
second: T
}
interface IPair<T> {
first: T
second: T
}
interface IStateWithPop extends TState {
population: number
}
type TStateWithPop = IState & { population: number }λ λ€ Genericμ μ¬μ©ν μ μκ³ νμ₯λ κ°λ₯νλ€.
4) ν΄λμ€ κ΅¬ν
class StateT implements TState {
name: string = ""
capital: string = ""
}
class StateI implements IState {
name: string = ""
capital: string = ""
}ν΄λμ€λ₯Ό ꡬννλ κ²λ λ λ€ κ°λ₯νλ€.
μ°¨μ΄μ
λλΆλΆμ΄ λ λ€ κ°λ₯νκΈ° λλ¬Έμ μ°¨μ΄μ μ΄ μμ΄λ³΄μ΄μ§λ§ interfaceλ§ κ°λ₯ν κ²κ³Ό typeλ§μ΄ κ°λ₯ν μν μ΄ μλ€.
볡μ‘ν type
type AorB = "a" | "b"union typeμ΄λ μ‘°κ±΄λΆ νμ κ³Ό κ°μ΄ μ’ λ 볡μ‘ν typeμ μν΄μλ interfaceκ° μ¬μ©λ μ μλ€. typeμ νμ©μ±μ΄ interfaceλ³΄λ€ λλ€κ³ ν μ μλ€.
보κ°
interface IState {
name: string
capital: string
}
interface IState {
population: number
}interfaceλ typeκ³Όλ λ€λ₯΄κ² μμ±μ κ°μ μ΄λ¦μ interfaceμ μ μΈν΄ νμ₯ν μ μλ νΉμ§μ κ°μ§λ€. μ΄κ²μ ν΅ν΄μ μ€μ λ‘ μ°λ¦¬κ° μ¬μ©νλ λ΄μ₯ λ©μλλ€μ μ μκ° λ²μ λ³λ‘ νμ₯λμ΄ μ μ©λκ³ μλ€.
π€ κ·Έλμ κΈ°μ€μ μ΄λ€ κ²μΌκΉ?
μ¬μ©ν λ κΈ°μ€μ λ¨Όμ μ¬μ©ν λ μΌκ΄μ±μ μ μ§ν΄μΌ νλ€λ μ μ΄λ€. typeκ³Ό interfaceλ 곡ν΅μ μ΄ λ§κΈ° λλ¬Έμ λ λ€ κ°λ₯ν κ²½μ°κ° λ§λ€. κ·Έλ μ§λ§ typeμ μ°λ€κ° interfaceλ₯Ό μ°λ κ²μ΄ μλλΌ νλλ‘ μ ν΄μ μΌκ΄λκ² μμ±νλ μ½λμ€νμΌμ΄ μ€μνλ€.
κ°κ°μ μ°¨μ΄μ μ κ³ λ €ν΄μ 볡μ‘ν νμ
μ typeμ μ¬μ©νκ³ λ³΄κ°μ΄ νμν κ²½μ°μλ interfaceλ₯Ό μ΄μ©ν΄ APIλ₯Ό μ μν λ μ¬μ©ν μ μλ€.
[μ°Έμ‘°]