覆盖数组和类型化数组的TypeScript接口

3
我想使用TypeScript来声明带有参数的函数,这些参数可以是常规的JavaScript数组或类型化数组,但我找不到一个好的方法来实现它。我希望像下面这样使用接口: ```typescript interface MyFunction { (data: Array | TypedArray): void; } ```
interface IArray
{
    length: number;
    [index: number]: number;
};

会让我声明一个函数:
declare var vAdd: { (a: IArray, b: IArray): IArray; };

并可以以下任何方式使用它:
var y;
y = vAdd(new Float32Array([1,2,3]), new Float32Array([1,2,3]));
y = vAdd([1,2,3], new Float32Array([1,2,3]));
y = vAdd(new Float32Array([1,2,3]), new Array(1,2,3));

“...等。但是,只有第一行在TypeScript playground中有效。其他代码会生成一个错误,指出参数与函数签名不匹配。

通过重载该函数可以使其工作:


declare var vAdd: { (a: IArray, b: IArray): IArray;
                    (a: number[], b: IArray): IArray;
                    (a: IArray, b: number[]): IArray; 
                    (a: number[], b: number[]): IArray; };

但是我想知道是否有办法避免写出所有IArray和number []的组合,对于参数更多的函数来说,这将变得更加乏味。或者我尝试做的事情从根本上有什么问题吗?

1
TypeScript 的参考文档提到,数组字面量尚未被视为 Array 接口的实例,这就解释了为什么第二行会出错。至于第三行,似乎 new Array() 也被认为返回 any[],而不是 Array 的实例。 - duncan
接口的命名是 C# 的一种做法。请不要在名称前加上 I,因为接口在相当不同的上下文中使用。 - Boris Yankov
1个回答

2

谢谢提供参考。不幸的是,即使从IArray接口中删除索引器声明,也无法更改任何一个错误。 - duncan
你的codeplex bug被标记为“低”影响,这令人惊讶。我已经投票并发表了评论。它绝对是阻止这个工作的主要问题。(顺便说一句,当我获得足够的声望时,我一定会给你的答案点赞) - duncan
就此而言,CodePlex 上的“影响”字段并不是 TypeScript 团队在确定 bug 优先级时所关注的内容。我相信目前有99%的 bug 被归类为“低影响”,尽管实际情况绝非如此。 - Ryan Cavanaugh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接