function sort<-T>(itemsL T[]): T[] {
return items.sort();
}
const nums: number[] = [1,2,3,4];
const chars: string[] = ["a","b","c"];
sort<number>(nums);
sort<string>(chars); // Error
class Queue<T> {
protected data: Array<T> = [];
push(item: T) {
this.data.push(item);
}
pop(): T | undefined {
return this.data.shift();
}
}
const numberQueue = new Queue<Number>();
numberQueue.push(0);
numberQueue.push("1"); // 의도하지 않은 실수를 사전 검출 가능
numberQueue.push(+"1"); // 실수를 사전 인지하여 수정 가능
const printMessage = <T extends string | number>(message: T): T => {
return message;
}
printMessage<String>("1);
printMessage<Number>(1);
printMessage<Boolean>(false); // Error
: 객체 형태의 타입을, 따로 속성들만 뽑아 모아 유니온 타입으로 만들어주는 연산자
interface User {
id: number;
name: string;
age: number;
gender: "m" | "f";
}
type UserKey = keyof User;
// 'id' | 'name' | 'age' | 'gender'
const getProperty = <T extends object, U extends keyof T>(obj: T, key: U) => {
// T는 object를 갖는 제약, U는 T를 갖는 제약
return obj[key]
}
getProperty({a:1, b:2, c: 3}, "a");
getProperty({a:1, b:2, c:3,}, "z"); // Error
const printMessage = (message: string | number) => {
return message;
}
const printMessage = (message: string | number) => {
return message;
}
const message1 = printMessage(1234);
const message2 = printMessage('hello world!");
message1.length // Error
// string과 number type의 공통된 메소드만 사용 가능
출처 - [엘리스 강의 자료]