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에게 종료하라고 알립니다(하지만 권장하지 않음). 도움이 되길 바랍니다
Reference
이 문제에 관하여(ReturnTypes | 코드리뷰 연대기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dvddpl/solve-not-all-code-paths-return-a-value-in-typescript-by-properly-using-returntypes-codereview-chronicles-15fb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)