function logText<T>(text: T):T {
console.log(text);
return text;
}
logText<string>('ํ์ด');
//ํจ์๋ฅผ ํธ์ถํ๋ ์์ ์ ์ธ์์ ํ์
์ ์ง์ ํด์ฃผ๋๊ฒ
- ๊ธฐ์กด ํ์ ์ ์ ๋ฐฉ์ : ํจ์๋ฅผ ์ค๋ณต์ผ๋ก ์ ์ธํด์ผํ๋ ๋ถํธํจ์ด ์๋ค.
function logText(text: string) {
console.log(text);
return text;
}
function logNumber(num: number) {
console.log(num);
return num;
}
logText('a');
logNumber(10);
- ์ ๋์จ ํ์ ๋ฐฉ์ : ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค ํ์ ์ ํ์ธํ๋ฉด, string ๋๋ number ๊ฐ ์๋ ํญ์ string | number ์์ฒด๋ก ๋ณด์ฌ์ง๋ค.
function logText(text: string | number) {
console.log(text);
return text;
}
logText('a');
logTExt(10);
์ ๋ค๋ฆญ์ ์ฅ์
function logText<T>(text: T): T {
// <T> : ํจ์๋ฅผ ์ ์ํ ๋ ๋ฐ์ ํ์
์
// (text: T) : ์ธ์์ ํ์
์ผ๋ก๋ ์ฐ๊ณ
// : T : ํจ์๋ฅผ ๋ฐํํ ๋๋ ์ฐ๊ฒ ๋ค.
console.log(text);
return text;
}
const str = logText<string>('abc');
str.split('');
const login = logText<boolean>(true);
// ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ๋ถ๋ฆฌ์ธ๊ฐ์ ๋๊ฒจ์ ์ฌ์ฉ ๊ฐ๋ฅ
ํธ์ถํ๋ ์์ ์ ํ์ ์ ์ ํด์ฃผ๊ณ , ์ธ์์ ๋ฐํ๊ฐ์ ํ์ ๊น์ง ์ ํ ์ ์๋ค.
- ์์
const emails = [
{ value: 'naver.com', selected: true},
{ value: 'naver.com', selected: false},
{ value: 'naver.com', selected: false},
];
const numbers = [
{ value: 1, selected: true},
{ value: 2, selected: false},
{ value: 3, selected: false},
];
function example(item: {value: string, selected: boolean} |
{value: number, selected: boolean}) {...}
์ด๋ฐ์์ผ๋ก value์ type๋ง ๋ค๋ฅธ ๊ฐ์ฒด ๋ฐฐ์ด๋ค์ ํจ์์ ์ธ์๋ก ๋๊ธฐ๊ธฐ ์ํด์, ์ด๋ฐ ๊ผด์ ์ ๋์จํ์ ์ ์ค์ ํ ์ ์๋ค.
interface Email {
value: string;
selected: boolean;
}
interface Number {
value: number;
selected: boolean;
}
const emails: Email[] = [
{ value: 'naver.com', selected: true},
{ value: 'naver.com', selected: false},
{ value: 'naver.com', selected: false},
];
const numbers: Number[] = [
{ value: 1, selected: true},
{ value: 2, selected: false},
{ value: 3, selected: false},
];
function example(item: Email | Number) {
...
}
๋ณด๊ธฐ์ข๊ฒ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ํ์ง๋ง ๋ค์ํ ํ์ ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๊ฐ ๋ง์์ง๋ฉด ์ ์ํด์ผ ํ๋ ๋น์ทํ๊ฒ ์๊ธด ์ธํฐํ์ด์ค๊ฐ ๋ง์์ง.
๊ทธ๊ฑธ ํด๊ฒฐํ๊ธฐ ์ํด,
์ธํฐํ์ด์ค์ ์ ๋ค๋ฆญ ์ ์ธ
//๊ธฐ์กด
interface DropdownItem {
value: string;
selected: boolean;
}
const obj: Dropdown = {value: 'abc', selected: false};
//์ ๋ค๋ฆญ ์ ์ธ
interface DropdownItem<T> {
value: T;
selected: boolean;
}
const obj: Dropdown<number> = {value: 123, selected: false};
- ์์
const emails: DropdownItem<string>[] = [
{ value: 'naver.com', selected: true},
{ value: 'naver.com', selected: false},
{ value: 'naver.com', selected: false},
];
const numbers: DropdownItem<number>[] = [
{ value: 1, selected: true},
{ value: 2, selected: false},
{ value: 3, selected: false},
];
function example(item: DropdownItem<string> | DropdownItem<number>) {
...
}
์ฌ๊ธฐ์ ์ ๋์จํ์ ์ ์์ ๋ ค๋ฉด?
function example<T>(item: DropdownItem<T>) { ... }
ํจ์ ์์ฒด์๋ ์ ๋ค๋ฆญ์ ๋จ๋ค.
์ ๋ค๋ฆญ์ ํ์ ์ ํ
function logTextLength<T>(text: T): T {
console.log(text.length);
return text;
}
์ค๋ฅ๋๋ค!! ์ฝ๋ ์ ์ฅ์์๋ ์ text๊ฐ ์ ๋ค๋ฆญ์ผ๋ก ์ค์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ํ์ ์ธ์ง ์ ์ ์๋ค.
function logTextLength<T>(text: T[]): T[] {
console.log(text.length);
text.forEach(...)
return text;
}
์ด๋ฐ์์ผ๋ก ์ ๋ค๋ฆญ์ ๋ฐฐ์ด์ ๋ฌ์์ฃผ๋ฉด ์กฐ๊ธ ๋ ์ ํ์ ํด์ค ์ ์๋ค.
์ ๋ค๋ฆญ ํ์ ์ ํ 2
interface LengthType {
length: number;
}
function logTextLength<T extends LengthType>(text: T): T {
text.length;
return text;
}
์ ๋ค๋ฆญ์ผ๋ก ๋ฐ์ ํ์ (T)๋ ํญ์ LengthType์ ํ์ ํ์ ์ผ ๊ฒ. → ํญ์ length ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์ ํํ๋ค.
length๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด, ๋๋ string(ํ์ ์์ฒด์ ์ด๋ฏธ ์์์) ๋ง ์ธ์๋ก ๋๊ธธ ์ ์๊ฒ ๋๋ค.
์ ๋ค๋ฆญ ํ์ ์ ํ 3
interface ShoppingItem {
name: string;
price: number;
stock: number;
}
function getItemOption<T extends keyof ShoppingItem>(itemOption: T): T {
return itemOption;
}
getItemOption('name');
ShoppingItem์ด ๊ฐ์ง๊ณ ์๋ key ์ค ํ๋๊ฐ ์ ๋ค๋ฆญ(T)์ด ๋๋ค.
์ฆ, ์ ํจ์์ ์ธ์๋ก๋ name, price, stock ์ค ํ๋๊ฐ ๋ค์ด์ฌ ์ ์๋ค.