TypeScript: Utility types

55555-JyeonΒ·2024λ…„ 1μ›” 20일
2

What's

λͺ©λ‘ 보기
5/7
post-thumbnail

🧐 μ‹€λ¬΄μ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” νƒ€μž… λ°”λ‘œ μ•ŒκΈ° (2/3)

νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—λŠ” ꡉμž₯히 λ§Žμ€ νƒ€μž…λ“€μ΄ μ‘΄μž¬ν•˜κ³  μ‹€μ œλ‘œλŠ” 자주 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” νƒ€μž…λ“€λ„ 많이 μ‘΄μž¬ν•©λ‹ˆλ‹€.
μ•„λž˜λŠ” λ§Žμ€ κ°œλ°œμžλ“€μ΄ μ‹€λ¬΄μ—μ„œ μ‚¬μš©ν•˜λ©΄μ„œ κ°„ν˜Ή ν˜Ήμ€ 자주 μ‚¬μš©ν•˜λŠ” νƒ€μž…λ“€ 쀑 μœ ν‹Έλ¦¬ν‹° νƒ€μž…λ“€μž…λ‹ˆλ‹€.




ν‘œλ‘œ μ •λ¦¬ν•œ μœ ν‹Έλ¦¬ν‹° νƒ€μž…


Utility Types
type desc.
enum ⭐️ μ—¬λŸ¬ 값듀에 미리 이름을 μ •μ˜ν•˜μ—¬ μ—΄κ±°ν•΄ 두고 μ‚¬μš©ν•˜λŠ” νƒ€μž…
as const ⭐️ κ°’μ˜ μž¬ν• λ‹Ήμ„ 막아버리기 λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šμ€ λ³€κ²½μœΌλ‘œ μΈν•œ 였λ₯˜ ⬇️
record νŠΉμ • νƒ€μž…μ˜ λͺ¨λ“  μ†μ„±μ˜ 값을 μΌμ •ν•œ νƒ€μž…μœΌλ‘œ 맀핑
partial λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό ?(optional)둜 λ§Œλ“€μ–΄ λ²„λ¦¬λŠ” νƒ€μž…
omit νŠΉμ • νƒ€μž…μ—μ„œ μ§€μ •λœ 속성을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 속성을 κ°€μ§€λŠ” μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•˜λŠ” νƒ€μž…
pick νŠΉμ • νƒ€μž…μ—μ„œ μ§€μ •λœ μ†μ„±λ§Œμ„ μ„ νƒν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ 생성
extract 첫번째 μ œλ„€λ¦­ νƒ€μž… T에 λŒ€ν•˜μ—¬ μ œλ„€λ¦­ νƒ€μž… U 쀑 ν• λ‹Ή κ°€λŠ₯ν•œ νƒ€μž…μ„ ν• λ‹Ή
return type νŠΉμ • ν•¨μˆ˜μ˜ 좜λ ₯을 λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ 가져와야 ν•˜λŠ” μƒν™©μ—μ„œ 맀우 유용
optional νŠΉμ • ν”„λ‘œνΌν‹°λ₯Ό ?(optional)둜 λ§Œλ“€μ–΄ λ²„λ¦¬λŠ” νƒ€μž…
satisfies 주둜 μ•ˆμ „ν•˜κ²Œ νƒ€μž… ν‘œλͺ…(Type Assertion)을 ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
generic μž¬μ‚¬μš©μ„±μ΄ 높은 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€ λ•Œ 자주 ν™œμš©


πŸ” μ˜ˆμ‹œλ‘œ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄λŠ” μœ ν‹Έλ¦¬ν‹° νƒ€μž…


enum ⭐️

μ—¬λŸ¬ 값듀에 미리 이름을 μ •μ˜ν•˜μ—¬ μ—΄κ±°ν•΄ 두고 μ‚¬μš©ν•˜λŠ” νƒ€μž…
μ—΄κ±°, 맀겨진 값을 μ‚¬μš©ν•΄ enum λ©€λ²„μ˜ 이름을 μ•Œμ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
λ³€μˆ˜λ“€μ„ ν•˜λ‚˜μ˜ 그룹으둜 λ¬Άκ³  싢을 λ•Œ μ‚¬μš©ν•  수 있으며 νŠΉμ • κ°’μ˜ 집합을 μ •μ˜ν•˜λ©° μ΄λŠ” μ½”λ“œλ₯Ό 더 가독성 있고 μœ μ§€λ³΄μˆ˜ ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ€λ‹ˆλ‹€.

enum Color {
  white = "#ffffff",
  red = "#F1061A ",
  orange = "#FA7804",
  yellow = "#FAEB04",
  green = "#3BE80D",
  darkGreen = "#065823",
  blue = "#2ACAF9",
  navy = "#0C188F",
  purple = "#6111DD",
  black = "#000000",
}

let RedColor: Color = Color.red;
console.log(RedColor);

as const ⭐️

type assertion의 ν•œ μ’…λ₯˜λ‘œμ¨ λ¦¬ν„°λŸ΄ νƒ€μž…μ˜ μΆ”λ‘  λ²”μœ„λ₯Ό 쀄이고 κ°’μ˜ μž¬ν• λ‹Ήμ„ 막기 μœ„ν•œ λͺ©μ μœΌλ‘œ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.
as constλ₯Ό μ‚¬μš©ν•˜λ©΄ μ›μ‹œ νƒ€μž…μ΄λ“  μ°Έμ‘° νƒ€μž…μ΄λ“  κ°’μ˜ μž¬ν• λ‹Ήμ„ 막아버리기 λ•Œλ¬Έμ— μ˜λ„μΉ˜ μ•Šμ€ λ³€κ²½μœΌλ‘œ μΈν•œ 였λ₯˜λ₯Ό 없앨 수 μžˆμŠ΅λ‹ˆλ‹€.

const InternationalAirport = {
  	Korea: "ICN", 
  	Japan: "HND", 
	France: "CDG", 
  	Vietnam: "HAN",
  	UK: "LCY",
  	Italy: "FCO",
} as const; // read only (읽기 μ „μš©)

const DomesticAirport = {
  incheon: "ICN", 
  kimpo: "GMP",
  jeju: "CJU",
} as const; 

const AmericaAirport = {
  WashingtonDC: "IAD",
  NewYork: "JFK", 
  LosAngeles: "LAX",
  Orlando: "MCO",
  Seattle: "SEA",
  Chicago: "ORD",
  Boston: "BOS",
  Guam: "GUM",
} as const; 

as constλ₯Ό 뢙이면 객체의 λͺ¨λ“  ν”„λ‘œνΌν‹° 값듀이 readonly의 λ¦¬ν„°λŸ΄ 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€.
λ¦¬ν„°λŸ΄ νƒ€μž…μ˜ μΆ”λ‘  λ²”μœ„κ°€ λ¦¬ν„°λŸ΄ κ°’ 자체둜 ν•œμ •λ˜λ©΄μ„œ μ’€ 더 μ•ˆμ „ν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const Colors = {
  white = "#ffffff",
  red = "#F1061A ",
  green = "#3BE80D",
  blue = "#2ACAF9",
  black = "#000000",
} as const;

enum COLOR {
  white,
  red,
  green,
  blue,
  black,
}

record

νƒ€μž… Type의 ν”„λ‘œνΌν‹° ν‚€μ˜ μ§‘ν•©μœΌλ‘œ νƒ€μž…μ„ 생성해 νƒ€μž…μ˜ ν”„λ‘œνΌν‹°λ₯Ό λ‹€λ₯Έ νƒ€μž…μ— 맀핑 μ‹œν‚€λŠ”λ° μ‚¬μš©ν•©λ‹ˆλ‹€.
<> μ•ˆμ— μ–΄λ–€ 값이 μ˜€λŠ”μ§€μ— 따라 λ‹€λ₯΄κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ :
Record<Key, Value> πŸ‘‰ key & value ν•œ λ²ˆμ— 객체 νƒ€μž…μœΌλ‘œ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
Record<keys, type> πŸ‘‰ ν•œ μœ ν˜•μ˜ 속성을 λ‹€λ₯Έ μœ ν˜•μ— λ§€ν•‘ν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

type postContents = Record<string, string>;

let post: postContents = {
  title: "Mobi",
  contents:
    "λͺ¨λΉ„λŠ” κ°’λΉ„μ‹Ό μ‚¬κ΅μœ‘, ν˜„μ‹€μ  μ‹œκ°„ 투자의 결여에 겁먹은 μ„Έμƒμ˜ λͺ¨λ“  λΉ„μ „κ³΅μžλ“€μ„ μœ„ν•΄ 무료둜 κ΅μœ‘μ„ μ œκ³΅ν•˜κ³  μ·¨μ—… μ΄ν›„μ˜ 인프라 ν˜•μ„±μ„ 톡해 μƒˆλ‘œμš΄ μ‹œμž‘μ„ μ‘μ›ν•˜λŠ” λΉ„μ˜λ¦¬ λ‹¨μ²΄μž…λ‹ˆλ‹€.",
};
interface Mobi {
  term : number;
  isOperator: boolean;
  whichDeveloper: "FE" | "BE" | "Full";
}

type GraduatesName = "Zoey" | "Zero";

const graduates: Record<Mobi, Developer> = {
  Zoey: { term: 1, isOperator: true, whichDeveloper: "FE" },
  Zero: { term: 1, isOperator: true, whichDeveloper: "FE" },
};

partial

<>의 νƒ€μž…μ˜ λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό ?(optional)둜 λ§Œλ“€μ–΄ λ²„λ¦¬λŠ” νƒ€μž…μž…λ‹ˆλ‹€.
주어진 νƒ€μž…μ˜ λͺ¨λ“  ν•˜μœ„ νƒ€μž… 집합을 λ‚˜νƒ€λ‚΄λŠ” νƒ€μž…μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
νŠΉμ • νƒ€μž…μ˜ λͺ¨λ“  μ†μ„±μ˜ 값을 μ„ νƒμ μœΌλ‘œ λ§Œλ“€μ–΄μ€„ 수 μžˆμŠ΅λ‹ˆλ‹€.

interface Person {
  name: string;
  age: number;
}

type PartialPerson = Partial<Person>;

const partialPerson: PartialPerson = {};

partialPerson.name = "Peanut";
partialPerson.age = 20;
interface Mobi {
  username: string;
  term: number;
  sort: "FE" | "BE" | "Full";
  gender: "male" | "female";
  isOperator:boolean;
  isDirector?:boolean;
}

let Kimi: Mobi {
  username: 'Kimi';
  term:2;
  sort: "FE";
  gender:"female";
  isOperator: false;
}
let novice: Partial<Mobi> = {
  name: "Peanut",
  sort: "Full",
  isDirector: true,
};

let newbie: Partial<Mobi> = {
  name: "Amy",
  sort: "FE",
  term: 2;
};

omit

νŠΉμ • νƒ€μž…μ—μ„œ μ§€μ •λœ 속성을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 속성을 κ°€μ§€λŠ” μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•˜λŠ” νƒ€μž…μž…λ‹ˆλ‹€.
Omit<T,K>둜 ν‘œν˜„ πŸ‘‰ Tμ—μ„œ λͺ¨λ“  ν”„λ‘œνΌν‹°λ₯Ό μ„ νƒν•œ λ‹€μŒ Kλ₯Ό μ œκ±°ν•œ νƒ€μž…μ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

interface Mobi {
  name: string;
  age: number;
  isMember: boolean;
}

type MobiPreview = Omit<Mobi, "isMember">;

const mobi: MobiPreview = {
  name: "Chestnut",
  age: 19,
};

pick

νŠΉμ • νƒ€μž…μ—μ„œ μ§€μ •λœ μ†μ„±λ§Œμ„ μ„ νƒν•˜μ—¬ μƒˆλ‘œμš΄ νƒ€μž…μ„ μƒμ„±ν•©λ‹ˆλ‹€.
Pick<T,K>둜 ν‘œν˜„ πŸ‘‰ Tμ—μ„œ ν”„λ‘œνΌν‹° K의 집합을 선택해 νƒ€μž…μ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

interface Mobi {
  name: string;
  age: number;
  isMember: boolean;
}

type MobiInfo = Pick<Mobi, "name" | "age">;

const Mobi: MobiPreview = {
  name: "Chestnut",
  age: 19,
};

extract

(Exclude와 λ°˜λŒ€λ˜λŠ” κ°œλ…)
첫번째 μ œλ„€λ¦­ νƒ€μž… T에 λŒ€ν•˜μ—¬ μ œλ„€λ¦­ νƒ€μž… U 쀑 ν• λ‹Ή κ°€λŠ₯ν•œ νƒ€μž…μ„ ν• λ‹Ήν•©λ‹ˆλ‹€.
Extract<T,U> πŸ‘‰ Tμ—μ„œ U에 ν• λ‹Ή ν•  수 μžˆλŠ” λͺ¨λ“  속성을 μΆ”μΆœν•˜μ—¬ νƒ€μž…μ„ ꡬ성
type Extract<T, U> = T extends U ? T : never πŸ‘‰ Tνƒ€μž…μ—μ„œ Uνƒ€μž…κ³Ό 겹치늩 νƒ€μž…λ§Œμ„ μΆ”μΆœ

type Animal = "Cat" | "Dog" | "Pig" | "Cow";
type Pet = "Cat" | "Dog";

type myPet = Extract<Animal, Pet>;

return type

ReturnType< T > 으둜 ν‘œν˜„ πŸ‘‰ ν•¨μˆ˜ T의 λ°˜ν™˜ νƒ€μž…μœΌλ‘œ κ΅¬μ„±λœ νƒ€μž…μ„ λ§Œλ“¦

declare function Peanuts(): { name: string; age: number };

type MobiType0 = ReturnType<() => string>;
type MobiType1 = ReturnType<(s: string) => void>;
type MobiType2 = ReturnType<<Peanuts>() => Peanuts>;
type MobiType3 = ReturnType<<Peanuts extends MobiStudy, MobiStudy extends number[]>() => Peanuts>;
type MobiType4 = ReturnType<typeof Peanuts>;
type MobiType5 = ReturnType<any>;

νŠΉμ • ν•¨μˆ˜μ˜ 좜λ ₯을 λ‹€λ₯Έ ν•¨μˆ˜μ—μ„œ 가져와야 ν•˜λŠ” μƒν™©μ—μ„œ 맀우 μœ μš©ν•˜κ²Œ 쓰일 수 μžˆμŠ΅λ‹ˆλ‹€.
sendDate의 리턴 κ²°κ³Όλ₯ΌΒ Data둜 νƒ€μ΄ν•‘ν•˜μ—¬ 전달 ν›„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

function sendData(a: number, b: number) {
    return {
        a: `${a}`,
        b: `${b}`
    }
}

type Data = {
    a: string,
    b: string
}

function consoleData(data:Data) {
    console.log(JSON.stringify(data));
}

let stringifyNumbers = sendData(1, 2);
consoleData(stringifyNumbers);

λ§Œμ•½ sendData의 좜λ ₯ νƒ€μž…μ΄ λ°”λ€Œλ©΄ Data νƒ€μž…λ„ λ°”κΏ”μ€˜μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.
이런 μΌ€μ΄μŠ€λ₯Ό 막기 μœ„ν•΄, 두 개의 νƒ€μž…μ„ 동기화 ν•΄μ€λ‹ˆλ‹€.

function sendData(a: number, b: number) {
    return {
        a: `${a}`,
        b: `${b}`
    }
}

type Data = ReturnType<typeof sendData> // ReturnData νƒ€μž…μ€ sendData의 λ°˜ν™˜ νƒ€μž…μ΄ μžλ™ 지정
                       
// The same as writing:
type Data = {
     a: string,
     b: string
}

optional

  interface SignUpData {
  email: string;
  password: string;
  nickname: string;
  name: string;
  age?: number;
  phone?: number;
  location?: string;
}
type Mobi = {
	name: string;
  	term: number;
  	isOperator?: boolean;
  	isDirector?:boolean;
}

type MobiOperator = {
	name: string;
  	term: number;
  	isOperator: true;
}

const Jane:MobiOperator = {
	name: "Jane",
  	term: 1,
  	isOperator: true,
}

satisfies

μœ λ‹ˆμ˜¨ νƒ€μž…κ³Ό ν˜Έν™˜λ˜λŠ” νƒ€μž…μ˜ λ©”μ†Œλ“œλ‘œ 호좜 μ‹œλ„ μ‹œ 정적 μ—λŸ¬ λ°œμƒ X
μ •ν™•νžˆ props의 νƒ€μž…μ„ μΆ”λ‘ , value의 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
νƒ€μž… μΆ”λ‘ κ³Ό μ˜€νƒ€ 검사λ₯Ό λ™μ‹œμ— ν•  수 μžˆμ–΄ 객체의 νƒ€μž… κ²€μ‚¬μš©μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

  const palette = {
  purple: [100, 9, 240],
  navy: [31, 12, 188],
  blue: [12, 202, 162],
} satisfies Record<"purple" | "navy" | "blue", [number, number, number]>;

const grade = {
  a: 90,
  b: "B",
  c: 70,
  f: 60,
} satisfies Record<"a" | "b" | "c" | "f", number | string>;

Type Assertion (νƒ€μž… 단언) πŸ‘‰ λ³€μˆ˜μ˜ νƒ€μž…μ„ κ°œλ°œμžκ°€ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜λŠ” 방법
νƒ€μž…μ„ λ‹¨μ–Έν•˜λŠ” λ°©μ‹μ—λŠ” 크게 3가지가 μžˆμŠ΅λ‹ˆλ‹€.
TypeScriptλŠ” νƒ€μž… 좔둠을 톡해 λŒ€λΆ€λΆ„μ˜ μƒν™©μ—μ„œ νƒ€μž…μ„ μΆ”λ‘ ν•  수 있기 λ•Œλ¬Έμ—,
λͺ…μ‹œμ μΈ νƒ€μž… 단언이 ν•„μš”ν•œ 경우λ₯Ό μ œμ™Έν•˜κ³ λŠ” μ‚¬μš©μ„ μ΅œμ†Œν™”ν•˜λŠ” 것이 μ’‹λ‹€λŠ” 것에 μœ μ˜ν•˜λ©° μ‚¬μš©ν•˜λŠ”κ²Œ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

[ Type Assertion 방식 ]
1. <> πŸ‘‰ JSX λ¬Έλ²•μ΄λž‘ κ²Ήμ³μ„œ 자주 μ‚¬μš© X
2. as
3. satisfies

type annotation πŸ‘‰ νƒ€μž…μ— 주석을 λ‹€λŠ” 방법
AnnotateλŠ” "주석을 달닀" λΌλŠ” 사전적인 λœ»μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.
νƒ€μž…μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” λ³€μˆ˜, ν•¨μˆ˜, ν•¨μˆ˜ λ°˜ν™˜κ°’μ˜ 데이터 νƒ€μž…μ„ μ§€μ •ν•˜κΈ° μœ„ν•΄ "νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜"을 μ‚¬μš©ν•©λ‹ˆλ‹€.
ν•œ 번 μ‹λ³„μžλ₯Ό νŠΉμ • νƒ€μž…μœΌλ‘œ annotated ν•˜λ©΄ ν•΄λ‹Ή νƒ€μž…λ§Œ μ‚¬μš©ν•  수 있게 λ©λ‹ˆλ‹€.
λ‹€λ₯Έ νƒ€μž…μ„ μ‚¬μš©ν•˜κ²Œ 되면 νƒ€μž…μŠ€ν¬λ¦½νŠΈ μ»΄νŒŒμΌλŸ¬κ°€ μ—λŸ¬λ₯Ό λ˜μ§‘λ‹ˆλ‹€.

// λ³€μˆ˜μ— νƒ€μž… μ§€μ •ν•˜κΈ°
let a:number;
a = "string";   //error
a = 20;   // o
function greetings(a: number){
  console.log(a)
}
hello(10) // o

function hello(a: number){
  console.log(a)
}
hello("world") //error

1️⃣ κ°„λ‹¨ν•œ νƒ€μž… 쒁히기
μ–΄λ…Έν…Œμ΄μ…˜ 지정, typeof 쑰건문을 μ‚¬μš©ν•΄ κ°„λ‹¨νžˆ νƒ€μž…μ„ 쒁힐 수 μžˆμŠ΅λ‹ˆλ‹€.

type Colors = "red" | "green" | "blue";
type RGB = [red: number, green: number, blue: number];

const paletteRGB: Record<Colors, string | RGB> = {
  red: [255, 0, 0],
  green: "#00ff00",
  blue: [0, 0, 255],
};
paletteRGB.red.map(0); // ❌ πŸ‘‰ νƒ€μž…μ΄ string이 μ˜¬μ§€ RGBκ°€ μ˜¬μ§€ ν™•μ • 지을 수 μ—†κΈ° λ•Œλ¬Έμ— map μ‚¬μš© λΆˆκ°€
paletteRGB.green.toUpperCase(); // ❌ πŸ‘‰ νƒ€μž…μ΄ string이 μ˜¬μ§€ RGBκ°€ μ˜¬μ§€ ν™•μ • 지을 수 μ—†κΈ° λ•Œλ¬Έμ— toUpperCase μ‚¬μš© λΆˆκ°€

// λ”°λΌμ„œ typeof 쑰건문 ν™œμš©
if (typeof paletteRGB.green === "string") {
  paletteRGB.green.toUpperCase();
}

맀번 쑰건문을 μ“°κΈ° λ²ˆκ±°λ‘­λ‹€λ©΄ satisfies μ‚¬μš©ν•΄μ„œ ν•΄μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

//  satisfies μ‚¬μš©μœΌλ‘œ νƒ€μž…μ„ μ’ν˜€ 쑰건문 없이 ν•΄λ‹Ή νƒ€μž…μ— λ§žλŠ” λ©”μ„œλ“œ μ‚¬μš© κ°€λŠ₯
const paletteRGB = {
  red: [255, 0, 0],
  green: "#00ff00",
  blue: [0, 0, 255],
} satisfies Record<Colors, string | RGB>;
paletteRGB.green.toUpperCase(); 

2️⃣ κ°„κ²°ν•œ νƒ€μž… 체크
2-1. μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ ν–ˆμ„ λ•Œ

// νƒ€μž… 지정
interface Data {
  a: "A" | "B" | "C" | "D";
  b: number;
  c: string;
  d: string[];
}
// Partial둜 νƒ€μž…μ„ μ„ νƒμ μœΌλ‘œ κ°€μ Έμ˜¨ baseData1
const smallData: Partial<Data> = {
  //Partial<Data>
  a: "A",
  b: 1,
};

const smallData: Data = {
  ...smallData, // smallData의 νƒ€μž…μ€ a,bκ°€ μ•„λ‹ˆλΌ Partialνƒ€μž…μœΌλ‘œ νŒλ‹¨ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš© λΆˆκ°€λŠ₯
   c: "string",
  d: ["array"],
 };

2-2. satisfies μ‚¬μš©

const smallData2 = {
  a: "A",
  b: 1,
} satisfies Partial<Data>;

const smallData2: Data = {
  ...smallData2, // satisfiesμ‚¬μš©μœΌλ‘œ Data νƒ€μž…μ˜ a,bλ₯Ό λ§Œμ‘±ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš© κ°€λŠ₯
  c: "string",
  d: ["array"],
};

3️⃣ μ•ˆμ „ν•œ νƒ€μž… 단언
3-1. asλ₯Ό 썼을 λ•Œ

interface Developer {
  name: string;
  nickname: string;
  major: "frontend" | "backend"; 
}

// μ—λŸ¬κ°€ λ‚  상황인데 as λ•Œλ¬Έμ— κ·Έλƒ₯ ν†΅κ³Όλœλ‹€
// as : νƒ€μž…μ„ μ κ²€ν•˜μ§€ μ•ŠμŒ
const dev = {
  name: "Peter",
  nickname: "Peanut",
} as User;

3-2. satisfies μ‚¬μš©

const dev = {
  name: "Peter",
  nickname: "Peanut",
} satisfies Developer as Developer; // μ—λŸ¬ λ°œμƒμ‹œμΌœ 쀌
// satisfiesμ‚¬μš©μœΌλ‘œ νƒ€μž…μ΄ λ§Œμ‘±ν•˜λŠ”μ§€ ν™•μΈν•œ λ‹€μŒ as둜 λ‹¨μ–Έν•˜κΈ° λ•Œλ¬Έμ— μ•ˆμ „ν•˜κ²Œ νƒ€μž…μ„ 단언 ν•  수 있음

generic

μž¬μ‚¬μš©μ„±μ΄ 높은 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€ λ•Œ 자주 ν™œμš©λ©λ‹ˆλ‹€.
특히, ν•œκ°€μ§€ νƒ€μž…λ³΄λ‹€ μ—¬λŸ¬ 가지 νƒ€μž…μ—μ„œ λ™μž‘ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μƒμ„±ν•˜λŠ”λ° 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.

T κΊΎμ‡  μ•ˆμ— λ„£λŠ” νƒ€μž…μœΌλ‘œ λͺ¨λ“  Tκ°€ ν•΄λ‹Ή νƒ€μž…μœΌλ‘œ λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.

  // μ œλ„€λ¦­ νƒ€μž…μ„ 기본으둜 μ“°λŠ” 방법
type MyProfile<T> = {
  hobby: Array<T>;
};

// extends generic type
type StudentType = {
  fullName: string;
  nickName: string;
  age: number;
};

const StudentDetail = <T extends StudentType>(detail: T) => ({
  fullName: "TopDragon",
  nickName: "Peanut",
  age: 20,
  isDirector: true,
});



references
return type >> https://itchallenger.tistory.com/638

profile
πŸ₯ž Stack of Thoughts

0개의 λŒ“κΈ€