4

我在尝试使用定义索引器的接口并将其与系统类型 number[] 一起使用时偶然发现了一些困难。该接口的原因是我希望能够传递具有数字索引器而不是返回数字的任何类型,就像 number[] 和类型化数组实例的情况一样。

考虑:

interface IIndexedNumeric
{
    [index: number]: number;
}

class buffer {
    // ... 
    push(vals: IIndexedNumeric) { ... }
}

// problem usage:
var ary: number[] = [1,2,3];
var foo = new buffer();

foo.push(ary); // error
//  Supplied parameters do not match any signature of call target:
//  Could not apply type 'IIndexedNumeric' to argument 1, which is of type 'number[]'   

这应该发生吗?似乎 number[] 应该在结构上完全实现 IIndexedNumeric。如果我只是搞砸了一些事情,请帮我看看我的错误。如果没有,你能想到一个解决方法吗?

4

2 回答 2

2

I'm not entirely sure but I believe this is a bug. The spec states that an array type literal is equivalent to an object type with an index signature [index: number]: ElementType, where ElementType in your case is number. The array type has additional properties corresponding to Array.prototype.* but this shouldn't affect assignment compatibility with just an indexer. If you would, please file a bug on CodePlex about this.

于 2012-10-25T18:49:16.520 回答
0

我想如果您实际运行它,它会完美运行,但从技术上讲,IIndexedNumeric 是与 number[] 不同的类型,即使它们看起来非常相似。您可能必须将 ary 转换为 IIndexedNumeric 才能使编译器不抱怨。

于 2012-10-25T18:30:48.860 回答