[TypeScript] 타입스크립트 옵셔널 체이닝 (Optional Chaining)
글 작성자: 망고좋아
반응형
🎯 타입스크립트 옵셔널 체이닝 (Optional Chaining)
- 옵셔널 체이닝은 객체뿐만 아니라 배열과 함수에도 사용할 수 있다.
- 접근하는 객체의 프로퍼티가 null 또는 undefined일 수 있는 optional property인 경우 if 문을 사용하지 않고 넘어가게 하는 체이닝 방법이다.
- es2020에서 추가된 문법이며 객체가 null 또는 undefined이면 undefined를 리턴하고 그렇지 않은 경우 데이터 값을 리턴한다.
- 프로그래밍에서
?
는 보통 옵셔널을 뜻한다. 있을 수도 있고 없을 수도 있다.ex) data?.property
📝 &&와 ?.의 차이점은?
📕 && 사용
type Dog = {
hasTail: boolean;
살랑살랑: () => string;
};
/*
hasTail이 true인 경우 반환값은 string이지만
false인 경우 && 연산자(and 연산자)에 의해 dog.hasTail을 반환
따라서 의도와는 달리 string 또는 false를 반환하게 됨
*/
function 꼬리살랑살랑(dog: Dog): string {
// -> string | false
return dog.hasTail && dog.살랑살랑();
// dog.hasTail이 true면 뒤에 연산자(dog.살랑살랑())를 실행, 만약 false면 논리 연산자가 앞에 걸(dog.hasTail) 반환시킨다.
// 우리의 의도는 string을 반환하는건데 dog.hasTail가 false면 boolean 값을 반환한다.
/*
이렇게 써야 함
if (dog.hasTail) {
dog.살랑살랑();
}
*/
}
- 논리 연산자는(&&) falsy(false, null, undefined, ‘’, 0, -0, NaN) 값 체크한다.
- falsy 한 값이란? false로 평가될 수 있는 값을 의미한다.
📕 Optional Chaining 사용
type Dog = {
tail?: {
살랑살랑: () => string;
};
};
// Dog에 tail이라는 객체가 있고 그 안에 살랑살랑이라는 메서드가 있다.
function 꼬리살랑살랑(dog: Dog): string {
return dog.tail?.살랑살랑();
// tail이라는 객체가 있다면 살랑살랑 메서드를 호출
// 주의!! 만약 undefined가 아니면 살랑살랑을 호출하겠지만, 만약 tail이 null or undefined면 옵셔널 체이닝에 의해서 undefined를 리턴한다.
}
?.
는 null과 undefined만 체크한다.- 객체 접근:
obj?.name
obj가 null, undefined가 아니면 name을 리턴 - 배열 접근:
arr?.[0]
arr이 null, undefined가 아니면 첫 번째 요소를 리턴 - 함수 호출:
func?.()
함수 func이 null, undefined가 아니면 func 함수 호출
📝 옵셔널 체이닝은 객체뿐만 아니라 배열과 함수에도 사용할 수 있다.
//Object
type CustomResponse = {
data: any;
};
const findData = (response?: CustomResponse) => {
return response?.data;
};
//Array
type Post = {
comments?: string[];
};
const getFirstComment = (post: Post) => {
return post.comments?.[0]; // index로 접근할 때도 사용 가능
};
type Cat = {
sitDown?: () => void;
};
function trainCat(cat: Cat) {
cat.sitDown?.(); // ** sitDown이라는 함수가 cat 객체이 있을 때 호출 가능or undefined로 실행 X
}
📝 옵셔널 체이닝을 사용하면 if문을 줄여준다.
📕 if문 사용
type Tail = {
살랑살랑: () => void;
};
type Human = {
call: (dogName: string) => void;
};
type Dog = {
name: string;
tail?: Tail;
주인?: Human;
};
function petDog(dog: Dog) {
// != null: null 또는 undefined가 아닌 경우
// 가독성이 안 좋아진다.
if (dog.주인 != null) {
dog.주인.call(dog.name);
}
if (dog.tail != null) {
dog.tail.살랑살랑();
}
}
📕 if문 대신 옵셔널 체이닝 사용
type Tail = {
살랑살랑: () => void;
};
type Human = {
call: (dogName: string) => void;
};
type Dog = {
name: string;
tail?: Tail;
주인?: Human;
};
function petDog(dog: Dog) {
dog.주인?.call(dog.name); // **
dog.tail?.살랑살랑(); // **
}
- 코드가 간결해진다.
- 그러나 if문과 같이 분기 처리를 해줘야 된다. 주인이 없다면 에러를 던지는 처리를 해줘야 된다.
반응형
'프로그래밍 > TypeScript' 카테고리의 다른 글
[TypeScript] 타입스크립트 함수 오버로딩 : Function Overloading (1) | 2021.11.29 |
---|---|
[TypeScript] 타입스크립트 null 병합 연산자 (Nullish Coalescing Operator) (1) | 2021.11.29 |
[TypeScript] 타입스크립트 타입 가드 (Type Guard) (0) | 2021.11.29 |
[TypeScript] 타입스크립트 유니온 타입 & 인터섹션 타입 (Union Type & Intersection Type) (0) | 2021.11.29 |
[TypeScript] 타입스크립트 제네릭(Generic), Factory Pattern with Generics (0) | 2021.11.27 |
댓글
이 글 공유하기
다른 글
-
[TypeScript] 타입스크립트 함수 오버로딩 : Function Overloading
[TypeScript] 타입스크립트 함수 오버로딩 : Function Overloading
2021.11.29 -
[TypeScript] 타입스크립트 null 병합 연산자 (Nullish Coalescing Operator)
[TypeScript] 타입스크립트 null 병합 연산자 (Nullish Coalescing Operator)
2021.11.29 -
[TypeScript] 타입스크립트 타입 가드 (Type Guard)
[TypeScript] 타입스크립트 타입 가드 (Type Guard)
2021.11.29 -
[TypeScript] 타입스크립트 유니온 타입 & 인터섹션 타입 (Union Type & Intersection Type)
[TypeScript] 타입스크립트 유니온 타입 & 인터섹션 타입 (Union Type & Intersection Type)
2021.11.29