2016-05-04 30 views
5

Sto provando a scrivere le definizioni dei tipi per il pacchetto npm xmldoc.L'indicizzatore TypeScript continua a ricevere errori tslint "l'accesso agli oggetti tramite stringhe letterali non è consentito"

Finora ho questo:

declare module 'xmldoc' { 

    export class XmlDocument { 
    constructor(contents: string); 
    public children: IXmlNode[]; 
    } 

    export interface IXmlNode { 
    attr: IXmlAttributes; 
    val: string; 
    name: string; 
    children: IXmlNode[]; 
    } 

    export interface IXmlAttributes { 
    [index: string]: string; 
    } 

} 

tslint è ancora lamenta a questo codice

valueId = node.attr["id"]; 

con il messaggio di errore object access via string literals is disallowed

ho pensato che la mia indicizzatore ([index: string]: string) ha lavorato intorno a questo .

Qualcuno può darmi un indizio sul motivo per cui non funziona?

+0

Penso che questo sembri un bug in tslint, che probabilmente non ha escluso questa regola per le firme dell'indice. Sembra un caso d'uso valido, prova a presentare una segnalazione di errore/suggerimento: https: //github.com/palantir/tslint/issues – Alex

risposta

5

L'indicizzatore funziona su questo, in quanto consente a TypeScript di compilarlo, e hai ragione che è valido compilare il codice TypeScript.

Il problema qui è solo la regola TSLint; mentre è valido TypeScript, TSLint sta cercando di incoraggiarti a non farlo, perché stai indicizzando con una stringa costante, quindi potrebbe essere solo una proprietà sull'oggetto. TSLint pensa che dovresti definire le proprietà fisse su IXMLAttributes per le proprietà a cui vuoi accedere.

Si potrebbe benissimo farlo; aggiungendo una proprietà 'id: string' sul tuo IXMLAttributes (oltre alla proprietà indicizzata, se c'è un caso non costante in cui ti piacerebbe usarlo) non è una cattiva idea.

Personalmente penso che questo sia solo un po 'pesante da parte di TSLint. Ci sono ottimi motivi per usare indici di stringa costanti come questi in questi casi. Spegnerei semplicemente la regola no-string-literal nella configurazione di TSLint.