Stack/TypeScript

[TS] Generic

7ingout 2022. 7. 26. 12:03

재사용을 목적으로 함수나 클래스의 선언 시점이 아닌, 사용 시점에 타입을 선언 할 수 있음

타입을 인수로 받아서 사용

 

function toArray(a: numger | string, b: number | string) : (number | string) [] {

                return [a, b];

}

toArray(1, 2)

toArray('a','b')

toArray(1, 'a')

 

function toArray<T>(a: T, b:T) :T [] {

                return [a,b];

}

toArray<number>(1, 2)

toArray<string>('a', 'b')

 

제약조건

T extends U

 

조건부 타입

타입구현 영역에서 사용하는 extends는 삼항 연산자를 사용할 수 있음

이를 조건부 타입이라고 부름

T extends U ? X : Y

 

ex08_generic.ts

// 제네릭(Generic)
// 재사용을 목적으로 함수나 클래스의 선언 시점이 아닌, 사용 시점에 타입을
// 선언할 수 있는 방법을 제공
// 타입을 인수로 받음

function toArray(a: number | string, b: number | string) : (number | string) [] {
    return [a, b];
}
toArray(1,2)
toArray('a', 'b')
toArray(1, 'a')

function toArray2<T>(a: T, b: T) : T[] {
    return [a, b];
}
toArray2<string>('a', 'b')
toArray2<number>(1, 2)
toArray2<string | number>(1, 'a')

// 인터페이스 제약조건 사용하기- 타입 제약조건은 extends 키워드로 선언
type U = string | number

interface MyType<T extends string | number> {
    name: string,
    value: T
}

const dataA : MyType<string> = {
    name: 'Data A',
    value: 'Hello World'
}
const dataB : MyType<number> = {
    name: 'Data B',
    value: 1234
}
// const dataC : MyType<boolean> = {   // error 발생(extends 제약조건 때문에)
//     name: 'Data C',
//     value: true
// }
// const dataD : MyType<number[]> = {  // error 발생(extends 제약조건 때문에)
//     name: 'Data D',
//     value: [1, 2, 3, 4]
// }

// 타입 별칭
// type 키워드를 사용해 새로운 타입 조합을 만들 수 있음
type myStringType = string;
type yourType = string | number | boolean;
let nt : yourType = true
type TUser = {
    name: string,
    age: number,
    isValid: boolean,
} | [string, number, boolean]   // TUser은 객체 또는 배열타입이다.

let tuser1: TUser = {
    name: 'Neo',
    age: 85,
    isValid: true
}
let tuser2: TUser = ['Evan', 36, false]
function someFunc2(arg: myStringType) : yourType {
    switch(arg) {
        case 's' :
            return arg.toString();
        case 'n' :
            return parseInt(arg);
        default:
            return true;
    }   
}

// 조건부타입 T extends U ? X : Y
type U2 = string | number | boolean;

// type 식별자
type MyType2<T> = T extends U2 ? string : number;

// 타입 구현
interface Iuser5<T> {
    name: string,
    age: T extends U2 ? string : number
}

interface IUser6<T extends boolean> {
    name: string,
    // T타입이 true인 경우 string을 반환 아닌 경우 number를 반환
    age: T extends true ? string : number,
    isString: T
} 

const str: IUser6<true> = {
    name: 'green',
    age: '12',
    isString: true
}
const num2: IUser6<false> = {
    name: 'green',
    age: 12,
    isString: false
}