首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript Array.prototype.map声明

TypeScript Array.prototype.map声明
EN

Stack Overflow用户
提问于 2017-01-31 13:50:13
回答 2查看 3K关注 0票数 9

Spec

根据Array.prototype.map()的MDN规范地图应该这样使用..。

代码语言:javascript
复制
var new_array = arr.map(callback[, thisArg])

问题

TypeScript对map有几个重载声明,这使得extend Array<T>变得非常困难。

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

代码语言:javascript
复制
map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];

但lib.d.ts也有.

代码语言:javascript
复制
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

Note

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

代码语言:javascript
复制
 map<U>(callbackfn: (value: T, index: number, array: ReadonlyArray<T>) => U, thisArg?: any): U[];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-31 14:40:27

(1)如果不允许在环境声明中重载签名,如何在本机js函数/方法中获得不同的签名?

lib.d.ts中有很多重载,这反映了本机js对象是如何工作的。

(2)您需要告诉编译器,您正在覆盖所有可能的声明签名。

在您的情况下,您可以这样做:

代码语言:javascript
复制
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 [];
    }
}

第一个过载签名负责那些您不想麻烦的签名。

票数 2
EN

Stack Overflow用户

发布于 2017-01-31 14:52:50

您的问题涉及TypeScript的不同方面。我会单独处理,然后把它们都放在一起。

阵列

接口在TypeScript中具有双重用途:

  1. 它们允许您为要实现的其他类(尚不存在)创建“真”接口。当您实现它时,您必须全面地实现它,因为接口提供了所有成员都可用的保证。
  2. 它们允许您定义已经存在的javascript类型的接口。当您想要使用许多现存的库中的一个并且仍然具有静态类型的优点时,这是非常有用的。这些接口通常是在.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参数)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41959269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档