|
| 1 | +//// { order: 3, compiler: { strictNullChecks: false } } |
| 2 | + |
| 3 | +// JavaScript는 존재하지 않는 값을 선언하는 두 가지 방법을 갖고 있으며, |
| 4 | +// TypeScript는 어떤 대상을 선택적 또는 null 허용으로 선언하기 위해 |
| 5 | +// 더 많은 방법도 가능하게 하는 추가 구문을 추가합니다. |
| 6 | + |
| 7 | +// 먼저, 두 가지 JavaScript 기본형의 |
| 8 | +// 차이점입니다: undefined와 null |
| 9 | + |
| 10 | +// undefined는 어떤 대상을 찾지 못했거나 설정되지 않은 경우입니다 |
| 11 | + |
| 12 | +const emptyObj = {}; |
| 13 | +const anUndefinedProperty: undefined = emptyObj["anything"]; |
| 14 | + |
| 15 | +// null은 의도적으로 |
| 16 | +// 값이 없다고 할 때 사용합니다. |
| 17 | + |
| 18 | +const searchResults = { |
| 19 | + video: { name: "LEGO Movie" }, |
| 20 | + text: null, |
| 21 | + audio: { name: "LEGO Movie Soundtrack" }, |
| 22 | +}; |
| 23 | + |
| 24 | +// 왜 undefined를 사용하지 않을까요? |
| 25 | +// 주로, text가 올바르게 포함됐는지 확인할 수 있기 때문입니다. |
| 26 | +// text를 undefined로 반환하면 |
| 27 | +// 결과는 존재하지 않았던 것과 동일합니다. |
| 28 | + |
| 29 | +// 약간 표면적으로 느껴질 수 있지만, |
| 30 | +// JSON 문자열로 변환했을 때 text가 undefined라면, |
| 31 | +// 다른 문자열과 동등하게 포함되지 않을 수 있습니다. |
| 32 | + |
| 33 | +// 엄격한 Null 타입 |
| 34 | + |
| 35 | +// TypeScript 2.0 이전에는 undefined와 null이 타입 시스템에서 사실상 무시됐었습니다. |
| 36 | +// 엄격한 Null 타입은 TypeScript가 타입화 되지 않은 |
| 37 | +// JavaScript에 더 가까운 코딩 환경을 제공해줍니다. |
| 38 | + |
| 39 | +// 2.0 버전은 "strictNullChecks"라고 불리는 컴파일러 플래그를 추가했고 |
| 40 | +// 이 플래그는 사람들이 undefined와 null을 |
| 41 | +// 코드 흐름 분석을 통해 다뤄줘야 하는 타입으로 취급하도록 요구했습니다. |
| 42 | +// ( 예시:code-flow에서 더 살펴볼 수 있습니다 ) |
| 43 | + |
| 44 | +// TypeScript에 정적 null 검사가 동작하는 차이점의 예시는, |
| 45 | +// 아래 "Potential String"를 호버해보세요: |
| 46 | + |
| 47 | +type PotentialString = string | undefined | null; |
| 48 | + |
| 49 | +// PotentialString은 undefined와 null을 버립니다. |
| 50 | +// 설정으로 올라가서 strict 모드를 동작시키고 돌아온 뒤, |
| 51 | +// PotentialString 위에 호버하면 |
| 52 | +// 이제 전체 유니언이 표시되는 것을 볼 수 있습니다. |
| 53 | + |
| 54 | +declare function getID(): PotentialString; |
| 55 | + |
| 56 | +const userID = getID(); |
| 57 | +console.log("User Logged in: ", userID.toUpperCase()); |
| 58 | + |
| 59 | +// strict 모드에서만 위 코드는 실패합니다 ^ |
| 60 | + |
| 61 | +// 타입 단언 또는 null이 아닌 단언 연산자(!)와 같은 것을 이용하여 |
| 62 | +// TypeScript에 여러분이 더 많이 알고 있다고 알려주는 방법이 있습니다 |
| 63 | + |
| 64 | +const definitelyString1 = getID() as string; |
| 65 | +const definitelyString2 = getID()!; |
| 66 | + |
| 67 | +// 또는 if를 사용하여 존재 여부를 안전하게 검사할 수 있습니다: |
| 68 | + |
| 69 | +if (userID) { |
| 70 | + console.log(userID); |
| 71 | +} |
| 72 | + |
| 73 | +// 선택적 프로퍼티 |
| 74 | + |
| 75 | +// Void |
| 76 | + |
| 77 | +// Void는 값을 반환하지 않는 |
| 78 | +// 함수의 반환 타입입니다. |
| 79 | + |
| 80 | +const voidFunction = () => {}; |
| 81 | +const resultOfVoidFunction = voidFunction(); |
| 82 | + |
| 83 | +// 이건 보통 실수이며, |
| 84 | +// TypeScript는 컴파일러 오류를 얻도록 void 타입을 유지합니다 |
| 85 | +// - 런타임 중에 정의되지 않더라도 해당됩니다. |
0 commit comments