2017-04-09 1 views
0

Disons que j'ai une fonction el, définie dactylographiée:Quelle est la méthode recommandée pour ajouter la signature d'index à une fonction définie dans tapuscrit

function el():string { .. } 

je voudrais supprimer la violation de type (a pas d'index signature) lors de l'ajout ultérieur des clés à el:

el.x =() => {...} 

Est-ce possible de faire sans coulée?

Jusqu'à présent, la meilleure solution que j'ai trouvé est de définir une interface séparée et coulée à tout en assignant:

interface ElFactory { 
    [index: string]:() => string 
(): string 
} 

Et puis:

(el as ElFactory).x =() => {} 

Est-il possible d'éviter la coulée entièrement ? Comme dans, en définissant la fonction l'associer à l'interface ou spécifier la signature d'index lors de la définition de la fonction?

+0

Ce n'est pas vraiment clair ce que vous cherchez. Pourriez-vous donner un exemple? Pour moi, il semble que vous vouliez étendre un type 'Function'? – smnbbrv

+0

Je veux une variable el qui peut être invoquée comme une fonction 'el()' et qui a des membres de fonction 'el.x()'. – lorefnon

Répondre

1

Vous pouvez lancer votre fonction à l'interface lors de sa création:

interface ElFactory { 
    [index: string]:() => string 
(): string 
} 

var el = function(): string { 
    return "test"; 
} as ElFactory; 

el.test1 =() => "22"; // works 
el.test2 = "22"; // error 

Avant tapuscrit 2.2, vous devrez utiliser la notation de support pour définir les propriétés pour que cela fonctionne:

el["test1"] =() => "22"; // works 
el["test2"] = "22"; // error 
+1

FYI: 'el.test1' et' el.test2' fonctionneraient très bien depuis TypeScript 2.2. –

+0

Nice. Je testais sur http://www.typescriptlang.org/play/ qui doit avoir une ancienne version en cours d'exécution. – Saravana