문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| typescript:generic [2019/07/28 08:21] – [Generic interface] taekgu | typescript:generic [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 18: | 줄 18: | ||
| 이제 data는 하나의 타입을 갖는 배열이 된다. | 이제 data는 하나의 타입을 갖는 배열이 된다. | ||
| - | ==== Generic Types ==== | + | ===== Generic Types ===== |
| <code javascript> | <code javascript> | ||
| function identity< | function identity< | ||
| 줄 31: | 줄 31: | ||
| </ | </ | ||
| - | === Generic interface === | + | ===== Generic interface |
| <code javascript> | <code javascript> | ||
| interface GenericIdentityFn { | interface GenericIdentityFn { | ||
| 줄 48: | 줄 48: | ||
| </ | </ | ||
| - | === Generic Classes === | + | ===== Generic Classes |
| <code javascript> | <code javascript> | ||
| class Generic< | class Generic< | ||
| 줄 58: | 줄 58: | ||
| myGenericNumber.add = function(x, y) { return x + y }; | myGenericNumber.add = function(x, y) { return x + y }; | ||
| </ | </ | ||
| - | Generic class는 오직 객체에서만 generic을 사용가능하다. 그렇기 때문에 class작업을 할 때 정적 멤버들은 generic사용이 안된다는 점을 유념하자 | + | <WRAP center round important 60%> |
| + | Generic class는 오직 객체에서만 generic 사용가능하다. 그렇기 때문에 class작업을 할 때 정적 멤버들은 generic사용이 안된다는 점을 유념하자 | ||
| + | </ | ||
| - | === Generic Constraints === | + | ===== Generic Constraints |
| 특정한 타입들(내부 메서드는 알고 있는)과 작동하는 generic함수를 만들고 싶을지 모른다. 예제에서 .length속성을 접근하고 싶었지만 모든 타입이 .length속성을 가지고 있는 것이 아니라서 컴파일러는 에러메세지를 보내준다. | 특정한 타입들(내부 메서드는 알고 있는)과 작동하는 generic함수를 만들고 싶을지 모른다. 예제에서 .length속성을 접근하고 싶었지만 모든 타입이 .length속성을 가지고 있는 것이 아니라서 컴파일러는 에러메세지를 보내준다. | ||
| <code javascript> | <code javascript> | ||
| 줄 83: | 줄 85: | ||
| 이제 제한을 걸었기 때문에 아무 타입이나 작동하지 않는다. | 이제 제한을 걸었기 때문에 아무 타입이나 작동하지 않는다. | ||
| - | '' | + | <code javascript> |
| 대신에 우리는 모든 type 요구조건이 충족된 값을 인자값으로 넘겨야 한다. | 대신에 우리는 모든 type 요구조건이 충족된 값을 인자값으로 넘겨야 한다. | ||
| - | '' | + | <code javascript> |
| + | ===== Using Type parameters in Generic Constraints ===== | ||
| + | 다른 type인수에 의해 제한되는 type인수를 선언한다. 예를 들자면, 주어진 이름으로 객체의 속성을 얻고 싶다고 하자. 실수로라도 객체에 존재하지 않는 다른 속성을 갖지 않도록 하고 싶다. 그래서 2개의 타입에 제한을 둘 것이다. | ||
| + | <code javascript> | ||
| + | function getProperty< | ||
| + | return obj[key]; | ||
| + | } | ||
| + | |||
| + | let x = { | ||
| + | a: 1, | ||
| + | b: 2, | ||
| + | c: 3, | ||
| + | d: 4 | ||
| + | } | ||
| + | |||
| + | getProperty(x, | ||
| + | getProperty(x, | ||
| + | </ | ||
| + | |||
| + | ===== Using Class Types in Generics ===== | ||
| + | Generic을 이용해서 Factory를 만들때, 클래스타입들을 그들의 생성자 함수에 의해 참조하는 것은 필수적입니다. | ||
| + | <code javascript> | ||
| + | function create< | ||
| + | return new c(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 더 고급 예시는 클래스의 생성자 함수와 객체측 사이에서의 관계를 제한하고 추론하기 위해 프로토타입 속성을 사용한다. | ||
| + | |||
| + | <code javascript> | ||
| + | class BeeKeeper { | ||
| + | hasMask: boolean; | ||
| + | } | ||
| + | |||
| + | class ZooKeeper { | ||
| + | nametag: string; | ||
| + | } | ||
| + | |||
| + | class Animal { | ||
| + | numLegs: number; | ||
| + | } | ||
| + | |||
| + | class Bee extends Animal { | ||
| + | keeper: BeeKeeper; | ||
| + | } | ||
| + | |||
| + | class Lion extends Animal { | ||
| + | keeper: ZooKeeper; | ||
| + | } | ||
| + | |||
| + | function createInstance< | ||
| + | return new c(); | ||
| + | } | ||
| + | createInstance(Lion).keeper.nametag; | ||
| + | createInstance(Bee).keeper.hasMask; | ||
| + | </ | ||