![[TypeScript] νμ
κ°λ(Type Guard)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb5PFa%2FbtsGMDjnven%2F2gm9BuGmkjnaHQX0khfoA0%2Fimg.png)
π νμ κ°λλ 무μμΈκ°μ?
νμ
κ°λλ νΉμ μ€μ½ν λ΄μμ λ³μμ νμ
μ 보μ₯νλ ννμμ μλ―Έν΄μ. μ΄λ₯Ό νμ©νλ©΄ νμ
μμ μ±μ 보μ₯νλ©΄μλ μ μ°νκ² μ½λλ₯Ό μμ±ν μ μμ΄μ. νμ
κ°λλ typeof
, instanceof
, μ¬μ©μ μ μ νμ
κ°λ λ± μ¬λ¬ ννλ‘ μ¬μ©ν μ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ λ°νμμ κ°μ²΄μ νμ
μ μ’ν λκ°λ μν μ ν΄μ.
λΉμ λ₯Ό λ€μ΄λ³΄μλ©΄, μ¬λ¬ μ’ λ₯μ κ³ΌμΌμ΄ μμΈ λ°κ΅¬λμμ μ¬κ³Όλ§ 골λΌλ΄λ κ²κ³Ό μ μ¬ν΄μ. νμ κ°λλ κ³ΌμΌμ μ’ λ₯λ₯Ό νμΈνμ¬ μ¬κ³ΌμΈ κ²½μ°μλ§ νΉμ μμ μ μννλλ‘ νλ 쑰건문과 κ°μ μν μ ν΄μ.
π₯οΈ νμ κ°λμ μ’ λ₯
1. typeof
κ°λ
typeof
μ°μ°μλ μλ°μ€ν¬λ¦½νΈμ κΈ°λ³Έ μ°μ°μλ‘, λ³μμ νμ μ λ¬Έμμ΄λ‘ λ°νν΄μ. νμ μ€ν¬λ¦½νΈμμλ μ΄ μ°μ°μλ₯Ό μ¬μ©νμ¬ κΈ°λ³Έμ μΈ νμ κ°λλ₯Ό μ μ©ν μ μμ΄μ. μ£Όλ‘string
,number
,boolean
,function
κ°μ κΈ°λ³Έ νμ μ κ²μ¬ν λ μ μ©ν΄μ.
function printId(id: number | string) {
if (typeof id === "string") {
console.log("Your ID is: " + id.toUpperCase()); // λ¬Έμμ΄μΌ κ²½μ° λλ¬Έμλ‘ λ³ν
} else {
console.log("Your ID is: " + id); // μ«μμΌ κ²½μ° κ·Έλλ‘ μΆλ ₯
}
}
// μ€ν κ²°κ³Ό
printId("abc"); // Your ID is: ABC
printId(123); // Your ID is: 123
μ΄ μ½λμμλ 'typeof'λ₯Ό μ¬μ©νμ¬ 'id' λ³μκ° λ¬Έμμ΄μΈμ§ μ«μμΈμ§λ₯Ό νλ¨ν©λλ€.
λ§μ½ λ¬Έμμ΄μ΄λ©΄ λλ¬Έμλ‘ λ³ννμ¬ μΆλ ₯νκ³ , μ«μλΌλ©΄ κ·Έλλ‘ μΆλ ₯ν©λλ€.
2. instanceof
κ°λ
instanceof
λ κ°μ²΄κ° νΉμ ν΄λμ€μ μΈμ€ν΄μ€μΈμ§ νμΈν λ μ¬μ©λΌμ. μ΄λ₯Ό ν΅ν΄ ν΄λμ€ κΈ°λ°μ κ°μ²΄ νμ μ μμ νκ² μ²΄ν¬ν μ μμ΄μ.
class Bird {
fly() {
console.log("The bird can fly!");
}
}
class Fish {
swim() {
console.log("The fish can swim!");
}
}
function move(pet: Bird | Fish) {
if (pet instanceof Bird) {
pet.fly(); // Bird μΈμ€ν΄μ€μΌ κ²½μ°
} else {
pet.swim(); // Fish μΈμ€ν΄μ€μΌ κ²½μ°
}
}
// μ€ν κ²°κ³Ό
const bird = new Bird();
const fish = new Fish();
move(bird); // The bird can fly!
move(fish); // The fish can swim!
μ¬κΈ°μλ 'Bird' ν΄λμ€μ 'Fish' ν΄λμ€ μΈμ€ν΄μ€λ₯Ό ꡬλΆνμ¬ κ°κ°μ λ©μλλ₯Ό νΈμΆν©λλ€.
'Bird' μΈμ€ν΄μ€λ 'fly()'λ₯Ό, 'Fish' μΈμ€ν΄μ€λ 'swim()'μ νΈμΆν©λλ€.
3. μ¬μ©μ μ μ νμ κ°λ
- μ¬μ©μ μ μ νμ
κ°λλ
pet is Fish
μ κ°μ νΉλ³ν νμμ λ°ν νμ μ κ°μ§λ©°, λ°νμμ νμ μ μ’νλ λ° μ¬μ©λΌμ.
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
const pet = getSmallPet(); // Fish λλ Bird λ°ν
if (isFish(pet)) {
pet.swim(); // Fish νμ
νμΈ μ
} else {
pet.fly(); // Fish νμ
μ΄ μλ κ²½μ°
}
// μ€ν κ²°κ³Ό μμΈ‘
// λ§μ½ petμ΄ Fish νμ
μ΄λΌλ©΄:
// The fish can swim!
// λ§μ½ petμ΄ Bird νμ
μ΄λΌλ©΄:
// The bird can fly!
μ¬κΈ°μ 'isFish' ν¨μλ 'pet'μ΄ 'Fish' νμ μΈμ§ νμΈν©λλ€.
'true'μΌ κ²½μ° 'Fish'μ 'swim()' λ©μλλ₯Ό νΈμΆνκ³ , 'false'μΌ κ²½μ° 'Bird'μ 'fly()' λ©μλλ₯Ό νΈμΆν©λλ€.
π€ νμ κ°λμ κ³ κΈ νμ© λ°©λ²
νμ μ€ν¬λ¦½νΈμ νμ κ°λλ λ¨μν νμ νμΈμ λμ΄μ, λ³΄λ€ λ³΅μ‘ν λ‘μ§ κ΅¬νμλ μ μ©νκ² μ¬μ©λΌμ.
1. νμ κ°λλ₯Ό νμ©ν μ‘°κ±΄λΆ νμ
- νμ κ°λλ₯Ό ν΅ν΄ λ°ν νμ μ 쑰건μ λ°λΌ κ²°μ ν μ μμ΄μ. μ΄λ 볡μ‘ν λ‘μ§μμ νΉν μ μ©νμ£ . μλ₯Ό λ€μ΄, ν¨μκ° μ¬λ¬ νμ μ λ°νν μ μλ κ²½μ°, νμ κ°λλ₯Ό μ¬μ©νμ¬ κ°κ°μ 쑰건μ λ§λ νμ μ μμ νκ² μ²λ¦¬ν μ μμ΄μ.
function isNumber(x: any): x is number {
return typeof x === "number";
}
function example(foo: number | string) {
if (isNumber(foo)) {
return foo.toFixed(2); // fooλ numberλ‘ μΆλ‘ λ©λλ€.
} else {
return foo.charAt(0); // fooλ stringμΌλ‘ μΆλ‘ λ©λλ€.
}
}
// μ€ν κ²°κ³Ό
console.log(example(10.123)); // "10.12"
console.log(example("hello")); // "h"
μ΄ μ½λμμλ 'isNumber' ν¨μλ₯Ό ν΅ν΄ 'foo' λ³μμ νμ μ΄ μ«μμΈμ§λ₯Ό νμΈν©λλ€.
μ«μ νμ μΌ κ²½μ° μμ λ μ리κΉμ§ νμνλ λ¬Έμμ΄λ‘ λ³ννκ³ , λ¬Έμμ΄ νμ μΌ κ²½μ° μ²« κΈμλ§ λ°νν©λλ€.
2. νμ κ°λμ μ λ€λ¦ νμ
- νμ κ°λλ μ λ€λ¦ νμ κ³Ό κ²°ν©λμ΄ λμ± κ°λ ₯ν΄μ§ μ μμ΄μ. μ λ€λ¦μ μ¬μ©νλ©΄ ν¨μλ ν΄λμ€κ° λ€μν νμ κ³Ό ν¨κ» μλν μ μμΌλ©°, νμ κ°λλ μ΄λ¬ν νμ λ€μ λ°νμμ κ²μ¬νμ¬ μ μ ν νμ μ ν보νλ λ° λμμ μ€μ.
function isString<T>(data: T | string): data is string {
return typeof data === "string";
}
function processData<T>(data: T | string) {
if (isString(data)) {
console.log(data.toUpperCase()); // dataλ stringμΌλ‘ μΆλ‘ λ©λλ€.
} else {
console.log(data); // dataλ Tλ‘ μΆλ‘ λ©λλ€.
}
}
// μ€ν κ²°κ³Ό
processData("test"); // "TEST"
processData(123); // 123
μ΄ μ½λμμ 'isString' νμ κ°λλ μ λ ₯λ 'data'κ° λ¬Έμμ΄μΈμ§ μλμ§λ₯Ό κ²μ¬ν©λλ€.
λ¬Έμμ΄μΌ κ²½μ° λλ¬Έμλ‘ λ³ννμ¬ μΆλ ₯νκ³ , κ·Έλ μ§ μμ κ²½μ° μλ νμ κ·Έλλ‘ μΆλ ₯ν©λλ€.
3. νμ κ°λλ₯Ό νμ©ν κ³ κΈ ν¨ν΄ 맀μΉ
- νμ μ€ν¬λ¦½νΈμμ νμ κ°λλ λ€μν ν¨ν΄ λ§€μΉ μλ리μ€μμ μ μ©νκ² μ¬μ©λΌμ. 볡μ‘ν κ°μ²΄ ꡬ쑰λ λ°°μ΄μ κ²μ¬ν λ, νμ κ°λλ₯Ό μ¬μ©νλ©΄ νΉμ ν¨ν΄μ λ§λ μμλ₯Ό μμ νκ² μΆμΆνκ³ μ²λ¦¬ν μ μμ΄μ.
interface Admin {
role: string;
}
interface User {
email: string;
}
function isAdmin(person: Admin | User): person is Admin {
return (person as Admin).role !== undefined;
}
function getUserRole(person: Admin | User) {
if (isAdmin(person)) {
console.log('κ΄λ¦¬μμ
λλ€:', person.role); // personμ AdminμΌλ‘ μΆλ‘ λ©λλ€.
} else {
console.log('μ¬μ©μμ
λλ€:', person.email); // personμ Userλ‘ μΆλ‘ λ©λλ€.
}
}
// μ€ν κ²°κ³Ό
getUserRole({ role: "manager" }); // κ΄λ¦¬μμ
λλ€: manager
getUserRole({ email: "user@example.com" }); // μ¬μ©μμ
λλ€: user@example.com
μ΄ μ½λμμλ 'isAdmin' ν¨μλ₯Ό ν΅ν΄ 'person' κ°μ²΄κ° 'Admin' νμ μΈμ§ 'User' νμ μΈμ§λ₯Ό νλ³ν©λλ€.
'Admin' νμ μ΄λ©΄ κ΄λ¦¬μμ μν μ μΆλ ₯νκ³ , κ·Έλ μ§ μμΌλ©΄ μ¬μ©μμ μ΄λ©μΌμ μΆλ ₯ν©λλ€.
π¨ μ£Όμν μ
- μ νν νμ
체ν¬:
typeof
μinstanceof
λ μ νμ μΈ μ 보λ§μ μ 곡ν΄μ. μλ₯Ό λ€μ΄,typeof
λnull
μ"object"
λ‘ λ°ννλ―λ‘,null
체ν¬λ₯Ό λ³λλ‘ μνν΄μΌ ν΄μ. - 컀μ€ν νμ κ°λμ μ€λ₯ κ°λ₯μ±: μ¬μ©μ μ μ νμ κ°λλ μ νν ꡬνλμ΄μΌ ν΄μ. μλͺ» ꡬνλ νμ κ°λλ λ°νμ μ€λ₯λ₯Ό μ΄λν μ μμΌλ―λ‘, λ‘μ§μ μ² μ ν ν μ€νΈνκ³ κ²μ¦ν΄μΌ ν΄μ.
- λ°νμ μ±λ₯ κ³ λ €: νμ κ°λλ λ°νμ μμ μ μ€νλκΈ° λλ¬Έμ, μ±λ₯μ μν₯μ μ€ μ μμ΄μ. 볡μ‘ν νμ κ°λλ μ±λ₯ μ νλ₯Ό μΌμΌν¬ μ μμΌλ, μ¬μ© μ μ±λ₯μ κ³ λ €ν΄μΌ ν΄μ.
- μ½λ 볡μ‘μ± μ¦κ°: νμ κ°λλ₯Ό κ³Όλνκ² μ¬μ©νλ©΄ μ½λμ 볡μ‘μ±μ΄ μ¦κ°ν μ μμ΄μ. κ°λ μ±κ³Ό μ μ§ κ΄λ¦¬μ μ΄λ €μμ νΌνκΈ° μν΄ νμν κ³³μλ§ μ μ ν μ¬μ©νλ κ²μ΄ μ€μν΄μ.
- νμ κ°λμ λ²μ μ ν: νμ μ€ν¬λ¦½νΈμ νμ μμ€ν μ μ»΄νμΌ μμ μ νμ μ κ²°μ νμ§λ§, νμ κ°λλ λ°νμμ λμν΄μ. λ°λΌμ μ»΄νμΌλ¬λ νμ κ°λκ° λ°νμμ μ¬λ°λ₯΄κ² μλνλ€κ³ κ°μ νμ§λ§, μ€μ λ°μ΄ν°μ μ½λμ λΆμΌμΉλ λ²κ·Έλ₯Ό μ λ°ν μ μμ΄μ.
π κ²°λ‘
νμ κ°λλ νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ κ°λ°μμκ² λ§€μ° μ€μν λꡬμμ. μ΄λ₯Ό νμ©νλ©΄ λ°νμμμ κ°μ²΄μ νμ μ μμ νκ² νμΈνκ³ , λ³΄λ€ μ ννκ³ μ μ°ν μ½λ μμ±μ΄ κ°λ₯ν΄μ Έμ. νμ κ°λλ₯Ό ν΅ν΄ λ€μκ³Ό κ°μ μ΄μ μ μ»μ μ μμ΄μ:
- νμ μμ μ± ν₯μ: νμ κ°λλ λ³μκ° μμν νμ μΈμ§ νμΈν¨μΌλ‘μ¨ μκΈ°μΉ λͺ»ν νμ μ€λ₯λ₯Ό λ°©μ§νκ³ , μ½λ μ 체μ μμ μ±μ λμ¬μ€μ.
- μ μ§ λ³΄μμ μ©μ΄μ±: λͺ νν νμ ꡬλΆμ ν΅ν΄ μ½λλ₯Ό μ΄ν΄νκ³ λλ²κ·ΈνκΈ°κ° λ μ¬μμ Έμ. μ΄λ μ₯κΈ°μ μΌλ‘ μ½λμ μ μ§ λ³΄μ λΉμ©μ μ€μ΄λ λ° λμμ΄ λΌμ.
- λ€μν νμ μ²λ¦¬ λ₯λ ₯: νμ κ°λλ₯Ό μ¬μ©νλ©΄ μ¬λ¬ νμ μ μ μ°νκ² μ²λ¦¬ν μ μμ΄, ν¨μλ λ©μλμ μ¬μ¬μ©μ±μ΄ λμμ Έμ.
νμ§λ§ νμ κ°λλ₯Ό μ¬μ©ν λλ μ£Όμν μ λ μμ΄μ. μ½λμ 볡μ‘μ±μ μ¦κ°μν¬ μ μκ³ , μλͺ»λ μ¬μ©μ λ²κ·Έλ‘ μ΄μ΄μ§ μ μκΈ° λλ¬Έμ, μ΄λ¬ν λꡬλ€μ μ¬μ©ν λλ νμ μ νν ꡬνκ³Ό μ μ ν ν μ€νΈκ° μλ°λμ΄μΌ ν΄μ. νμ κ°λμ μ¬λ°λ₯Έ μ΄ν΄μ μ μ ν νμ©μ νμ μ€ν¬λ¦½νΈ νλ‘μ νΈμ μ±κ³΅μ μ’μ°νλ μ€μν μμκ° λ κ²μ΄μμ.
π μΆκ° μ 보
- νμ μ€ν¬λ¦½νΈμ νμ κ°λμ λν λ κΉμ μ΄ν΄λ₯Ό μνμ λ€λ©΄, TypeScript 곡μ λ¬Έμμμ μμΈν μ 보λ₯Ό μ°Ύμλ³Ό μ μμ΄μ.
'Language > TypeScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[TypeScript] Never νμ (1) | 2024.10.06 |
---|---|
[TypeScript] μ΄κ±°ν(Enums) (2) | 2024.10.05 |
[TypeScript] μ‘°κ±΄λΆ νμ (0) | 2024.02.19 |
[TypeScript] Interfaceμ Typeμ μ°¨μ΄ (0) | 2023.12.21 |
ν¬μ€ν μ΄ μ’μλ€λ©΄ "μ’μμβ€οΈ" λλ "ꡬλ ππ»" ν΄μ£ΌμΈμ!