我在命名空间中有以下代码:
const conj_method = Symbol("conj_method");
const toSeq_method = Symbol("toSeq_method");
export interface Array<T> extends IConjable<T>, ISeqable<T> {}
Array.prototype[conj_method] = function<X>(x: X) {
this.push(x);
return this;
};
Array.prototype[toSeq_method] = function() {
return new ArraySeq(this, 0);
};
由于某种原因,这给了我错误:
src/seq2.ts:497:21 - error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.
497 Array.prototype[conj_method] = function<X>(x: X) {
~~~~~~~~~~~
src/seq2.ts:502:21 - error TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.
502 Array.prototype[toSeq_method] = function() {
particularArray[pointer]
的其他几种用途对我也有类似的错误:
src/seq2.ts:430:40 - error TS2339: Property 'length' does not exist on type 'Array<X>'.
430 isEq && tl && ptr < this.array.length;
~~~~~~
src/seq2.ts:433:23 - error TS7017: Element implicitly has an 'any' type because type 'Array<X>' has no index signature.
433 isEq = hd === this.array[ptr];
~~~~~~~~~~~~~~~
不将此代码包装在名称空间中可解决这些错误。
答案 0 :(得分:2)
对Array
的扩展必须始终在全局范围内。在命名空间中声明export interface Array<T> extends IConjable<T>, ISeqable<T> {}
时,您不是在扩充数组,而是在创建一个名为Array
的新接口。值Array
(表示全局Array
的构造函数仍将指向未扩展的全局数组。
您可以将代码放在namespace
中,但是扩充功能必须是顶级的:
interface Array<T> extends X.IConjable<T>, X.ISeqable<T> { }
namespace X {
const conj_method = Symbol("conj_method");
const toSeq_method = Symbol("toSeq_method");
export interface IConjable<T> { [conj_method](x: T): this }
export interface ISeqable<T> { [toSeq_method](x: T): this }
Array.prototype[conj_method] = function <X>(x: X) {
this.push(x);
return this;
};
Array.prototype[toSeq_method] = function () {
return new ArraySeq(this, 0);
};
}
以上版本适用于脚本文件,而不是模块文件(即文件没有顶级export
或import
),以便在需要放入{{1 }}在全球范围内推广:
Array