Si vous définissez
type FAs = [Function, {}];
Ensuite, les valeurs de type FAs
nécessitera un premier élément de type Function
un deuxième élément de type {}
et les éléments successifs de Function | {}
. C'est ainsi que les types de tableaux littéraux TypeScript fonctionnent. De la Docs TS :
Lorsqu'on accède à un élément en dehors de l'ensemble des indices connus, on utilise un type union à la place :
Cela devrait faire tout ce que vous voulez sauf pour le fait que vous pourrez passer dans un Function
-comme troisième élément, etc. du tableau. Mais en fait, ce serait le cas de toute façon, puisque Function
est compatible avec {}
.
Il n'y a aucun moyen de contourner ce problème. Il n'y a pas de moyen dans TS de définir un type de tableau où le premier n Les éléments sont d'un ou de plusieurs types spécifiques, et il y a un nombre arbitraire d'éléments restants d'un autre type spécifique.
Je me demande également si le système de types supporte ce qui est sans doute un tuple de longueur arbitraire.
En fait, le système de type uniquement supporte les tuples de longueur arbitraire. Si vous dites
type Tuple = [number, number];
ce type est compatible avec tout tableau, de longueur deux ou plus qui contient des chiffres. Si vous dites
type Tuple = [string, number];
ce type est compatible avec tout tableau, de longueur deux ou plus qui a une chaîne de caractères comme premier élément, un nombre comme deuxième élément, et une chaîne de caractères ou un nombre comme troisième élément, etc. Je ne qualifierais pas les raisons de ce comportement de "basées sur l'informatique" ; il s'agit plutôt de ce qu'il est possible pour TS de vérifier.
Une autre approche
interface Arglist {
[index: number]: object;
0: Function;
}
const a1: Arglist = [func];
const a2: Arglist = [22]; // fails
const a3: Arglist = [func, "foo"]; // fails
const a4: Arglist = [func, obj];
const a5: Arglist = [func, obj, obj];