체인의정석

Optional chainning 사용하기, optional chainning을 사용할 수 없는 경우 해결 방안 본문

개발/backend

Optional chainning 사용하기, optional chainning을 사용할 수 없는 경우 해결 방안

체인의정석 2021. 7. 29. 14:44
728x90
반응형

optional chainning을 이용하면 아래와 같이 null이나 undeifined 같은 케이스를 짧은 구문으로 검사할 수 있다.

아래와 같이 foo 밑에 있는 foo bar, foo bar, baz 가 null 이거나 undeifined인지 체크하는 구문을 단축 시킬 수 있다. 

 

optional chainning 은 중간에 없는 요소가 나오면 undefined를 리턴하고, 중간에 요소가 모두 있으면 계속해서 실행되게 된다.

// Before
if (foo && foo.bar && foo.bar.baz) {
  // ...
}
// After-ish
if (foo?.bar?.baz) {
  // ...
}

 

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html

 

Documentation - TypeScript 3.7

TypeScript 3.7 Release Notes

www.typescriptlang.org

 

이를 이용하여 코드를 아래와 같이 수정할 수 있었다.

 

원래 코드

    if (naturalPersonType.geographicAddress) {
      this.geographicAddress = naturalPersonType.geographicAddress;
    }

 

수정한 코드

    this.geographicAddress = naturalPersonType?.geographicAddress;

 

다만, optional chainning을 다음과 같은 경우에는 사용할 수 없었다.

 

Case 01.

    if (naturalPersonType.countryOfRegistration) {
      this.countryOfRegistration = checkCountryCode(naturalPersonType.countryOfRegistration);
    }

그 이유는 optional chainning 문법을 쓸때 undeifined 나 null에 대한 검사를 수행하기 때문에 함수의 입력값안에 optional chainning을 입력하면 undeifined가 입력값의 타입에 맞지 않는다고 뜨게 된다. 따라서 이 경우 먼저 검사를 하고 input으로 넣어주는 식으로 바꿔야 한다.

 

 

Case 02.

      ...(json.localNameIdentifier && {
        localNameIdentifier: json.localNameIdentifier.map((localNameId: LocalLegalPersonNameIDType) => {
          return LocalLegalPersonNameID.fromJson(localNameId);
        }),
      }),

위와 같이 nameIdentifier 를 먼저 존재하는지 검사하고 난 후에 이 값을 넘겨서 하는 경우

      localNameIdentifier: json?.localNameIdentifier.map((nameId: LocalLegalPersonNameIDType) => {
        return LocalLegalPersonNameIDType.fromJson(nameId);
      }),

아래와 같이 optional chainning을 써서 만들 수 없다.  optionalChainning이 들어가는 값이 필수요소가 아닌 선택적 요소라면 그 순간 undefined 가 들어올 가능성이 생기게 되고 LocalLegalPersonNameIDType에는 undeifined가 들어가면 에러가 나게 된다. 따라서 이전에 미리 undeifined가 들어오는 경우 실행이 중단되게 만들어야 하기 때문에 if 문을 쓰거나 위와 같은 스프레드 문을 써서 처리하면 된다.

 

 

결론!

따라서 class 안에 여러 타입이 있고 이것이 선택적 파라미터일 경우 이더라도 그 파라미터가 다른 함수의 input으로 들어가서 체크 로직을 타고 들어거나 하위 객체로 들어갈 시에는 optional chainng을 사용할 수 없다.

728x90
반응형
Comments