TypeScript semble avoir des problèmes pour inférer les types d'union des gardes de type. Par exemple, considérez une fonction pour combiner un tableau de gardes de type avec la signature suivante
function combine(guards: ((x: any) => x is T)[]): (x: any) => x is T
et considérez les gardes de type suivants avec A
et B
ayant des propriétés différentes
function isA(x: any): x is A
function isB(x: any): x is B
Maintenant, je m'attendrais à ce que combine([isA, isB])
fonctionne et ait le type inféré (x: any) => x is A | B
mais au lieu de cela, j'obtiens une erreur disant qu'un argument de type ((x: any) => x is A | (x: any) => x is B)[]
n'est pas assignable au paramètre de type (x: any) => x is A
, ce qui signifie que T
est inféré comme A
plutôt que A | B
.
En spécifiant explicitement T
, c'est-à-dire combine([isA, isB])
, cela fonctionne comme prévu. Existe-t-il un moyen de modifier la signature de combine
de manière à ce que cela puisse être inféré?
0 votes
Vous pouvez toujours utiliser
function combine2(guards: [((x: any) => x is T), ((x: any) => x is U)]): (x: any) => x is T | U
, mais je suppose que vous voulez accepter un tableau avec un nombre variable d'éléments?1 votes
Exactement, je cherche une solution qui fonctionne avec n'importe quel (nombre positif) d'éléments de tableau.