5

我正在尝试为xmldocnpm 包编写类型定义。

到目前为止,我有这个:

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 仍在抱怨此代码

  valueId = node.attr["id"];

带有错误消息object access via string literals is disallowed

我以为我的索引器([index: string]: string ) 可以解决这个问题。

谁能告诉我为什么它不起作用?

4

1 回答 1

5

您的索引器确实解决了这个问题,因为它允许 TypeScript 编译它,而且您是对的,它是有效的编译 TypeScript 代码。

这里的问题只是 TSLint 规则;虽然它是有效的 TypeScript,但 TSLint 试图鼓励您不要这样做,因为您正在通过常量字符串进行索引,因此它可能只是对象的属性。TSLint 认为您应该在 IXMLAttributes 上为您要访问的属性定义固定属性。

你可以这样做;在 IXMLAttributes 上添加一个 'id: string' 属性(除了索引属性,如果有一个非常量的情况你想使用它)不是一个坏主意。

虽然我个人认为这只是 TSLint 在这里有点笨拙。在这些情况下,有充分的理由使用像这样的常量字符串索引。我只是在您的 TSLint 配置中关闭no-string-literal规则。

于 2016-05-04T13:54:38.557 回答