functionhelloString(message:string):string{returnmessage;}// 인자가 string 만올수 있으며 반환타입 또한 stringfunctionhelloNumber(message:any):any{returnmessage;}//인자와 반환타입 모두 어느 것이든지 올 수 있지만 헬퍼가 제대로 작동을 못함functionhello<T>(message:T):T{returnmessage;}// any -> generic : 헬퍼가 정상 작동할 수 있음.hello('heejun');hello<string>(35);// errorhello(35);
function helloGeneric<T>(message:T ):T{
return message;
}
function hello<T>(message: T):T{
return message;
}
console.log(hello<string>('Hello'));
let age = hello(35); // Generic이 T
hello<number>('35'); // T가 Number 로됨 // error 반환타입이 string 이 되던지 인자가 35가 되어야 함 .
// T 는 모든 Generic 의 조상
//Generic 타입을 쓰지 않으면 T 로 추론
//Generic 타입을 쓰면 T 를 확인
Generic Array
consta:string[]=[];// 배열 생성 방법 1constb:Array<string>=[];// 배열생성방법 2 Array배열에는 string 값만 들어가야 함.functionhello<T>(message:T[]):T{returnmessage[0];}
Generic function
typeHelloGeneric=<T>(message:T)=>T;consthello:HelloGeneric=<T>(message:T){//retunr T 를 설정하지 않아도 오류를 발생시키지 않는다.}console.log(hello<string>('hello').length);
Generic Class
classPerson<T>{private_name:T;constructor(name:T){this._name=name;}}constperson1=newPerson('shj');// name 의 타입은 T가됨constperson2=newPerson<number>('shj');// 오류
Generic 상속
classPerson<Textendsstring|number>{//유니온 타입private_name:T;constructor(name:T){this._name=name;}}constperson1=newPerson(false);--------------------------------// 멀티 지네릭classPerson<T,K>{private_name:T;private_age:K;constructor(name:T,age:K){this._name=name;this._age=age;}}constperson2=newPerson('shj',26);
interface Person{
name : string;
age : number;
}
//type Test = keyof Person;
// keyof 는 타입에 관한 결과를
// Test 의 타입은 string 타입인데 name , age 의 리터럴 타입이 됨. -> 제네릭을 사용해야함
function getProperty(obj, key){
return obj[key]; // obj 와 key 의 관계를 규명못함. undefined 가 나올 것임.
}
type lookup table
const person : Person = {
name : 'SHJ'
age : 26
};
/*
T , K 타입은 가장 상위의 T type 을 상속받으며 getProperty 의 반환형은 T[K] 형식입니다.
인자로는 obj 는 T 타입 key 에는 K 타입이 들어가게 됨으로서 obj 와 key 의 연관성이 생기게 됩니다.
*/
function getProperty<T, K extends keyof T> : T[K](obj : T, key : K){
return obj[key];
}
/*
위의 getProperty 와 다른 점은 인자에 value 가 추가되는 것입니다. 이 인자는 T[K] 즉 배열의 요소를 표현하는 형태입니다.
*/
function setProperty<T, K extends keyof T> : T[K](obj : T, key : K, value : T[K]){
obj[key] = value;
}
getProperty(person, 'name1')// error name1 은 없는 속성임
getProperty(person, 'name') // SHJ 반환
setProperty(person, 'name' , 'lhj') // person 의 name 속성에 lhj 값을 넣는다.