[TS] 제네릭 방식 타입

mj·2021년 7월 6일
0

배열을 다루는 함수를 작성할 때 number[] 와 같이 타입이 고정된 함수를 만들기보다는 T[]형태로 배열의 아이템을 한꺼번에 표현하는 것이 편리하다.
타입을 T와 같은 일종의 변수(타입 변수)로 취급하는 것을 제네릭(generics) 타입이라고 한다.

const arrayLenght = (array) => array.Length

다음과 같이 배열의 길이를 반환하는 변수가 있다.
이 함수가 number[], string[] 등 다양한 아이템 타입을 가지는 배열에 똑같이 적용되게 하려면 다음처럼 배열의 타입 주석을 T[]로 한다.

const arrayLength = (array: T[]): number => array.Length

이렇게 작성하면 컴파일러가 T가 무엇인지 알 수 없다. 그래서 다음과 같이 작성해서 컴파일러에게 이것이 제네릭이다! 라고 알려주어야 한다.

const arrayLength = <T>(array: T[]): number => array.Length
const identity = <T>(n: T): T => n
console.log(
	identity<boolean>(true) // true, 제네릭을 통해 타입을 추론한다. 
)

제네릭 타입

제네릭 타입은 인터페이스나 클래스, 함수, 타입 별칭 등에 사용할 수 있는 기능으로, 어떤 인터페이스가 value라는 이름의 속성을 가질 때, 속성의 타입을 다음처럼 string, number 등으로 특정하지 않고 T로 지정해 제네릭 타입으로 만들 수 있습니다.

interface IValuable<T>{
    value: T
}

클래스, 함수, 타입 별칭에 붙이기

function identity<T>(arg: T): T{return arg}

type IValuable<T> = {
    value: T
}

class Valuable<T>{
    constructor(public value: T) {}
}

0개의 댓글