typescript - Generics

HunGeun·2022년 5월 3일
0

TypeScript

목록 보기
5/5

any 와 generic

function helloString(message: string): string {
    return message;
}
function helloNumber(message: number): number {
    return message;
}

// 더 많은 반복된 함수..

function hello(message: any): any {
    return message;
}

console.log(hello("Mark").length);
console.log(hello(39).length); //number에는 legnth 불가, 하지만 컴파일 단계에서 알수 없음


// Generic
function helloGeneric<T>(message: T): T {
    return message;
}

console.log(helloGeneric("Mark").length);
// console.log(helloGeneric(39).legnth); //error 컴파일 단계에서 알수 있음
// console.log(helloGeneric(true));

type 추론

string

function helloBasic<T>(message: T): T {
    return message;
}

helloBasic<string>("Mark"); //함수 인자가 string만 가능
helloBasic(36); //함수 인자로 T를 추론함 즉 return값도 T가 됨(number)

//두개도 가능
function helloBasic2<T, U>(message: T, comment: U): T {
    return message;
}

helloBasic2<string, number>("Mark", 39);
helloBasic2(36, 39);

array 와 tuple

function helloArray<T>(message: T[]): T {
    return message[0];
}
helloArray(['hello', 'world']); //T는 string, return도 string
helloArray(['hello', 5]); // T는 string | number 즉 유니온 타입으로 추론

function helloTuple<T, K>(message: [T, K]): T {
    return message[0]
}

helloTuple(['hello', 'world']); //T 는 string
helloTuple(['hello', 5]); // 0번째가 string 이기때문에 string으로 추론

type alias 와 interface

//type alias
type HelloFunctionGeneric1 = <T>(message: T) => T;

const helloFuntion1: HelloFunctionGeneric1 = <T>(message: T): T => {
    return message;
}


//interface
interface HelloFunctionGeneric2 {
    <T>(message: T): T
}

const helloFuntion2: HelloFunctionGeneric2 = <T>(message: T): T => {
    return message;
}

class

class Person<T> {
    private _name: T;

    constructor(name: T) {
        this._name  = name;
    }
}
//T의 유효범위는 class 안

new Person("Mark");
new Person(39); // 지정이 없다면 추론된 타입
new Person<string>(39); //error 지정시에는 지정된 타입

--------------------------------------------------
class Person2<T, K> {
    private _name: T;
    private _age: K;

    constructor(name: T, age: K) {
        this._name  = name;
        this._age = age;
    }
}
new Person2("Mark"); //error 두개의 인자 필요함
new Person2("Mark", 39);
new Person2<string, number>("Mark",39); 

generic extends

//string과 number만 가능함
class PersonExends<T extends string | number> {
    private _name: T;

    constructor(name: T) {
        this._name = name;
    }
}

new PersonExends("Mark");
new PersonExends(39);
//new PersonExends(true); //error

0개의 댓글