Dream๐Ÿฐng
article thumbnail

๐Ÿ’ [230317 TIL] Understanding TypeScript

Generics 2๏ธโƒฃ

Keyof Constraint

์ œ๋„ค๋ฆญ์œผ๋กœ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค„ ๋•Œ, ํ‚ค ๊ฐ’์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋ฉด keyof๋ฅผ ์‚ฌ์šฉํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์“ฐ๋ฉด ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

function extractAndConvert<T extends object, U extends keyof T>(
    obj: T,
    key: U
) {
    return 'Value: ' + obj[key];
}

extractAndConvert({}, 'name'); // Error occurred

์ œ๋„ค๋ฆญ T์˜ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ object๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ๊ณ ,

U์˜ ์ œ์•ฝ ์กฐ๊ฑด์œผ๋กœ T์˜ key๋ฅผ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

extractAndConvert๋กœ ๋นˆ ๊ฐ์ฒด({})์™€ name์ด๋ผ๋Š” ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ–ˆ์„ ๋•Œ,

๋นˆ ๊ฐ์ฒด์—๋Š” name์ด๋ผ๋Š” ํ‚ค ๊ฐ’์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค!

 

์ œ๋„ค๋ฆญ์œผ๋กœ U extends keyof T๋ฅผ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์ด๋ฉฐ,

ํ•จ์ˆ˜๋กœ name ํ‚ค๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์˜ค๋ฅ˜๋Š” ์‚ฌ๋ผ์ง„๋‹ค ๐Ÿ˜ƒ

 

Generic Classes

์ œ๋„ค๋ฆญ์œผ๋กœ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์—ฐํ•˜๊ฒŒ ํƒ€์ž…์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

class DataStorage<T> {
    private data: T[] = [];
    
    addItem(item: T) {
        this.data.push(item);
    }
    
    removeItem(item: T) {
        this.data.splice(this.data.indexOf(item), 1);
    }
    
    getItems() {
        return [...this.data];
    }
}

const textStorage = new DataStorage<string>();
textStorage.addItem('Apeach');
textStorage.addItem('Rabbit');
textStorage.removeItem('Apeach');
console.log(textStorage.getItems()); // ['Rabbit']

 

๋งŒ์•ฝ ์œ„ ์˜ˆ์ œ์—์„œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  class ์ž์ฒด์— ํƒ€์ž…์„ ์ง€์ •ํ–ˆ๋‹ค๋ฉด string | number ๋“ฑ๋“ฑ...

ํ•„์š”ํ•œ ํƒ€์ž…์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์—ˆ์„ ๊ฒƒ์ด๋‹ค ๐Ÿค”

 

์„ ์–ธ ์‹œ์ ์ด ์•„๋‹ˆ๋ผ ์ƒ์„ฑ ์‹œ์ ์— ์›ํ•˜๋Š” ํƒ€์ž…์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ œ๋„ค๋ฆญ์˜ ๋ง‰๊ฐ•ํ•œ ์žฅ์ !

๋ฌผ๋ก  ์ œ์•ฝ ์กฐ๊ฑด์„ ์ œ๋„ค๋ฆญ์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค ๐Ÿ˜…

 

Partial type

Partial ํƒ€์ž…์€ ์ œ๋„ค๋ฆญ์œผ๋กœ ์ „๋‹ฌ๋œ ํƒ€์ž…์ด ๊ฐ์ฒด์ž„์„ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๋ฉด์„œ

์ „๋‹ฌ๋œ ํƒ€์ž…์— ์ž‘์„ฑ๋œ ๋ชจ๋“  ์†์„ฑ์„ ์„ ํƒ์  ํƒ€์ž…์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.

 

interface CourseGoal {
    title: string;
    description: string;
    completeUntil: Date;
}

function createCourseGoal(
    title: string,
    description: string,
    date: Date
): CourseGoal {
    let courseGoal: Partial<CourseGoal> = {};
    courseGoal.title = title;
    courseGoal.description = description;
    courseGoal.completeUntil = date;
    return courseGoal as CourseGoal;
}

 

Readonly type

Readonly ํƒ€์ž…์€ ์ œ๋„ค๋ฆญ์œผ๋กœ ์ „๋‹ฌ๋œ ํƒ€์ž…์ด ๋ฌด์กฐ๊ฑด ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

Readonly ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์†์„ฑ ๋ณ€๊ฒฝ ๋ฐ ์ถ”๊ฐ€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค ๐Ÿ˜ต

 

const names: Readonly<string[]> = ['Shou', 'Apeach'];
names.push('Rabbit'); // Error occurred
names.pop(); // Error occurred

 

Utility Types
https://www.typescriptlang.org/docs/handbook/utility-types.html

 

Generics vs Union types

class DataStorage<T> {
    private data: T[] = [];
    
    addItem(item: T) {
        this.data.push(item);
    }
    
    removeItem(item: T) {
        this.data.splice(this.data.indexOf(item), 1);
    }
    
    getItems() {
        return [...this.data];
    }
}

const numberStorage = new DataStorage<number>();

์ œ๋„ค๋ฆญ์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ์ ์— number ํƒ€์ž…์˜ ๋ฐฐ์—ด์„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•˜๊ฒ ๋‹ค๊ณ  ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ,

class DataStorage {
    private data: (string | number | boolean)[] = [];
    
    addItem(item: string | number | boolean) {
        this.data.push(item);
    }
    
    removeItem(item: string | number | boolean) {
        this.data.splice(this.data.indexOf(item), 1);
    }
    
    getItems() {
        return [...this.data];
    }
}

union ํƒ€์ž…์€ data๋ผ๋Š” ๋ฐฐ์—ด์— any ํƒ€์ž…์„ ์ง€์ •ํ•ด์ค€ ๊ฒƒ๊ณผ ๋‹ค๋ฆ„์—†๋Š”..๐Ÿซข (์˜ˆ์ œ๊ฐ€ ์‹ค์ œ๋กœ any์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ)

์ด ๊ฒฝ์šฐ data์˜ ํƒ€์ž…์„ string[] | number[] | boolean[]์œผ๋กœ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์œผ๋‚˜

์ด๋ ‡๊ฒŒ ๋˜๋ฉด data๋ฅผ ์–ด๋–ค ํƒ€์ž…์˜ ๋ฐฐ์—ด๋กœ ์„ค์ •ํ•˜๋А๋ƒ์— ๋”ฐ๋ผ item์˜ ํƒ€์ž… ๋˜ํ•œ ์œ ๋™์ ์œผ๋กœ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— item์˜ ํƒ€์ž… ์„ค์ •์ด ์–ด๋ ค์›Œ์ง„๋‹ค ๐Ÿ˜ก

 

์ œ๋„ค๋ฆญ์€ ํŠน์ • ํƒ€์ž…์„ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜, ์ƒ์„ฑํ•œ ์ „์ฒด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ๊ฑธ์ณ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ „์ฒด ํ•จ์ˆ˜์— ๊ฑธ์ณ ๊ฐ™์€ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
union ํƒ€์ž…์€ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด๋‚˜ ๋ชจ๋“  ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ง€์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค.

'๐Ÿ“ Study > TypeScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[TS] Project Drag & Drop 1๏ธโƒฃ  (2) 2023.03.27
[TS] Decorators 3๏ธโƒฃ  (0) 2023.03.24
[TS] Decorators 2๏ธโƒฃ  (0) 2023.03.22
[TS] Decorators 1๏ธโƒฃ  (1) 2023.03.20
[TS] Generics 1๏ธโƒฃ  (4) 2023.03.16
profile

Dream๐Ÿฐng

@shoupeach

๐Ÿฐ Happy new rabbit! ๐Ÿฐ

profile on loading

Loading...