TypeScript Index对象类型的签名隐式具有类型any

时间:2015-10-26 16:03:30

标签: typescript

我正在尝试在窗口对象上附加属性。这是我的代码。

  <div class="container">
    <div class="row">
      <div class="col-md-12">
        <div class="post-preview">
          <h2 class="post-title">Blah</h2>
          <p>Blah</p>
          <hr>
        </div>
      </div>

      <div class="col-md-6">
        <div class="post-preview">
          <h2 class="post-title">Blah</h2>
          <p>Blah</p>

          <hr>
        </div>
      </div>

      <div class="col-md-5 col-md-offset-1">
        <div class="post-preview">
          <h2>Blah</h2>
          <p class="post-title">Blog Post</p>
          <p class="post-title">Blog Post</p>
          <p class="post-title">Blog Post</p>

          <hr>
        </div>
      </div>
    </div>
  </div>

编译器开始抛出以下错误。

TypeScript索引对象类型的签名隐式具有任何类型

有人可以告诉我我在做错的地方吗?

1 个答案:

答案 0 :(得分:2)

快速修复是允许将任何内容分配给窗口对象。你可以写一下......

interface Window {
    [propName: string]: any;
}

...代码中的某处。

或者您可以使用--suppressImplicitAnyIndexErrors进行编译,以便在分配任何对象的索引时禁用隐式的任何错误。

我不会推荐这些选项中的任何一个。理想情况下它是最好的not to assign to window,但是如果你真的想要那么你应该在一个属性上做所有事情,然后定义一个与分配给它的索引签名相匹配的索引签名:

// define it on Window
interface Window {
    cbids: { [cbid: string]: (meta: any) => void; }
}

// initialize it somewhere
window.cbids = {};

// then when adding a property
// (note: hopefully cbid is scoped to maintain it's value within the function)
var cbid = 'someValue';
window.cbids[cbid] = (meta: any) => {
    tempThis.meta = meta;
    delete window.cbids[cbid]; // use delete here
    var e = document.getElementById(cbid);
    e.parentNode.removeChild(e);

    if (meta.errorDetails) {
        return;
    }
};