[타입스크립트] 타입 가드

Moon·2023년 7월 28일
0
post-thumbnail

타입 가드는 TypeScript에서 특정 범위 내에서 변수의 타입을 보장하는 런타임 체크다. 변수의 실제 타입을 확인하고, 그 결과를 타입 체크 시 사용할 수 있게 한다.

타입 단언 (as)

타입 단언은 개발자가 타입스크립트에게 해당 변수가 특정 타입임을 확신하게 해준다. as 키워드를 사용하여 이를 달성한다. 하지만, 개발자가 해당 변수의 타입을 잘못 단언하면 문제가 발생할 수 있으므로 주의해야 한다.

let someValue: any = "this is a string";

let strLength: number = (someValue as string).length;

위 코드에서 someValueany 타입이지만, as 키워드를 사용하여 string 타입으로 단언했다. 이 단언 덕분에 문자열의 length 속성을 안전하게 접근할 수 있다.

*타입 추론이 정확하지 않을때, 혹은 의도와 다르게 추론하고 있을때, as 키워드를 사용해서 타입을 단언해줄 수 있다.

타입 서술어(is)

타입 서술어는 사용자 정의 타입 가드를 생성하는 방법 중 하나다. is 키워드를 사용하여 특정 변수가 특정 타입인지 확인할 수 있다.

function isString(test: any): test is string {
    return typeof test === "string";
}

console.log(isString(123))//false
console.log(isString('123'))//true

function example(foo: any) {
    if (isString(foo)) {
        console.log("it is a string: " + foo);
    }
}

example('text') //[LOG]: "it is a string: text"

위 코드에서 isString 함수는 test is string 타입 서술어를 사용한다. 이는 test 변수가 string 타입인지 확인한다.

*리턴 타입이 타입 서술어(predicate)인 함수를 정의하여 사용한다.

*타입 가드란, 어떤 스코프 안에서 특정 타입을 보장하는 런타임 검사를 수행한다는 표현식이다.

in 연산자 사용하기

in 연산자는 객체가 특정 속성을 가지고 있는지 확인하는 데 사용된다. 이는 타입 가드에서 유용하게 사용될 수 있다.

interface Admin {
    admin: string;
}

interface User {
    user: string;
}

function performAdminOperation(obj: Admin | User) {
    if ('admin' in obj) {
        return obj.admin;
    }
    return 'Not an admin';
}

let admin: Admin = { admin: "I'm an admin" };
let user: User = { user: "I'm a user" };

console.log(performAdminOperation(admin)); // Output: "I'm an admin"
console.log(performAdminOperation(user)); // Output: "Not an admin"

위의 코드에서 adminuser 객체는 각각 AdminUser 타입이다. performAdminOperation 함수를 호출하면서 이들을 인자로 전달하면, in 연산자를 통해 Admin 타입의 객체인지 확인하고 결과를 출력한다.

instanceof 사용하기

instanceof 연산자는 생성자의 prototype 속성이 객체의 프로토타입 체인 어딘가에 존재하는지 확인하는 데 사용된다. 이는 타입 가드에서 클래스 인스턴스를 확인하는 데 유용하게 사용될 수 있다.

class Admin {
    admin = "I'm an admin";
}

class User {
    user = "I'm a user";
}

function performAdminOperation(obj: Admin | User) {
    if (obj instanceof Admin) {
        return obj.admin;
    }
    return 'Not an admin';
}

let admin = new Admin();
let user = new User();
console.log(admin instanceof Admin)//true
console.log(admin instanceof Admin)//false
console.log(performAdminOperation(admin)); // Output: "I'm an admin"
console.log(performAdminOperation(user)); // Output: "Not an admin"

위의 코드에서 adminuser 객체는 각각 AdminUser 클래스의 인스턴스이다. performAdminOperation 함수를 호출하면서 이들을 인자로 전달하면, instanceof 연산자를 통해 Admin 인스턴스인지 확인하고 결과를 출력한다.

타입 가드는 코드 내에서 변수의 타입을 안전하게 확인하고, 그 결과를 타입스크립트에게 전달하여 더 안정적인 코드를 작성하는 데 도움이 된다. 이를 통해 런타임에 타입 관련 에러를 방지하고, 코드의 안정성을 높일 수 있다.

profile
FE moon

0개의 댓글