Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

178
Vistas
Personalizado IsAny e IsUnknown genérico basado en la tabla de asignabilidad de tipos (compatibilidad)

Traté de crear IsAny genérico basado en esto .

Y mi IsAny genérico parece funcionar bien. Pero cuando lo uso en otro genérico ( IsUnknown ) se rompe:

 const testIsUnknown2: IsUnknown<any> = true; // problem here, must be false

Pero cuando cambio IsAny generic a uno comentado, funciona bien nuevamente. Entonces, ¿por qué está sucediendo? Porque no veo ninguna diferencia en ambos genéricos IsAny , pero parece que mi genérico no funciona dentro de otros genéricos.

 // type IsAny<T> = 0 extends (1 & T) ? true : false; type IsAny<T> = unknown extends T ? (T extends object ? true : false) : false; const testIsAny1: IsAny<any> = true; const testIsAny2: IsAny<unknown> = false; const testIsAny3: IsAny<string> = false; const testIsAny4: IsAny<object> = false; // unknown is only assignable to two types: unknown and any type IsUnknown<T> = unknown extends T ? (IsAny<T> extends true ? false : true) : false; const testIsUnknown1: IsUnknown<unknown> = true; const testIsUnknown2: IsUnknown<any> = true; // problem here, must be false const testIsUnknown3: IsUnknown<object> = false; const testIsUnknown4: IsUnknown<number> = false;
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

El problema es que su isAny<any> produce boolean , lo que significa que ambas asignaciones pasarán:

 const testIsAny1: IsAny<any> = true; const testIsAny2: IsAny<any> = false;

Para la otra definición isAny , testIsAny2 falla.

Con respecto a su definición de isAny , falla porque el tipo condicional T extends object ? true : false devuelve ambas alternativas para any . No pude encontrar ninguna documentación sobre esto, pero puede solucionarlo de la misma manera que puede evitar que los tipos condicionales se distribuyan en uniones, rodeando ambos lados con corchetes ( docs ):

 type IsAny<T> = unknown extends T ? ([T] extends [object] ? true : false) : false;

patio de recreo mecanografiado

about 4 years ago · Juan Pablo Isaza Denunciar

0

El problema es en realidad con IsAny .

Ha notado que true: IsAny<any> , sin embargo, false: IsAny<any> también!

Ha tocado un aspecto de los tipos condicionales que puede ser bastante contradictorio.

Daré este ejemplo:

 type Extends<T, U> = T extends U ? true : false;

Tenemos:

 Extends<'a', 'a' | 'b'> =:= true Extends<'c', 'a' | 'b'> =:= false

Nada sorprendente hasta ahora.

Lo que podría sorprender es esto:

 Extends<'a' | 'c', 'a' | 'b'> =:= boolean

Cuando tenemos T extends U ? … , si hay subtipo de T que es subtipo de U y un subtipo de T que no es subtipo de U , entonces el tipo resultante es la unión de ambas ramas.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda