Skip to content

Commit

Permalink
ts - infer, Required, Record, NonNullable
Browse files Browse the repository at this point in the history
  • Loading branch information
jihunhong committed Oct 14, 2022
1 parent c4f4889 commit 8793433
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
72 changes: 72 additions & 0 deletions TypeScript/22.10.13 Required, Record, NonNullable.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
### Required, Record, NonNullable

#### Required<T>
```ts
interface Profile {
name: string
age: number
married: boolean
}


const someone: Required<Profile> = {
name: 'someone',
age: 30,
married: false
}

type R<T> = {
[key in keyof T]-?: T[key]
}
```
- ```-?``` Opitonal์„ ```-``` Optional์„ ์ œ๊ฑฐํ•˜๋Š”๊ฒƒ
#### Readonly<T>
```ts
interface Profile {
name: string
age: number
married: boolean
}


const someone: R<Profile, 'married'> = {
name: 'someone',
age: 30,
married: false
}

type R<T> = {
readonly [key in keyof T]: T[key]
// -readonly [key in keyof T]: T[key]
// readonly๋ฅผ ์ œ๊ฑฐํ•˜๋Š”๊ฒƒ
}
```
#### Record<T>
```ts
interface Obj {
[key: string]: number
}
const a: Obj = { a: 3, b: 5, c: 7};
const a: Record<string, number> = { a: 3, b: 5, c: 7};

type _Record<T extends keyof any, S> = {
[key in T]: S
}
// <T extends keyof any>
// ๊ฐ€ ๋ถ™๋Š” ์ด์œ ๋Š” ๊ฐ์ฒด์˜ ํ‚ค๊ฐ€ string, number, symbol๋งŒ ์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
```
#### NonNullable
```ts
type A = string | null | undefined | boolean | number;
type B = NonNullable<A>
// B: string | boolean | number

type _NonNullable<T> = T extends null | undefined ? never : T;
```
36 changes: 36 additions & 0 deletions TypeScript/22.10.13 infer ํƒ€์ž… ๋ถ„์„.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
### infer ํƒ€์ž… ๋ถ„์„

```ts
function zip(x: number, y: string, z: boolean): { x: number, y: string, z: boolean } {
return { x , y, z };
}

type Params = Parameters<typeof zip>
// Params: [x: number, y: string, z: boolean]
type Ret = ReturnType<typeof zip>
// Ret: [x: number, y: string, z: boolean]
type First = Params[0];
// First: number

type _Parameters<T extends (...args: any) => any> = T extends (...args: infer A) => any ? A: never;
```

- _Parameters์˜ ์ œ๋„ค๋ฆญ ```<T extends (...args: any) => any>``` ๋Š” T๋ฅผ ํ•จ์ˆ˜๋กœ ์ œํ•œํ•˜๋Š” ์˜๋ฏธ์ด๋ฉฐ
- infer A: T๋Š” ํ•จ์ˆ˜์—ฌ์•ผํ•˜๊ณ  ๊ทธ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ A๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋ฅผ ๋’ค์˜ ์‚ผํ•ญ์—ฐ์‚ฐ์ž์—์„œ ์‚ฌ์šฉํ• ๊ฒƒ์ด๋‹ค ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค.

```ts
class Profile {
name: string;
age: number;
gender: 'male' | 'female';
constructor(name: string, age: number, gender: 'male' | 'female') {
this.name = name;
this.age = age;
this.gender = gender;
}
}

const p = new Profile('test', 123, 'male');
type P = ConstructorParameters<typeof Profile>;
type I = InstanceType<typeof Profile>;
```

0 comments on commit 8793433

Please sign in to comment.