getObjectType doesn't necessarily return an entry on the list. How should we proceed?
This commit is contained in:
parent
dc348a0e49
commit
e5eb98e4aa
1 changed files with 64 additions and 58 deletions
122
source/index.ts
122
source/index.ts
|
|
@ -4,58 +4,6 @@
|
||||||
|
|
||||||
export type Class<T = unknown> = new (...args: any[]) => T;
|
export type Class<T = unknown> = 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 = [
|
const typedArrayTypeNames = [
|
||||||
'Int8Array',
|
'Int8Array',
|
||||||
'Uint8Array',
|
'Uint8Array',
|
||||||
|
|
@ -89,21 +37,79 @@ function isTypedArrayName(name: any): name is TypedArrayTypeName {
|
||||||
return typedArrayTypeNames.includes(name);
|
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 {toString} = Object.prototype;
|
||||||
const isOfType = <T>(type: string) => (value: unknown): value is T => typeof value === type;
|
const isOfType = <T>(type: string) => (value: unknown): value is T => typeof value === type;
|
||||||
|
|
||||||
const getObjectType = (value: unknown): TypeName | undefined => {
|
const getObjectType = (value: unknown): ObjectTypeName | undefined => {
|
||||||
const objectName = toString.call(value).slice(8, -1);
|
const objectTypeName = toString.call(value).slice(8, -1);
|
||||||
if (objectName) {
|
|
||||||
return objectName as TypeName;
|
if (isObjectTypeName(objectTypeName)) {
|
||||||
|
return objectTypeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
const isObjectOfType = <T>(type: TypeName) => (value: unknown): value is T => getObjectType(value) === type;
|
const isObjectOfType = <T>(type: ObjectTypeName) => (value: unknown): value is T => getObjectType(value) === type;
|
||||||
|
|
||||||
function is(value: unknown): TypeName {
|
function is(value: unknown): TypeName {
|
||||||
switch (value) {
|
switch (value) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue