Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- sql 문자열 패턴 검색
- @Moditying @Query
- 배엘에서 스왑
- 재귀스왑
- 중첩배열평탄화
- 깃 토큰 만료
- 우분투 시간 변경
- 문자열순서바꾸기
- 시퀄 문법
- 문자열 중복
- 중첩배열
- 5.3.8 Modifying Queries
- 제로베이스
- 중복된 단어
- lastIndexOf()
- js 문자열을 문자배열로
- 프론트엔드 스쿨
- 객체의키값만 찾기
- ...점점점문법
- 단어 제거
- 객체의 밸류값만 찾기
- 중복 문자열
- 중복문자제거
- 레디스 확인
- 스프링 데이타 JPA
- 코딩 어?
- indexOf()
- ubuntu타임존
- sql like연산자
- 중복단어제거
Archives
- Today
- Total
코딩기록
TS) 타입가드 Type Guard 본문
728x90
타입 가드(Type Guard)**는 TypeScript에서 특정 값이 어떤 타입인지 판별하는 기능.
유니온 타입이나 타입이 확실하지 않은 값을 처리할 때 매우 유용.
✅ 타입 가드(Type Guard)란?
타입 가드는 런타임에서 타입을 좁히는(Narrowing) 역할.
즉, 특정 조건을 만족하면 TypeScript가 해당 변수의 타입을 더 구체적으로 인식할 수 있도록 도와줌.
예제) 타입 가드 없이 타입 오류 발생 🚨
function printLength(value: string | number) {
console.log(value.length); // ❌ 오류: 'number'에는 'length' 속성이 없음
}
위 코드는 number 타입에는 length 속성이 없기 때문에 오류가 발생.
✅ 타입 가드를 사용하면 이를 해결할 수 있음.
🔹 1. typeof 타입 가드
가장 기본적인 방법으로 typeof 연산자를 사용하여 타입을 판별합.
function printLength(value: string | number) {
if (typeof value === "string") {
console.log(value.length); // ✅ 문자열이면 length 사용 가능
} else {
console.log(value); // ✅ 숫자라면 그냥 출력
}
}
printLength("hello"); // 5
printLength(1234); // 1234
🔍 typeof가 검사할 수 있는 타입
typeof는 **기본 타입(primitive type)**만 검사할 수 있음.
타입 typeof 결과
string | "string" |
number | "number" |
boolean | "boolean" |
bigint | "bigint" |
symbol | "symbol" |
undefined | "undefined" |
function | "function" |
object | "object" (배열, 객체, null 포함) |
🔹 2. instanceof 타입 가드
클래스(객체) 타입을 판별할 때 instanceof를 사용.
class Dog {
bark() {
console.log("멍멍!");
}
}
class Cat {
meow() {
console.log("야옹!");
}
}
function makeSound(animal: Dog | Cat) {
if (animal instanceof Dog) {
animal.bark(); // ✅ Dog 타입이면 bark() 사용 가능
} else {
animal.meow(); // ✅ Cat 타입이면 meow() 사용 가능
}
}
makeSound(new Dog()); // "멍멍!"
makeSound(new Cat()); // "야옹!"
- instanceof는 객체의 생성자를 기반으로 타입을 판별.
- Dog인지 Cat인지 판별하여 적절한 메서드를 호출할 수 있음.
🔹 3. in 연산자 타입 가드
객체에 특정 속성이 존재하는지를 검사하는 방식.
type User = { name: string; email: string };
type Admin = { name: string; permissions: string[] };
function printUserInfo(person: User | Admin) {
if ("email" in person) {
console.log(`User Email: ${person.email}`); // ✅ User 타입이면 email 사용 가능
} else {
console.log(`Admin Permissions: ${person.permissions.join(", ")}`); // ✅ Admin 타입이면 permissions 사용 가능
}
}
printUserInfo({ name: "Alice", email: "alice@example.com" }); // User Email: alice@example.com
printUserInfo({ name: "Bob", permissions: ["read", "write"] }); // Admin Permissions: read, write
- "email" in person을 사용하여 User 타입인지 확인
- "permissions" in person을 사용하여 Admin 타입인지 확인
🔹 4. 사용자 정의 타입 가드 (is 키워드)
함수의 반환 타입을 param is Type 형식으로 지정하여 직접 타입을 판별할 수 있음.
type Car = { brand: string; speed: number };
type Bike = { brand: string; gears: number };
function isCar(vehicle: Car | Bike): vehicle is Car {
return "speed" in vehicle;
}
function describeVehicle(vehicle: Car | Bike) {
if (isCar(vehicle)) {
console.log(`Car brand: ${vehicle.brand}, Speed: ${vehicle.speed}`);
} else {
console.log(`Bike brand: ${vehicle.brand}, Gears: ${vehicle.gears}`);
}
}
describeVehicle({ brand: "Toyota", speed: 120 }); // Car brand: Toyota, Speed: 120
describeVehicle({ brand: "Giant", gears: 18 }); // Bike brand: Giant, Gears: 18
- isCar(vehicle)을 통해 Car 타입인지 판별
- vehicle is Car를 반환 타입으로 지정하면, if (isCar(vehicle)) 내부에서 vehicle이 Car 타입으로 추론됨
✅ 정리
방법 사용 대상 예시
typeof | 기본 타입(string, number, boolean 등) | if (typeof value === "string") |
instanceof | 클래스(객체) | if (obj instanceof ClassName) |
in 연산자 | 객체의 속성 검사 | if ("property" in obj) |
사용자 정의 타입 가드 (is) | 커스텀 타입 검사 | function isCar(obj): obj is Car |
TypeScript에서 타입 가드를 활용하면 더 안전하고 예측 가능한 코드를 작성할 수 있음
참고 쳇 gpt, 제로베이스강의
반응형
'프론트 > 리액트' 카테고리의 다른 글
vscode로 리액트 타입스트립트 프로젝트 만들기1 - 셋팅 설정파일들 package.json, .eslintrc.js, tsconfig.json, prettierrc.js, reportWebVitals.ts (1) | 2025.02.07 |
---|---|
vscode로 리액트 타입스트립트 프로젝트 만들기2 - 서비스 만들기 메인 코드 (0) | 2025.02.07 |
vscode로 eslint + prettier + 리액트 타입스크립트 프로젝트 생성 (2) | 2025.02.04 |
TS) Vite로 React + TypeScript 템플릿 생성 (0) | 2025.02.03 |
리액트) React의 hook, useEffect() 의존성 배열이 있을때, 없을때 (0) | 2025.01.07 |
Comments