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

Posted

技术标签:

【中文标题】涵盖数组和类型化数组的 TypeScript 接口【英文标题】:TypeScript interface to cover Array and Typed Arrays 【发布时间】: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,接口在不同的上下文中使用。 【参考方案1】:

查看Possible to define indexer interface for number[]?

当前 ts 版本中存在一个错误,该错误不允许索引器接口按预期对本机对象数组进行编译和工作。

【讨论】:

感谢您的参考。不幸的是,即使从 IArray 接口中删除索引器声明也不会改变任何一个错误。 您的codeplex bug 被标记为“低”影响,这令人惊讶。我投了赞成票并发表了评论。这绝对是阻止这项工作的主要因素。 (顺便说一句,当我获得足够的代表时,我一定会支持你的答案) FWIW,CodePlex 上的“影响”字段不是 TypeScript 团队在确定错误优先级时考虑的内容。我相信 99% 的错误目前是影响“低”,尽管绝对不是这样。

以上是关于涵盖数组和类型化数组的 TypeScript 接口的主要内容,如果未能解决你的问题,请参考以下文章

typescript:扩展多种类型的模板化接口数组

TypeScript类型断言数组的类型函数的类型

TypeScript 中关联对象数组的接口

Typescript索引和接口继承

TypeScript 如何知道自定义数组类型中长度字段的行为?

如何实现 TypeScript 深度部分映射类型而不破坏数组属性