From e5eb98e4aaddc424e856d4e6cb65cd0e5d063c55 Mon Sep 17 00:00:00 2001 From: Bjorn Stromberg Date: Sat, 6 Jun 2020 17:29:04 +0900 Subject: [PATCH] getObjectType doesn't necessarily return an entry on the list. How should we proceed? --- source/index.ts | 122 +++++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 58 deletions(-) diff --git a/source/index.ts b/source/index.ts index 878bb8d..0ec3a9e 100644 --- a/source/index.ts +++ b/source/index.ts @@ -4,58 +4,6 @@ export type Class = new (...args: any[]) => T; -const objectTypeNames = [ - 'Function', - 'Generator', - 'AsyncGenerator', - 'GeneratorFunction', - 'AsyncGeneratorFunction', - 'AsyncFunction', - 'Observable', - 'Array', - 'Buffer', - 'Object', - 'RegExp', - 'Date', - 'Error', - 'Map', - 'Set', - 'WeakMap', - 'WeakSet', - 'ArrayBuffer', - 'SharedArrayBuffer', - 'DataView', - 'Promise', - 'URL' -] as const; - -type ObjectTypeName = typeof objectTypeNames[number]; - -const primitiveTypeNames = [ - 'null', - 'undefined', - 'string', - 'number', - 'bigint', - 'boolean', - 'symbol' -] as const; - -export type Primitive = - | null - | undefined - | string - | number - | bigint - | boolean - | symbol; - -type PrimitiveTypeName = typeof primitiveTypeNames[number]; - -function isPrimitiveTypeName(name: any): name is PrimitiveTypeName { - return primitiveTypeNames.includes(name); -} - const typedArrayTypeNames = [ 'Int8Array', 'Uint8Array', @@ -89,21 +37,79 @@ function isTypedArrayName(name: any): name is TypedArrayTypeName { return typedArrayTypeNames.includes(name); } -export type TypeName = ObjectTypeName | PrimitiveTypeName | TypedArrayTypeName; +const objectTypeNames = [ + 'Function', + 'Generator', + 'AsyncGenerator', + 'GeneratorFunction', + 'AsyncGeneratorFunction', + 'AsyncFunction', + 'Observable', + 'Array', + 'Buffer', + 'Object', + 'RegExp', + 'Date', + 'Error', + 'Map', + 'Set', + 'WeakMap', + 'WeakSet', + 'ArrayBuffer', + 'SharedArrayBuffer', + 'DataView', + 'Promise', + 'URL', + ...typedArrayTypeNames +] as const; + +type ObjectTypeName = typeof objectTypeNames[number]; + +function isObjectTypeName(name: any): name is ObjectTypeName { + return objectTypeNames.includes(name); +} + +const primitiveTypeNames = [ + 'null', + 'undefined', + 'string', + 'number', + 'bigint', + 'boolean', + 'symbol' +] as const; + +export type Primitive = + | null + | undefined + | string + | number + | bigint + | boolean + | symbol; + +type PrimitiveTypeName = typeof primitiveTypeNames[number]; + +function isPrimitiveTypeName(name: any): name is PrimitiveTypeName { + return primitiveTypeNames.includes(name); +} + +export type TypeName = ObjectTypeName | PrimitiveTypeName; const {toString} = Object.prototype; const isOfType = (type: string) => (value: unknown): value is T => typeof value === type; -const getObjectType = (value: unknown): TypeName | undefined => { - const objectName = toString.call(value).slice(8, -1); - if (objectName) { - return objectName as TypeName; +const getObjectType = (value: unknown): ObjectTypeName | undefined => { + const objectTypeName = toString.call(value).slice(8, -1); + + if (isObjectTypeName(objectTypeName)) { + return objectTypeName; } return undefined; }; -const isObjectOfType = (type: TypeName) => (value: unknown): value is T => getObjectType(value) === type; +const isObjectOfType = (type: ObjectTypeName) => (value: unknown): value is T => getObjectType(value) === type; function is(value: unknown): TypeName { switch (value) {