簡體   English   中英

TypeScript Array.prototype.map聲明

[英]TypeScript Array.prototype.map declaration

規格

根據Array.prototype.map()MDN規范,應該像這樣使用map ...

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不應該允許它用於環境聲明。

問題

  1. 為什么TypeScript允許重載環境聲明的簽名?
  2. 如何在擴展Array的類中覆蓋map實現?

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

注意

ReadonlyArray<T>只有一個地圖簽名,這是......

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

(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 [];
    }
}

第一個重載簽名負責處理您不想打擾的簽名。

您的問題涉及TypeScript的不同方面。 我將單獨處理它們然后將它們放在一起。

陣列<T>

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

  1. 它們允許您為其他(尚未存在的)類創建“真正的”接口。 實現它時,必須完全實現它,因為界面提供了所有成員可用的保證。
  2. 它們允許您定義已存在的 javascript類型的接口。 當您想要使用眾多現有庫中的一個並且仍然具有靜態類型的優點時,這非常有用。 這些接口通常在.d.ts文件中定義(而lib.d.ts文件包含基本的JavaScript類型)。 這些接口是根據現有類型定制的,通常不適合您實現。 如果你願意,你可以,但你必須實現其所有成員。

Array<T>接口屬於第二種類型,因此不適合您實現。

this參數在函數中

在您可以傳遞參數的意義上,函數定義中的this:參數不是真正的參數。 它允許您指定函數體中期望this值的類型。 如果你沒有指定它, this將是any類型,這通常不是很有用。

功能/方法重載

在TypeScript中,函數和方法在Java或C#等語言中過載時不會重載。 您不能多次實現它,但您可以定義備用簽名,以允許為返回變量類型或使用變量參數的函數進行靜態類型。 特別是在.d.ts定義文件中,這是有用的並且通常是必需的,因為現有的庫使用JavaScript的弱類型來返回值或期望不同類型的參數。 這使你的反對意見錯誤。 您需要函數重載來適應這些JavaScript構造。

元組

在JavaScript數組中,您可以在每個插槽中分配多種類型的值。 在TypeScript數組定義中,您可以指定編譯器強制執行的一種類型。 要填補空白,您可以定義元組 [number, string, string]這樣的類型轉換為JavaScript數組, any[]和TypeScript仍然可以強制執行靜態類型。

摘要

數組方法重載你的對象在Array<T>引入一個靜態類型的this參數,如果數組是實際的[T, T][T, T, T][T, T, T, T][T, T, T, T, T] 這並不意味着數組提供了多種map方法。 它是相同的方法,但對某些特定的數組類型重載。 它在lib.d.ts中提供,因此不是為您實現的。 您可以擴展基礎類(即使沒有接口也已經存在),但重載不會對您造成傷害(至少在這種情況下不會,因為它們只提供this參數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM