ReturnTypes | 코드리뷰 연대기

최근에 코드 검토 중에 무해하지만 주의를 환기시키는 몇 가지 코드를 발견했습니다.

const convertSomeValues = (val: string)  => {
   if (val == "flour") {
       return "bread"
   }
   else if (val == "apple") {
       return "fruitsalad"
   }
   else if (val == "meat") {
       // nope! I am vegetarian 
       return null
   }
   return null
}


내가 이상한 점을 발견할 수 있습니까?

아니요, elseifs 도 아니고 모든 것이 a switch case 또는 a Dictionary/Map 일 수 있다는 것도 아닙니다.

Why do we have those return null?



예, 일치하는 항목이 없으면 아무 것도 반환하지 않아야 하는데 왜 null을 반환해야 합니까? 그냥 버리면 안 될까요?

개발자는 그가 정확히 그것을 시도했지만 typescript가 불평하고 있다고 대답했습니다.

Typescript 컴파일 오류





Not all code paths return a value in TypeScript



네, 맞습니다. 제 코드는 아무 것도 반환하지 않습니다. 그렇게 추론할 수 있습니까, 이 멍청한 컴파일러?

물론 그렇게 말할 수 있습니다.

빠른 Google 검색을 통해 TypeScript 구성 파일에 사용할 수 있는 이 옵션을 찾았습니다.

NoImplicitReturns

When enabled, TypeScript will check all code paths in a function to ensure they return a value.



자, 해결책은 그냥 비활성화하는 것입니다!! 예이!

음.. 별로.

규칙 규칙 규칙...



또는 예일 수도 있지만, Linter 규칙(또는 Typescript 구성)처럼 독단적일 수 있으므로, 누군가가 그러한 규칙을 만드는 데 너무 귀찮은 경우 아마도 .

그리고 이 규칙은 우리가 몇몇 고약한 오류를 잡을 수 있게 해주기 때문에 절대적으로 의미가 있습니다. 특히 having to do with loops 또는 화살표 함수에서/로 일부 코드를 리팩터링할 때 반환을 잊어버리고 상황이 이상하게 작동하기 시작할 수 있습니다.
이것을 상상해보십시오.

const convertValues = (val: string)  => (val == "flour") ? "bread" : null

const convertMoreValues = (val: string)  => {
   if (val == "flour") {
      "bread"
   }
   // todo add cases stuff here
}


예를 들어 다른 조건을 추가하고 싶고 반환을 추가하는 것을 잊었기 때문에 삼항 연산자(및 기본 반환)가 있는 이 간단한 화살표 함수를 적절한 괄호로 묶은 방법으로 변환하면 if 블록은 아무것도 반환하지 않고 모든 것이 부서지다.

그렇기 때문에 비활성화하는 것은 좋은 생각이 아닙니다noImplicitReturns.

그러면 우리는 무엇을 할 수 있습니까?

어디에서나 return null를 고수해야 합니까?

더 깊이 파고들다



우선 우리는 우리의 방법이 의미가 있는지 고려하기 시작해야 합니다. 아마도 오류가 더 의미가 있거나 적어도 일치하는 항목이 없는 이유를 설명하는 문자열일 것입니다.

const convertValues = (val: string) => {
    switch (val) {
        case "flour":
            return "bread"
        case "apple":
            return "fruitsalad"
        case "meat" :
            throw new Error('PreferVegetarianDietError')
        default:
            throw new Error('NoMatchFoundError')
    }
}


그러나 어떤 이유로 인해 레거시 구현으로 인해 오류를 발생시키거나 다른 값을 반환할 수 없기 때문에 메서드가 단순히 무언가를 변환하고 나머지는 모두 무시해야 한다고 가정해 보겠습니다. 이 경우 아무 것도 반환하지 않아도 됩니다.

하지만 더 명시적으로 만들어야 하지 않겠습니까?
우리의 메서드(따라서 Typescript도)를 사용하는 개발자에게 메서드가 실제로 문자열을 반환하거나 아무것도 반환하지 않을 수 있음을 어떻게 알릴 수 있습니까?

음, 반환 유형을 사용하여!

const convertSomeValues = (val: string): string | void  => {
   if (val == "flour") {
       return "bread"
   }
   if (val == "apple") {
       return "fruitsalad"
   }
}


여기서는 결과에 별로 관심이 없었기 때문에 void를 사용했습니다. 문자열이던 상관없던, 정말 null이나 정의되지 않은 값이 필요하다면 Return Typestring | null을 사용한 다음 return null를 고수할 수 있습니다(그러나 적어도 이것은 더 많은 가시성과 의미를 가집니다. ).

요약



반환 유형에 대해 Typescript가 잔소리하는 경우:
  • 방법을 다시 확인하십시오. 실제로 잊고 있는 것이 있을 수 있습니다.
  • 다른 관점에서 방법을 고려하기 시작하십시오. 유형을 사용하여 가독성과 개발자 경험을 보다 구체적으로 개선할 수 있습니까?
  • noImplicitReturns (또는 이벤트 @ts-ignore )를 사용하여 TS에게 종료하라고 알립니다(하지만 권장하지 않음).
  • 단순히 증상을 멈추고 치료하는 것이 아니라 항상 무언가에 대한 원인과 이유를 찾으려고 노력합니다.
  • 은(는) 관련 당사자 모두에게 학습 기회임을 기억하십시오.

  • 도움이 되길 바랍니다

    좋은 웹페이지 즐겨찾기