gpt4 book ai didi

javascript - TypeScript Array.prototype.map 声明

转载 作者:数据小太阳 更新时间:2023-10-29 03:55:30 26 4
gpt4 key购买 nike

规范

根据MDN specification for Array.prototype.map() map 应该这样使用...

var new_array = arr.map(callback[, thisArg])

问题

TypeScript 有几个映射的重载声明,这使得 extend Array<T> 变得非常困难。 .

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

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

但是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];

异议

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

问题

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

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

注意

ReadonlyArray<T> map 只有一个签名,即...

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

最佳答案

(1) 如果不允许在环境声明中重载签名,您将如何在原生 js 函数/方法中获得不同的签名?
lib.d.ts 中有很多重载,反射(reflect)了原生 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 [];
}
}

第一个重载签名会处理那些您不想打扰的签名。

关于javascript - TypeScript Array.prototype.map 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41959269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com