본문 바로가기
front/ts

[The Basics] Non-exception Failures

by juniKang 2022. 5. 13.

지금까지(So far) 런타임 에러와 같은 특정 상황에 대해 논의해 왔다. - 자바스크립트 런타임이 무언가 논리적으로 맞지 않는다고 말해주는 경우; 이런 경우들은 the ECMAScript specification이 뜻하지 않은대로 동작할 때 언어가 어떻게 행동해야할지 명시적으로 지시(instructions)했기 때문에 발생한다. 

 

예를들면, 스펙(specification)은 호출할수 없는 무언가에 호출을 시도했을 때 error를 던지라고 말한다. 아마도 이건"납득이 가능 행동"처럼 들린다, 하지만, 오브젝트에 존재하지 않는 프로퍼티에 접근할 때 마다 에러를 던진다고 상상해보라. 대신에, 자바스크립트는 다른 동작을 제공하고, undefined값을 리턴한다:

const user = {
  name: "Daniel",
  age: 26,
};

user.location; // returns undefined

궁극적으로, 정적인 타입 시스템은 코드가 시스템에서 에러의 플래그가 되는 콜오버를 만들어왔다. 심지어 즉시 에러를 던지지 않는 유효한 자바스크립트 일지라도... 타입스크립트에서, 다음의 코드는 정의되지 않은 location에 대한 에러를 만든다:

const user = {
  name: "Daniel",
  age: 26,
};

user.location;
// Property 'location' does not exist on type '{ name: string; age: number; }'.

때떄로 이런 표현이 나중에 유효할 수 있다는걸 의미하지만, 의도는 이런 합벅적인 버그를 잡는 것이다. 타입스크립트는 많은 합법적인 버그들을 잡는다.

 

예를 들어: 오타,

const announcement = "Hello World!";
 
// How quickly can you spot the typos?
announcement.toLocaleLowercase();
announcement.toLocalLowerCase();
 
// We probably meant to write this...
announcement.toLocaleLowerCase();

호출되지 않은 함수,

function flipCoin() {
  // Math.random()을 의미
  return Math.random < 0.5;
  // Operator '<' cannot be applied to types '() => number' and 'number'.
}

또는 기본적인 로직 에러들

const value = Math.random() < 0.5 ? "a" : "b";
if (value !== "a") {
  // ...
} else if (value ==="b") {
//This condition will always return 'false' since the types '"a"' and '"b"' have no overlap.
  // Oops, unreachable
}

'front > ts' 카테고리의 다른 글

[The Basics] Explicit Types  (0) 2022.05.16
[The Basics] Emitting with Errors  (0) 2022.05.16
[The Basics] tsc, the TypeScript compiler  (0) 2022.05.13
The TypeScript Handbook  (0) 2022.05.11
TypeScript for JavaScript Programmers  (0) 2022.04.28

댓글