【发布时间】:2012-11-04 18:55:42
【问题描述】:
我想使用 TypeScript 来声明带有参数的函数,这些参数可以是常规 JavaScript 数组或类型化数组,但我找不到一个好的方法。我希望这样的界面:
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 操场上)。其他的会生成一个错误,指出参数与函数签名不匹配。
通过重载函数可以使其工作:
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[] 的所有组合,这对于具有更多参数的函数来说会变得更加乏味。或者我正在尝试做的事情有什么根本错误?
【问题讨论】:
-
TypeScript 的参考文档提到数组文字尚未被视为 Array 接口的实例,这解释了为什么第二行会出错。至于第 3 行,似乎
new Array()也被认为返回any[],而不是Array 的实例。 -
接口的命名是 C# 的事情。请不要使用 I,接口在不同的上下文中使用。
标签: javascript arrays typescript typed-arrays