From e4eba3614b0da148cd5f6aa1130e1be5f5cedd58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gromit=20=28=EC=A0=84=EB=AF=BC=EC=9E=AC=29?= <64779472+ssi02014@users.noreply.github.com> Date: Thu, 2 May 2024 01:37:40 +0900 Subject: [PATCH] =?UTF-8?q?feat(types):=20ExtractSetType,=20ExtractMapType?= =?UTF-8?q?,=20Promiseable=20=EC=B6=94=EA=B0=80=20(#94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/fair-tips-smash.md | 5 +++++ .../src/ExtractMapType/ExtractMapType.spec.ts | 15 +++++++++++++++ packages/types/src/ExtractMapType/index.ts | 3 +++ .../src/ExtractSetType/ExtractSetType.spec.ts | 13 +++++++++++++ packages/types/src/ExtractSetType/index.ts | 1 + .../types/src/Promiseable/Promiseable.spec.ts | 19 +++++++++++++++++++ packages/types/src/Promiseable/index.ts | 1 + packages/types/src/index.ts | 3 +++ 8 files changed, 60 insertions(+) create mode 100644 .changeset/fair-tips-smash.md create mode 100644 packages/types/src/ExtractMapType/ExtractMapType.spec.ts create mode 100644 packages/types/src/ExtractMapType/index.ts create mode 100644 packages/types/src/ExtractSetType/ExtractSetType.spec.ts create mode 100644 packages/types/src/ExtractSetType/index.ts create mode 100644 packages/types/src/Promiseable/Promiseable.spec.ts create mode 100644 packages/types/src/Promiseable/index.ts diff --git a/.changeset/fair-tips-smash.md b/.changeset/fair-tips-smash.md new file mode 100644 index 000000000..43aeda718 --- /dev/null +++ b/.changeset/fair-tips-smash.md @@ -0,0 +1,5 @@ +--- +'@modern-kit/types': minor +--- + +feat(types): ExtractSetType, ExtractMapType, Promiseable 추가 diff --git a/packages/types/src/ExtractMapType/ExtractMapType.spec.ts b/packages/types/src/ExtractMapType/ExtractMapType.spec.ts new file mode 100644 index 000000000..a7b44951d --- /dev/null +++ b/packages/types/src/ExtractMapType/ExtractMapType.spec.ts @@ -0,0 +1,15 @@ +import { ExtractMapType } from '.'; + +describe('ExtractMapType', () => { + it('should infer the generic type of a Map', () => { + const key = 'foo' as 'foo' | 'bar'; + const value = 1 as 1 | 2 | 3; + + const testMap = new Map(); + + type extractedMapType = ExtractMapType; // ["foo" | "bar", 1 | 2 | 3] + + expectTypeOf(key).toEqualTypeOf(); + expectTypeOf(value).toEqualTypeOf(); + }); +}); diff --git a/packages/types/src/ExtractMapType/index.ts b/packages/types/src/ExtractMapType/index.ts new file mode 100644 index 000000000..b0fea6e73 --- /dev/null +++ b/packages/types/src/ExtractMapType/index.ts @@ -0,0 +1,3 @@ +export type ExtractMapType = T extends Map + ? [K, V] + : never; diff --git a/packages/types/src/ExtractSetType/ExtractSetType.spec.ts b/packages/types/src/ExtractSetType/ExtractSetType.spec.ts new file mode 100644 index 000000000..4900e999c --- /dev/null +++ b/packages/types/src/ExtractSetType/ExtractSetType.spec.ts @@ -0,0 +1,13 @@ +import { ExtractSetType } from '.'; + +describe('ExtractSetType', () => { + it('should infer the generic type of a Set', () => { + const arr = [1, 2, 3, 4, 5] as const; + const testSet = new Set(arr); + const convertedTestArr = [...testSet]; + + type extractedSetType = ExtractSetType; // 1 | 2 | 3 | 4 | 5 + + expectTypeOf(convertedTestArr).toEqualTypeOf(); + }); +}); diff --git a/packages/types/src/ExtractSetType/index.ts b/packages/types/src/ExtractSetType/index.ts new file mode 100644 index 000000000..7c09a4cdf --- /dev/null +++ b/packages/types/src/ExtractSetType/index.ts @@ -0,0 +1 @@ +export type ExtractSetType = T extends Set ? U : never; diff --git a/packages/types/src/Promiseable/Promiseable.spec.ts b/packages/types/src/Promiseable/Promiseable.spec.ts new file mode 100644 index 000000000..54646d434 --- /dev/null +++ b/packages/types/src/Promiseable/Promiseable.spec.ts @@ -0,0 +1,19 @@ +import { Promiseable } from '.'; + +describe('Promiseable', () => { + it('should correctly handle and type-check a variable as either Promise or number when assigned with Promiseable', () => { + const promise = Promise.resolve(1) as Promiseable; + + expectTypeOf(promise).toEqualTypeOf | number>(); + }); + + it('should correctly distinguish between Promise and number type at runtime when using Promiseable', () => { + const promise = Promise.resolve(1) as Promiseable; + + if (promise instanceof Promise) { + expectTypeOf(promise).toEqualTypeOf>(); + } else { + expectTypeOf(promise).toEqualTypeOf(); + } + }); +}); diff --git a/packages/types/src/Promiseable/index.ts b/packages/types/src/Promiseable/index.ts new file mode 100644 index 000000000..f917dab97 --- /dev/null +++ b/packages/types/src/Promiseable/index.ts @@ -0,0 +1 @@ +export type Promiseable = T | Promise; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index c4f33c7cb..ad085a2a0 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -1,7 +1,10 @@ export * from './Arrayable'; export * from './ExcludeNullish'; export * from './ExtendOmittedProperties'; +export * from './ExtractMapType'; +export * from './ExtractSetType'; export * from './IndexSignature'; export * from './Nullable'; export * from './ObjectEntries'; export * from './ObjectKeys'; +export * from './Promiseable';