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

211
Views
¿Evitar inferir genéricos de múltiples argumentos en Typescript?

Considere esta función:

 function fn<T>(a: T, b: T[]): T {}

Me gustaría inferir T de a , luego verificar b contra T . En cambio, TS infiere T tanto de a como de b . P.ej:

 fn(1, [1, 'str']);

Esto devuelve number | string Sin embargo, quiero que T se infiera como number , por lo que arrojaría un error como "número | la cadena no se puede asignar a número". es posible?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Podría proporcionar un tipo explícito:

 declare function fnA<T>(a: T, b: (T extends T ? T : never)[]): T fnA<number>(1, [2, 'str']) // Type 'string' is not assignable to type 'number'.(2322)

O hacer algo como:

 declare function fnB<T>(a: T, b: (T extends T ? T : never)[]): T fnB(1, [1, 'str']); // Type 'string' is not assignable to type '1'.(2322)

Esto obliga al compilador a tener que examinar el tipo de a para averiguar el tipo de b .

Pero esto parece inferir un tipo más específico que number , por lo que no funciona:

 fnB(1, [1, 2]); // Type '2' is not assignable to type '1'.(2322)

Creo que esto rompe algunos mecanografiados heurísticos sobre cuándo un tipo se amplía automáticamente a number o string , y cuándo no. Y es complicado para el mecanografiado saber qué tan estrictamente restringir ese tipo.

Sin embargo, funcionará bien si el primer argumento es un tipo más amplio como number :

 const x: number = 1 fnB(x, [1, 2]); // fine

O podría, nuevamente, proporcionar el tipo si no le gusta cómo se infirió:

 fnB<number>(1, [1, 2]); // fine

Patio de juegos

about 4 years ago · Juan Pablo Isaza Report

0

Aunque es solo una idea, tal vez puedas usar HOF

 declare const fn = <T,>(a: T) => (b:T): T fn(1)([1,'str']) // Argument of type '(string | number)[]' is not assignable to parameter of type 'number'.ts(2345)

Pero como sugirió @alex, es mejor proporcionar un tipo explícito siempre que lo sepa

about 4 years ago · Juan Pablo Isaza Report

0

Hay un enfoque alternativo:

 type Primitives = | string | number | bigint | boolean | symbol | null | undefined type BackwardInference<T, P=Primitives> = P extends any ? T extends P ? P : never : never; declare function fn<T>(a: T, b: BackwardInference<T>[]): T fn(1, [45]) // ok fn('str', ['hello']) // ok fn(42, ['str']) // expected error

Patio de juegos

Debido a que TS infiere el tipo literal si el primer argumento es un primitivo, podemos perder un poco el rigor de la inferencia. Significa que cuando el primero sea literal 42 , el segundo argumento se esperará como number y no como 42

about 4 years ago · Juan Pablo Isaza 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!