2016-05-04 10 views
5

Próbuję napisać definicje typów dla pakietu NPM xmldoc.Indexer wciąż otrzymuje błąd tslint "dostęp do obiektu przez literały łańcuchowe jest zabroniony"

Do tej pory mam to:

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 wciąż skarży się w tym kodzie

valueId = node.attr["id"]; 

z komunikatem o błędzie object access via string literals is disallowed

myślałem mój podziałowe ([index: string]: string) obejść ten .

Czy ktoś może mi dać pojęcie, dlaczego nie działa?

+0

Myślę, że wygląda to jak błąd w tslint, prawdopodobnie po prostu nie wykluczyłem tej reguły dla podpisów indeksu. Wygląda to na prawidłowy przypadek użycia, spróbuj zgłosić zgłoszenie/sugestię błędu: https: //github.com/palantir/tslint/issues – Alex

Odpowiedz

5

Twój indeksator zajmuje się tym, ponieważ pozwala na kompilację TypeScript, i masz rację, że jest to poprawny kompilator kodu TypeScript.

Kwestia tutaj jest tylko reguła TSLint; podczas gdy jest to poprawny TypeScript, TSLint stara się nie zachęcać cię do tego, ponieważ indeksujesz za pomocą stałego łańcucha, więc może to być własność obiektu. TSLint uważa, że ​​powinieneś zdefiniować stałe właściwości w IXMLAttributes dla właściwości, do których będziesz mieć dostęp.

Możesz to dobrze zrobić; dodanie właściwości "id: string" na twoich IXMLAtrybach (oprócz właściwości indeksowanej, jeśli istnieje nie stały przypadek, w którym chcesz tego użyć) nie jest to zły pomysł.

Osobiście uważam, że jest to po prostu TSLint, który jest tutaj nieco ciężki. Jest bardzo dobry powód, aby w takich przypadkach używać stałego indeksowania ciągów. Właśnie wyłączyłem regułę no-string-literal w Twojej konfiguracji TSLint.

Powiązane problemy