본문 바로가기

개발하자

인라인에서 null 값을 확인하고 타이프스크립트에서 오류를 던지는 방법은?

반응형

인라인에서 null 값을 확인하고 타이프스크립트에서 오류를 던지는 방법은?

C#에서 null 참조를 확인하기 위해 코드를 작성할 수 있으며 사용자 지정 예외를 입력하는 경우 예:

var myValue = (someObject?.SomeProperty ?? throw new Exception("...")).SomeProperty;

최근 업데이트에서 TypeScript는 null 병합 연산자를 소개했습니다?? 그러나 위 문구와 같이 사용하면 컴파일 오류가 발생합니다. TypeScript에 비슷한 허용 구문이 있습니까?


명확하게 설명하자면, 원하는 동작은 다음과 같은 코드로 달성된다:

  if(someObject?.someProperty == null) {
    throw new Error("...");
  }

  var myValue = someObject.someProperty.someProperty;

코드:

  var myValue = someObject?.someProperty.someProperty;

논리적으로는 괜찮지만 덜 의미 있는 예외를 던집니다.




구문 오류의 이유는 문이므로 연산자에게 피연산자로 사용할 수 없기 때문입니다.

현재 2단계에 있는 TC39 프로세스를 통해 작동 중입니다. 스테이지 3에 도달하면 이후 곧 TypeScript에 나타날 것으로 예상할 수 있다. (2020년 말 업데이트: 하지만 TC39 회원이 자신들이 2020년 말에 아직 스테이지 1이라고 생각하지 않았기 때문에 교착 상태에 빠진 것으로 보인다.)

식을 사용하여 다음과 같이 쓸 수 있습니다(의 값을 원하는 경우):

const myValue = someObject?.someProperty ?? throw new Error("custom error here");

원하는 경우(C# 버전이 그렇게 생각합니다):

const myValue = (someObject?.someProperty ?? throw new Error("custom error here")).someProperty;

지금 사용할 수 있는 게 있어요. Babel's REPL에서.


사이드 노트: 오류를 던지고 싶다고 하셨지만, 사용자 정의 오류가 필요 없는 이 글을 읽는 다른 사람들을 위해:

원하는 경우 /이면 오류가 없지만 /이면 오류가 발생하면 다음 작업을 수행할 수 있습니다:

const myValue = someObject?.someProperty.someProperty;

다음과 같이 하십시오:

  • if 또는 if 가 값을 얻을 것이다
  • is not, but is or 가 있으면 첫번째 이후에 사용하지 않아서 오류가 발생합니다.
  • 와 가 둘 다 아니면 을 검색한 결과를 얻을 것입니다.



TypeScript가 이것을 네이티브로 지원하지 않는 한, 당신은 이것과 비슷한 함수를 쓸 수 있다:

function throwExpression(errorMessage: string): never {
  throw new Error(errorMessage);
}

그러면 식으로 오류를 던질 수 있게 됩니다:

const myString = nullableVariable ?? throwExpression("nullableVariable is null or undefined")



한 줄 안에 오류를 던지고 싶다면 즉시 호출된 함수 표현식으로 나타낼 수 있습니다:

const test = null ?? (() => {throw new Error("Test is nullish")})();




파티에 좀 늦었지만, 아마 이게 네가 원하는 거겠지. 파일에 집어넣었어요:

export function ensuredDefined<T>(item: T | undefined, message?: string): T {
  if (item === undefined) {
    throw new Error(message ?? 'item is undefined');
  }
  return item;
}

완전 공개 아직 테스트 안 했는데 이게 네가 원하는 거 같아.

그래서 대신에

const color = unusedColors.shift();
if (color === undefined) {
  throw new Error(...);
}
player.color = color;

있습니다

player.color = ensuredDefined(unusedColors.shift());

그 말은 네가 글을 쓸 수 있다는 뜻일 거야

var myValue = ensureDefined(someObject?.someProperty).someProperty

반응형