function helloGeneric<T>(message: T): T{
return message;
}
helloBasic<string>(39); // error
helloBasic<string>(“Mark”);
helloBasic(36); // T는 자동으로 추론됨
function helloArray<T>(message: T[]): T{
return message[0];
}
helloArray([“Hello”, “World”]);
helloArray([“Hello”, 7]);
function helloTuple<T, K>(message: [T, K]): T{
return message[0];
}
helloTuple([“Hello”, “World”]);
helloTuple([“Hello”, 7]);
type HelloFunctionGeneric1 = <T>(message: T) => T;
const helloFunction1: HelloFunctionGeneric1 = <T>(message: T): T => {
return message;
}
interface HelloFunctionGeneric2{
<T>(message: T): T;
}
const helloFunction2: HelloFunctionGeneric2 = <T>(message: T): T => {
return message;
}
class Person<T>{
private _name: T;
constructor(name: T){
this._name = name;
}
}
new Person(“Mark”);
class PersonExtends<T extends string | number>{
// T는 string과 number만 가능
private _name: T;
constructor(name: T){
this._name = name;
}
}
interface IPerson{
name: string;
age: number;
}
const person: IPerson = {
name: “Mark”,
age: 39,
}
function getProp<T, K extends keyof T>(obj: T, key: K)”: T[K]{
return obj[key];
}
getProp(person, “age”);
function setProp<T, K extends keyof T>(obj: T, Key: K, value: T[K]): void{
obj[key] = value;
}
setProp(person, “name”, “Anna”);
-> string | number 형태로 union type 이용하지 않아도 돼 더욱 안전