[英]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不應該允許它用於環境聲明。
問題
我也在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中具有雙重用途:
.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.