Spec
根据Array.prototype.map()的MDN规范地图应该这样使用..。
var new_array = arr.map(callback[, thisArg])问题
TypeScript对map有几个重载声明,这使得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也不应该允许环境声明这样做。
问题
我也在GitHub上提过这个..。https://github.com/Microsoft/TypeScript/issues/13785
Note
ReadonlyArray<T>只有一个地图的签名,就是.
map<U>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => U, thisArg?: any): U[];发布于 2017-01-31 14:40:27
(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 [];
}
}第一个过载签名负责那些您不想麻烦的签名。
发布于 2017-01-31 14:52:50
您的问题涉及TypeScript的不同方面。我会单独处理,然后把它们都放在一起。
阵列
接口在TypeScript中具有双重用途:
.d.ts文件中定义的(而lib.d.ts文件包含基本的JavaScript类型)。这些接口是根据现有类型量身定做的,它们通常不是您要实现的。你可以,如果你想,但你必须实现它的所有成员。Array<T>接口是第二种类型的,因此它不适合您实现。
函数中的this 参数
函数定义中的this:参数不是真正的参数,因为您可以传递参数。它允许您指定期望函数体中的this值是哪种类型。如果您不指定它,this将是any类型,这通常不是很有用。
函数/方法重载
在TypeScript中,函数和方法没有重载,因为它们在诸如Java或C#之类的语言中被重载。实现它的次数不能超过一次,但可以定义备用签名,以允许对返回变量类型或使用变量参数的函数进行静态类型键入。特别是在.d.ts定义文件中,这很有用,而且常常是必要的,因为现有的库使用弱类型的JavaScript来返回值或期望不同类型的参数。所以你的反对是假的。您需要函数重载来容纳这些JavaScript结构。
Tuples
在JavaScript数组中,可以在每个插槽中分配多个类型的值。在TypeScript数组定义中,您指定一种类型,由编译器强制。要填补空白,可以定义元组。像[number, string, string]这样的类型转换为JavaScript数组,any[]和TypeScript仍然可以强制静态类型。
摘要
在Array<T>中重载对象的数组方法在数组是实际的[T, T]、[T, T, T]、[T, T, T, T]、[T, T, T, T, T]的事件中引入一个静态类型的this参数。这并不意味着数组提供了多个map方法。它是相同的方法,但是对某些特定的数组类型重载。它是在lib.d.ts中提供的,因此不适合由您实现。您可以扩展基础类(即使没有接口也已经存在),但是重载不会伤害您(至少在本例中是这样的,因为它们只提供this参数)。
https://stackoverflow.com/questions/41959269
复制相似问题