TypeScript Array.prototype.map declaration
规格
根据Array.prototype.map()的MDN规范,应像这样使用映射...
1 | var new_array = arr.map(callback[, thisArg]) |
问题
TypeScript有几个map的重载声明,这使得
我希望看到这个(在lib.d.ts中)...
1 | map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[]; |
但是lib.d.ts也有这些...
1 2 3 4 5 6 7 | 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
注意
1 | map<U>(callbackfn: (value: T, index: number, array: ReadonlyArray< T >) => U, thisArg?: any): U[]; |
(1)如果不允许在环境声明中重载签名,您将如何在本机js函数/方法中获得不同的签名?
(2)您需要告诉编译器您正在涵盖所有可能的声明签名。
在您的情况下,您可以执行以下操作:
1 2 3 4 5 6 | 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 []; } } |
第一个重载签名将照顾那些您不想打扰的签名。
您的问题涉及TypeScript的不同方面。我将单独处理它们,然后将它们放在一起。
数组< T >
接口在TypeScript中起到双重作用:
函数中的
在可以传递参数的意义上,函数定义中的
函数/方法重载
在TypeScript中,函数和方法在Java或C#之类的语言中不会被重载。您不能多次实现它,但是可以定义备用签名,以允许静态类型返回类型或使用变量参数的函数。尤其是在
元组
在JavaScript数组中,您可以在其每个插槽中分配多种类型的值。在TypeScript数组定义中,您指定一种由编译器强制执行的类型。为了填补空白,您可以定义元组。像
摘要
如果数组是实际的