TypeScript Array.prototype.map声明

ser*_*0ne 9 javascript overriding overloading typescript

规格

根据Array.prototype.map()MDN规范,应该像这样使用map ...

var new_array = arr.map(callback[, thisArg])
Run Code Online (Sandbox Code Playgroud)

问题

TypeScript有几个重载的map声明,这使得它很难extend Array<T>.

我希望看到这个(在lib.d.ts中) ...

map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
Run Code Online (Sandbox Code Playgroud)

但lib.d.ts也有这些......

map<U>(this: [T, T, T, T, T], callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): [U, U, U, U, U];

map<U>(this: [T, T, T, T], callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): [U, U, U, U];

map<U>(this: [T, T, T], callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): [U, U, U];

map<U>(this: [T, T], callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): [U, U];
Run Code Online (Sandbox Code Playgroud)

异议

由于JavaScript不允许方法重载,并且TypeScript也不允许类实现,因此我认为TypeScript不应该允许它用于环境声明.

问题

  1. 为什么TypeScript允许重载环境声明的签名?
  2. 如何在扩展Array的类中覆盖map实现?

我也在GitHub上提出了这个... https://github.com/Microsoft/TypeScript/issues/13785

注意

ReadonlyArray<T> 只有一个地图签名,这是......

 map<U>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => U, thisArg?: any): U[];
Run Code Online (Sandbox Code Playgroud)

Nit*_*mer 2

(1) 如果不允许在环境声明中重载签名,那么如何在原生 js 函数/方法中获得不同的签名?
其中有很多重载lib.d.ts反映了原生js对象的工作方式。

(2) 您需要告诉编译器您正在覆盖所有可能的声明签名。
对于您的情况,您可以执行以下操作:

class A<T> extends Array<T> {
    map<U>(this: Array<U>, ...args: any[]);
    map<U>(this: Array<T>, callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[] {
        return [];
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个重载签名负责处理您不想打扰的签名。