[TS] ๐Ÿฆštypescript ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…

TATAยท2023๋…„ 4์›” 25์ผ
0

TypeScript

๋ชฉ๋ก ๋ณด๊ธฐ
3/4

โ–ท typescript ์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…

์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์„ ์ด์šฉํ•˜๋ฉด ํƒ€์ž… ๋ณ€ํ™˜์„ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.

์œ ํ‹ธ๋ฆฌํ‹ฐ ํƒ€์ž…์„ค๋ช…ํƒ€์ž… ์ธ์ž
Awaited๋น„๋™๊ธฐ ํ•จ์ˆ˜๋‚˜ Promise๋ฅผ ๊ธฐ๋‹ค๋ ธ์„ ๋•Œ, ํ•ด๋‹น ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ ๊ฐ’์ธ Type์— ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž…์„ ๊ฐ€์ ธ์˜ด<TYPE>
Partial๋ถ€๋ถ„์ <TYPE>
Requiredํ•„์ˆ˜์ <TYPE>
Readonly์ฝ๊ธฐ ์ „์šฉ<TYPE>
RecordKEY-์†์„ฑ, TYPE-์†์„ฑ๊ฐ’์˜ ํƒ€์ž… ํ˜•ํƒœ๋กœ ์ƒˆ๋กœ์šด ํƒ€์ž… ๋ฐ˜ํ™˜ (์ธํ„ฐํŽ˜์ด์Šค)<KEY, TYPE>
OmitTYPE์—์„œ KEY๋กœ ์†์„ฑ์„ ์ƒ๋žต<TYPE, KEY>
PickTYPE์—์„œ KEY๋กœ ์†์„ฑ์„ ์„ ํƒ<TYPE, KEY>
Exclude์ œ์™ธ. TYPE1์—์„œ TYPE2๋ฅผ ์ œ์™ธ (์œ ๋‹ˆ์–ธ)<TYPE1, TYPE2>
Extract๊ต์ง‘ํ•ฉ์ž„. TYPE1์—์„œ TYPE2๋ฅผ ์ถ”์ถœ (์œ ๋‹ˆ์–ธ)<TYPE1, TYPE2>
NonNullablenull๊ณผ undefined๋ฅผ ์ œ์™ธ (์œ ๋‹ˆ์–ธ)<TYPE>
ParametersTYPE์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ƒˆ๋กœ์šด ํŠœํ”Œ ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ (ํ•จ์ˆ˜, ํŠœํ”Œ)<TYPE>
ReturnTypeTYPE์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ƒˆ๋กœ์šด ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ (ํ•จ์ˆ˜)<TYPE>
InstanceTypeTYPE์˜ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ๋ฐ˜ํ™˜ (ํด๋ž˜์Šค)<typeof TYPE>

๐Ÿฆš Awaited

๋น„๋™๊ธฐ ํ•จ์ˆ˜๋‚˜ Promise๋ฅผ ๊ธฐ๋‹ค๋ ธ์„ ๋•Œ, ํ•ด๋‹น ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ ๊ฐ’์ธ Type์— ํ•ด๋‹นํ•˜๋Š” ํƒ€์ž…์„ ๊ฐ€์ ธ์˜จ๋‹ค.

async function fetchData(): Promise<string> {
  return "Hello, World!";
}

async function example() {
  const result: Awaited<ReturnType<typeof fetchData>> = await fetchData();
  console.log(result); // result์˜ ํƒ€์ž…์€ string์œผ๋กœ ์ถ”๋ก 
}

example();

๐Ÿฆš Partial

๋ถ€๋ถ„์ 

interface User {
  name: string
  age: number
}

type UserPartial = Partial<User>

const a : UserPartial = {
    name: "tata" // age๋ฅผ ์ ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
}

console.log(a.name) // tata

๐Ÿฆš Required

ํ•„์ˆ˜์ 

interface User {
  name: string
  age?: number
}

type UserPartial = Required<User>

const a : UserPartial = {
    name: "tata",
    age: 7  // ์ ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค.
}

console.log(a.name) // tata
console.log(a.age) // 7 

๐Ÿฆš Readonly

์ฝ๊ธฐ ์ „์šฉ์ด๋ผ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.

interface User {
  name: string
  age?: number
}

type UserPartial = Readonly<User>

const a : UserPartial = {
    name: "tata",
    age: 7
}

// a.age = "chimmy" ์ด๋ ‡๊ฒŒ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•จ.

๐Ÿฆš Record

<KEY, TYPE>

KEY๋ฅผ ์†์„ฑ์œผ๋กœ, TYPE์„ ์†์„ฑ ๊ฐ’์˜ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด ํƒ€์ž…์„ ์ƒ์„ฑํ•œ๋‹ค.

type Fruit = 'apple' | 'banana' | 'orange';

type FruitMap = Record<Fruit, number>;

const fruitCount: FruitMap = {
  apple: 10,
  banana: 20,
  orange: 15
};

๐Ÿฆš Omit

<TYPE, KEY>

TYPE์—์„œ KEY๋กœ ์†์„ฑ์„ ์ƒ๋žต

interface User {
  name: string
  age: number
}

type UserWithoutAge = Omit<User, 'age'>;

const a: UserWithoutAge = {
  name: 'tata',
};

console.log(a.name) // tata

๐Ÿฆš Pick

<TYPE, KEY>

TYPE์—์„œ KEY๋กœ ์†์„ฑ์„ ์„ ํƒ

interface User {
  id: number;
  name: string;
  age: number;
  email: string;
}

type UserPick = Pick<User, 'name' | 'email'>;

const a: UserPick = {
  name: 'tata',
  email: 'tata@example.com'
};

console.log(a.name) // tata
console.log(a.email) // tata@example.com

๐Ÿฆš Exclude

<TYPE1, TYPE2>
<ํƒ€์ž…, ์ œ์™ธํ•  ์œ ๋‹ˆ์˜จ ํƒ€์ž…>

์ œ์™ธ. TYPE1์—์„œ TYPE2๋ฅผ ์ œ์™ธ (์œ ๋‹ˆ์–ธ)

type T1 = number | string | boolean;
type T2 = string | boolean;
type T3 = Exclude<T1, T2>; // T3 ํƒ€์ž…์€ number์ด๋‹ค.

-----
type T1 = 'a' | 'b' | 'c' | 'd';
type T2 = 'a' | 'c';
type T3 = Exclude<T1, T2>; // T3 ํƒ€์ž…์€ 'b' | 'd'์ด๋‹ค.

๐Ÿฆš Extract

<TYPE1, TYPE2>
<ํƒ€์ž…, ๊ต์ง‘ํ•ฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์œ ๋‹ˆ์˜จ ํƒ€์ž…>

๊ต์ง‘ํ•ฉ์ž„. TYPE1์—์„œ TYPE2๋ฅผ ์ถ”์ถœ (์œ ๋‹ˆ์–ธ)

type T1 = number | string | boolean;
type T2 = string | boolean;
type T3 = Extract<T1, T2>; // T3 ํƒ€์ž…์€ string, boolean์ด๋‹ค.

-----
type T1 = 'a' | 'b' | 'c' | 'd';
type T2 = 'a' | 'c';
type T3 = Extract<T1, T2>; // T3 ํƒ€์ž…์€ 'a' | 'c'์ด๋‹ค.

๐Ÿฆš NonNullable

NonNullable

null๊ณผ undefined๋ฅผ ์ œ์™ธ (์œ ๋‹ˆ์–ธ)

type T1 = string | number | null | undefined;
type T2 = Extract<T1, string | null>; // 'string' | null
type T3 = NonNullable<T2>; // 'string'

๐Ÿฆš Parameters

TYPE์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์ƒˆ๋กœ์šด ํŠœํ”Œ ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ (ํ•จ์ˆ˜, ํŠœํ”Œ)

type MyFunctionType = (a: number, b: string, c: boolean) => void;
type MyParametersType = Parameters<MyFunctionType>;
// [number, string, boolean]

const a: MyParametersType = [12, "12", true]
console.log(a) // [12, "12", true]

-----
type Example = Parameters<(a: number, b: number) => void>
// [number, number]
  
const a: Example = [12, 13]
console.log(a) // [12, 13]

๐Ÿฆš ReturnType

TYPE์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ƒˆ๋กœ์šด ํƒ€์ž…์œผ๋กœ ๋ฐ˜ํ™˜ (ํ•จ์ˆ˜)

type R1 = ReturnType<() => string>

const a = (): R1 => {
    return '123'
}
console.log(a()) // "123"

๐Ÿฆš InstanceType

<typeof TYPE>

TYPE์˜ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ๋ฐ˜ํ™˜ (ํด๋ž˜์Šค)
typeof๋ฅผ ๊ผญ ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

class MyClass {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
}

type MyType = InstanceType<typeof MyClass>; // MyClass

const instance: MyType = new MyClass("hello");
console.log(instance); // MyClass { name: 'hello' }



๐Ÿ‘‰ Utility Types
๐Ÿ‘‰ typescript ํ•œ๊ธ€ ๋ฒˆ์—ญ

profile
๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€