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不应该允许它用于环境声明.
问题
我也在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)
(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)
第一个重载签名负责处理您不想打扰的签名。
| 归档时间: |
|
| 查看次数: |
1166 次 |
| 最近记录: |