Estoy escribiendo una pequeña herramienta de protección de tipos y estoy tratando de encontrar una forma de dividir todos los tipos posibles en unos pocos tipos que cubran todos los tipos posibles, asegurándome de que no haya superposición.
Sé que en JavaScript existen tipos primitivos, así que tal vez podría comenzar con tipos primitivos y no primitivos. Las primitivas son string , number , bigint , boolean , symbol , null y undefined , por lo que puedo definir una protección de tipo como:
type Primitive = string | number | bigint | boolean | symbol | undefined | null; function isPrimitive(val: unknown): val is Primitive { return typeof val === 'string' || typeof val === 'number' || typeof val === 'bigint' || typeof val === 'boolean' || typeof val === 'symbol' || val === undefined || val === null; } Ahora quiero el complemento de eso. En el lado de JavaScript, sé que typeof val === 'object' no ayudará porque eso incluiría null . Pero val instanceof Object parece funcionar. Devuelve falso para todo isPrimitive devuelve verdadero, y parece devolver verdadero para todo lo demás:
function isNotPrimitive(val: unknown): val is Object { return val instanceof Object; } El problema es que val is Object es más amplio que lo que devuelve la función porque el tipo de Object TypeScript parece incluir primitivas:
type NumberIsObject = number extends Object ? 'Yes' : 'No'; // "Yes" Entonces, ¿hay un tipo en TypeScript que corresponda a cosas que son instancias de Object ? O si no, ¿hay una mejor manera de agrupar los tipos en categorías amplias que satisfagan mis criterios?