사용자 도구

사이트 도구


typescript:generic

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
typescript:generic [2019/07/28 08:23] – [Generic Types] taekgutypescript:generic [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1
줄 3: 줄 3:
 JavaScript는 타입 선언이 필요하지 않고, 따라서 특정 타입을 위해 만들어진 클래스나 함수도 타입 에러를 런타임에서 일으킬 뿐이다. 코드를 실행시키기 전까지는 함수와 클래스가 모든 타입에 대응한다. 따라서 JavaScript에서는 제네릭이란 말을 듣지 못 했다. JavaScript는 타입 선언이 필요하지 않고, 따라서 특정 타입을 위해 만들어진 클래스나 함수도 타입 에러를 런타임에서 일으킬 뿐이다. 코드를 실행시키기 전까지는 함수와 클래스가 모든 타입에 대응한다. 따라서 JavaScript에서는 제네릭이란 말을 듣지 못 했다.
  
-===== 제네릭을 사용하는 이유 =====+==== 제네릭을 사용하는 이유 ====
 ''any''를 이용하여 구현하는 방법이 있겠으나 제네릭과는 차이가 있다. ''any''를 이용하여 구현하는 방법이 있겠으나 제네릭과는 차이가 있다.
 <code javascript> <code javascript>
줄 31: 줄 31:
 </code> </code>
  
-=== Generic interface ===+===== Generic interface =====
 <code javascript> <code javascript>
 interface GenericIdentityFn { interface GenericIdentityFn {
줄 48: 줄 48:
 </WRAP> </WRAP>
  
-=== Generic Classes ===+===== Generic Classes =====
 <code javascript> <code javascript>
 class Generic<T> { class Generic<T> {
줄 58: 줄 58:
 myGenericNumber.add = function(x, y) { return x + y }; myGenericNumber.add = function(x, y) { return x + y };
 </code> </code>
-Generic class는 오직 객체에서만 generic을 사용가능하다. 그렇기 때문에 class작업을 할 때 정적 멤버들은 generic사용이 안된다는 점을 유념하자+<WRAP center round important 60%> 
 +Generic class는 오직 객체에서만 generic 사용가능하다. 그렇기 때문에 class작업을 할 때 정적 멤버들은 generic사용이 안된다는 점을 유념하자 
 +</WRAP>
  
-==== Generic Constraints ====+===== Generic Constraints =====
 특정한 타입들(내부 메서드는 알고 있는)과 작동하는 generic함수를 만들고 싶을지 모른다. 예제에서 .length속성을 접근하고 싶었지만 모든 타입이 .length속성을 가지고 있는 것이 아니라서 컴파일러는 에러메세지를 보내준다. 특정한 타입들(내부 메서드는 알고 있는)과 작동하는 generic함수를 만들고 싶을지 모른다. 예제에서 .length속성을 접근하고 싶었지만 모든 타입이 .length속성을 가지고 있는 것이 아니라서 컴파일러는 에러메세지를 보내준다.
 <code javascript> <code javascript>
줄 89: 줄 91:
 <code javascript>loggingIdentity({length: 10, value: 3});</code> <code javascript>loggingIdentity({length: 10, value: 3});</code>
  
-==== Using Type parameters in Generic Constraints ====+===== Using Type parameters in Generic Constraints ====
 +다른 type인수에 의해 제한되는 type인수를 선언한다. 예를 들자면, 주어진 이름으로 객체의 속성을 얻고 싶다고 하자. 실수로라도 객체에 존재하지 않는 다른 속성을 갖지 않도록 하고 싶다. 그래서 2개의 타입에 제한을 둘 것이다.
  
 +<code javascript>
 +function getProperty<T, K extends keyof T>(obj: T, key: K) {
 +  return obj[key];
 +}
 +
 +let x = {
 +  a: 1,
 +  b: 2,
 +  c: 3,
 +  d: 4
 +}
 +
 +getProperty(x, "a"); // Ok
 +getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.
 +</code>
 +
 +===== Using Class Types in Generics =====
 +Generic을 이용해서 Factory를 만들때, 클래스타입들을 그들의 생성자 함수에 의해 참조하는 것은 필수적입니다.
 +<code javascript>
 +function create<T>(c: {new(): T}): T {
 +  return new c();
 +}
 +</code>
 +
 +더 고급 예시는 클래스의 생성자 함수와 객체측 사이에서의 관계를 제한하고 추론하기 위해 프로토타입 속성을 사용한다.
 +
 +<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<A extends Animal>(c: new() => A): A {
 +    return new c();
 +}
 +createInstance(Lion).keeper.nametag; //typecheck!
 +createInstance(Bee).keeper.hasMask; //typecheck!
 +</code>
typescript/generic.1564302222.txt.gz · 마지막으로 수정됨: 2025/04/15 10:05 (바깥 편집)