在這個答案中,我們學習如何N在打字稿中定義長度元組,以便
TupleOf<string, 3>
與 type 基本相同[string, string, string]。
現在我想在具有泛型引數的類中使用它,N例如
class Dimension<N extends number> {
private data: TupleOf<number, N> = /* ?? what here ?? */;
}
但是我沒有想出一種型別安全的方法來初始化資料屬性。它應該是一個長度N的數字陣列,但我認為這需要將(平凡聯合)型別轉換N為一個值,根據這個答案這是不可能的。
我可以要求任何使用站點為建構式提供初始值。
class Dimension<N extends number> {
private data: TupleOf<number, N>;
constructor(data: TupleOf<number, N>) {
this.data = data;
}
}
然而,一般情況下,這可能會很麻煩,所以問題仍然存在:有沒有辦法在不將值放入建構式的情況下初始化資料?
uj5u.com熱心網友回復:
[...] 有沒有辦法在不將值放入建構式的情況下初始化資料?
是的,這個例子可以解決問題。
class Dimension<N extends number> {
public readonly data: Tuple<number, N>
constructor(dataSize: N) {
this.data = this.getInitialData(dataSize)
}
private getInitialData(dataSize: N): Tuple<number, N> {
const data: number[] = Array(dataSize).fill(0)
return data as Tuple<number, N>
}
}
const d = new Dimension(5)
console.log(d.data) // [ 0, 0, 0, 0, 0 ]
有一個限制,但:
隨著N extends number打字稿知道的元組大小,但在運行這些型別是不存在的。這意味著為了在類中初始化元組,必須將元組的大小傳遞給建構式。
但是,不需要顯式提供型別和引數 ( new Dimension<5>(5)),因為泛型是推斷出來的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/311186.html
下一篇:通用擴展方法型別推斷
