Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

232
Views
Reducción a métodos y propiedades JS comunes en TypeScript

¿Hay alguna manera de hacer que este estrechamiento de TypeScript sea menos feo (o más elegante ;-) ❓

Con la protección de tipo IsSomething , quiero restringir el acceso a métodos y propiedades comunes de cualquier variable de JavaScript que no sea null ni undefined (cosas como .toString , .valueOf , .hasOwnProperty , .constructor , etc.)

Enlace del patio de recreo

 export type Something = number | string | boolean | symbol | object | bigint; export function IsSomething(value: unknown) : value is Something { return value !== undefined && value !== null; } let a = [1, "2", 3]; Narrowing(a); NotNarrowing(a); function Narrowing(o: unknown) { // OK if (IsSomething(o)) { console.log(o.toString(), o.constructor); } } function NotNarrowing(o: unknown) { // NOT OK if (o !== null && o !== undefined) { console.log(o.toString(), o.constructor); } }
about 4 years ago · Santiago Gelvez
2 answers
Answer question

0

En TypeScript, todos los valores, excepto null e undefined , se pueden asignar al llamado tipo de objeto vacío {} . Entonces puede simplificar su Something a solo {} y su función de protección de tipos definida por el usuario funcionará igual que antes:

 export type Something = {}; function isSomething(value: unknown): value is Something { return value !== undefined && value !== null; } function narrowing(o: unknown) { // OK if (isSomething(o)) { console.log(o.toString(), o.constructor); } }

Además, TypeScript 4.8 introducirá soporte mejorado para reducir unknown , después de lo cual su función "NotNarrowing" comenzará a funcionar, porque al marcar (o !== null && o !== undefined) reducirá o de unknown a {} automáticamente:

 // TS4.8+ function nowNarrowing(o: unknown) { // okay if (o !== null && o !== undefined) { console.log(o.toString(), o.constructor); } }

Enlace del patio de recreo al código

about 4 years ago · Santiago Gelvez Report

0

La excelente respuesta de @jcalz me llevó a la siguiente solución:

 // With `IsSomething` type guard, I want to narrow down access // to common properties of any JS variable // which is not null and not undefined, like: // .toString, .valueOf, .hasOwnProperty, .constructor etc. export function IsSomething(value: unknown) : value is Object { return value !== null && value !== undefined; } Narrowing([1, 2, 3]); function Narrowing(o: unknown) { // OK if (IsSomething(o)) { console.log(o.toString(), o.constructor); } }

Resulta que TypeScript tiene una interface Object , que funciona exactamente como yo quiero:

Interfaz de objetos en TypeScript

En TypeScript, la interfaz de Object es diferente del tipo de object primitivo, ya que el primero todavía se puede asignar a cualquier otro tipo primitivo o complejo. También es diferente de un tipo vacío como type Something = {} , ya que este último no es compatible con IntelliSense.

 // Object interface is OK let a: Object = 42; let b: Object = true; let c: Object = "string"; let d: Object = Symbol(42); let e: Object = new class SomeClass { someProp = 42 }; // Empty type is OK but no IntelliSense let a1: {} = 42; // Error: Type 'number' is not assignable to type 'object' let a2: object = 42;

Enlace del patio de recreo .

Aún queda un problema sutil. Como señaló @CertainPerformance, lo anterior no funcionará para un caso extremo como Object.create(null) , donde se crea un objeto que no tiene propiedades ni métodos, pero tampoco es null .

Si ese es un requisito, lo siguiente debería hacer el trabajo:

 // can be extended to check for toString, valueOf, etc export function IsSomething(value: unknown) : value is Object { return (<Object>value)?.constructor !== undefined; } Narrowing([1, 2, 3]); function Narrowing(o: unknown) { // OK if (IsSomething(o)) { console.log(o.toString(), o.constructor); } }
about 4 years ago · Santiago Gelvez Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!