|
| 1 | +// TypeScript의 추론으로 제공되는 정보로도 충분합니다만, |
| 2 | +// 함수의 형태를 문서화하는 |
| 3 | +// 다양한 방법을 제공하는 많은 방식이 있습니다. |
| 4 | + |
| 5 | +// 우선 좋은 위치는 선택적 매개변수를 살펴보는 것입니다. |
| 6 | +// 이는 매개변수를 생략할 수 있다는 것을 알려주는 방법입니다. |
| 7 | + |
| 8 | +let i = 0; |
| 9 | +const incrementIndex = (value?: number) => { |
| 10 | + i += value === undefined ? 1 : value; |
| 11 | +}; |
| 12 | + |
| 13 | +// 이 함수는 다음과 같이 호출할 수 있습니다: |
| 14 | + |
| 15 | +incrementIndex(); |
| 16 | +incrementIndex(0); |
| 17 | +incrementIndex(3); |
| 18 | + |
| 19 | +// 함수를 작성할 때 타입 추론을 제공하는 |
| 20 | +// 함수 매개변수를 입력할 수 있습니다. |
| 21 | + |
| 22 | +const callbackWithIndex = (callback: (i: number) => void) => { |
| 23 | + callback(i); |
| 24 | +}; |
| 25 | + |
| 26 | +// 함수 인터페이스를 임베딩하면 |
| 27 | +// 화살표 때문에 읽기 어려울 수 있습니다. |
| 28 | +// 타입 별칭을 사용하여 함수 매개변수에 이름을 지정하게 합니다. |
| 29 | + |
| 30 | +type NumberCallback = (i: number) => void; |
| 31 | +const callbackWithIndex2 = (callback: NumberCallback) => { |
| 32 | + callback(i); |
| 33 | +}; |
| 34 | + |
| 35 | +// 다음과 같이 호출할 수 있습니다: |
| 36 | + |
| 37 | +callbackWithIndex(index => { |
| 38 | + console.log(index); |
| 39 | +}); |
| 40 | + |
| 41 | +// 위에 있는 index에 호버하면 |
| 42 | +// TypeScript가 index를 숫자로 정확히 추론한 것을 확인해볼 수 있습니다. |
| 43 | + |
| 44 | +// 인스턴스 참조로 함수를 전달할 때도, TypeScript 추론은 동작합니다. |
| 45 | +// 확인하기 위해, |
| 46 | +// number를 string으로 변경했던 함수를 사용합니다: |
| 47 | + |
| 48 | +const numberToString = (n: number) => { |
| 49 | + return n.toString(); |
| 50 | +}; |
| 51 | + |
| 52 | +// 모든 number를 string으로 변환하기 위하여 |
| 53 | +// 배열에 map과 같은 함수에서 사용할 수 있으며, |
| 54 | +// 아래에 있는 stringedNumbers에 호버해보면 예상된 타입을 확인할 수 있습니다. |
| 55 | +const stringedNumbers = [1, 4, 6, 10].map(i => numberToString(i)); |
| 56 | + |
| 57 | +// 코드를 간소화하여, 직접 함수를 전달할 수 있고 |
| 58 | +// 더 집중된 코드로 동일한 결과를 얻을 수 있습니다: |
| 59 | +const stringedNumbersTerse = [1, 4, 6, 10].map(numberToString); |
| 60 | + |
| 61 | +// 많은 타입을 수용하는 함수가 있을 수도 있지만, |
| 62 | +// 몇 개의 프로퍼티에만 관심이 있을 것입니다. |
| 63 | +// 이것은 타입에서 색인 된 시그니처에 대한 유용한 사례입니다. |
| 64 | +// 다음 타입은 이 함수가 프로퍼티 이름이 포함되어 있다면 |
| 65 | +// 어떠한 객체도 사용해도 괜찮다고 선언합니다: |
| 66 | + |
| 67 | +interface AnyObjectButMustHaveName { |
| 68 | + name: string; |
| 69 | + [key: string]: any; |
| 70 | +} |
| 71 | + |
| 72 | +const printFormattedName = (input: AnyObjectButMustHaveName) => {}; |
| 73 | + |
| 74 | +printFormattedName({ name: "joey" }); |
| 75 | +printFormattedName({ name: "joey", age: 23 }); |
| 76 | + |
| 77 | +// index-signatures에 관해 더 배우고 싶다면 |
| 78 | +// 다음 내용을 권장합니다: |
| 79 | +// |
| 80 | +// https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks |
| 81 | +// https://basarat.gitbooks.io/typescript/docs/types/index-signatures.html |
| 82 | + |
| 83 | +// tsconfig flag인 suppressExcessPropertyErrors를 통해 |
| 84 | +// 모든 곳에서 이런 종류의 동작을 또한 허용할 수 있다고 |
| 85 | +// 하지만, 여러분의 API를 사용하는 다른 사람이 |
| 86 | +// 이 설정을 해제했는지는 알 수 없습니다. |
| 87 | + |
| 88 | +// JavaScript에 있는 함수는 다른 매개변수 모음을 허용합니다. |
| 89 | +// 설명을 위한 두 가지 공통 패턴이 있습니다: |
| 90 | +// 매개변수 또는 반환에 대한 유니언 타입과 함수 오버로드. |
| 91 | + |
| 92 | +// 매개변수에 유니언 타입을 사용하는 것은 |
| 93 | +// 한 개 또는 두 개의 변경 점만 있고, |
| 94 | +// 함수 간에 문서 변경이 필요하지 않는 경우에 의미 있습니다. |
| 95 | + |
| 96 | +const boolOrNumberFunction = (input: boolean | number) => {}; |
| 97 | + |
| 98 | +boolOrNumberFunction(true); |
| 99 | +boolOrNumberFunction(23); |
| 100 | + |
| 101 | +// 반면에 함수 오버로드는 매개변수와 반환 타입에 대한 |
| 102 | +// 더 다양한 구문을 제공합니다. |
| 103 | + |
| 104 | +interface BoolOrNumberOrStringFunction { |
| 105 | + /** bool 타입을 갖고, bool 타입을 반환 */ |
| 106 | + (input: boolean): boolean; |
| 107 | + /** number 타입을 갖고, number 타입을 반환 */ |
| 108 | + (input: number): number; |
| 109 | + /** string 타입을 갖고, bool 타입을 반환 */ |
| 110 | + (input: string): boolean; |
| 111 | +} |
| 112 | + |
| 113 | +// 처음 보는 선언이라면, |
| 114 | +// TypeScript에 이 파일의 런타임에서는 존재하지 않더라도 |
| 115 | +// 무언가 존재한다고 알려줍니다. |
| 116 | +// 부작용과 함께 매핑된 코드는 유용하지만, |
| 117 | +// 많은 코드가 있는 구현을 만드는 데모에 매우 유용합니다. |
| 118 | + |
| 119 | +declare const boolOrNumberOrStringFunction: BoolOrNumberOrStringFunction; |
| 120 | + |
| 121 | +const boolValue = boolOrNumberOrStringFunction(true); |
| 122 | +const numberValue = boolOrNumberOrStringFunction(12); |
| 123 | +const boolValue2 = boolOrNumberOrStringFunction("string"); |
| 124 | + |
| 125 | +// 위 값과 함수에 호버해보면 |
| 126 | +// 올바른 문서와 반환 값을 확인할 수 있습니다. |
| 127 | + |
| 128 | +// 함수 오버로드를 사용하는 것으로도 충분합니다만, |
| 129 | +// 입력과 반환 값의 다른 타입을 다루기 위한 다른 도구가 있으며 |
| 130 | +// 이는 제네릭입니다. |
| 131 | + |
| 132 | +// 타입 정의에서 placeholder 변수로 |
| 133 | +// 타입을 가지는 방법을 제공합니다. |
| 134 | + |
| 135 | +// example:generic-functions |
| 136 | +// example:function-chaining |
0 commit comments