C#
Java
등의 언어에서 재사용성이 높은 컴포넌트를 만들 때 자주 활용되는 특징이다.const logText = (text) => {
console.log(text);
return text;
};
logText(10); // 숫자 10
logText("ㅎㅇ"); //문자열 ㅎㅇ
logText(true); // 진위값 true 반환
any
타입이 지정되어있기 때문const logText = <T>(text: T): T => {
console.log(text);
return text;
};
logText < string > "ㅎㅇ"; //문자열 ㅎㅇ가 호출되므로, 반환도 문자열이 된다고 알려주고 있다.
string
으로 지정된 것을 알 수 있다.union
타입으로 여러 타입의 인자를 받을 수 있긴 하지만, 내부 로직에서 api를 활용할 때 문제가 발생할 수 있다.타입을 비워놓고 무엇이 들어갈지 호출하는 시점에서 정의할 수 있다.
const logText = <T>(text: T): T => {
console.log(text);
return text;
};
const num = logText < number > 10; // 제네릭으로 타입이 number, 인자가 10
const str = logText < string > "ㅎㅇ"; // 제네릭으로 타입이 string, 인자가 ㅎㅇ
str.split(""); //문자열로 사용가능
예제코드 dropdown-generic.ts
에서 타입을 정의하기 위해 인터페이스를 적용했다.
interface Email {
value: string;
selected: boolean;
}
interface ProductNumber {
value: number;
selected: boolean;
}
value
속성이 겹치지만 타입이 다르다는 이유로 두개의 인터페이스가 정의되었다.Generic
으로 해결 가능하다.interface Dropdown {
value: string;
selected: boolean;
}
const obj: Dropdown = { value: 10, selected: false }; //타입 에러(value는 string이 와야함)
interface Dropdown<T> {
value: T;
selected: boolean;
}
const obj: Dropdown<number> = { value: 10, selected: false }; //타입에러 안남!
const logTextLength = <T>(text: T): T => {
console.log(text.length);
return text;
};
logTextLength("ㅎㅇ");
text
인자가 string
타입인 것은 알지만 에러가 발생함.힌트
)을 두어서 이 문제를 해결한다.interface LengthType {
length: number;
}
const logTextLength = <T extends LengthType>(text: T): T => {
text.length;
return text;
};
LengthType
의 하위 타입일 것이라고 제한하는 것이다.LengthType
의 속성은 모두 갖고 있고, 추가적으로 다른 속성을 받을 수 있다고 제한하는 것이다.keyof
를 활용하여 제네릭의 타입을 제한할 수 있다.interface
의 key들 중 하나가 제네릭의 속성이 될 것임을 명시하는 것.//keyof
interface ShoppingItem {
name: string;
price: number;
stock: number;
}
const getShoppingItemOption = <T extends keyof ShoppingItem>(
itemOption: T
): T => {
return itemOption;
};
getShoppingItemOption("name");
ctrl + space
누르면 사용가능한 속성들이 나열됨.