टपल दृष्टिकोण:
यह समाधान ट्यूपल्स में स्थित एक सख्त फिक्स्डलिंकअरे (ak.a. SealedArray) प्रकार का हस्ताक्षर प्रदान करता है ।
सिंटेक्स उदाहरण:
// Array containing 3 strings
let foo : FixedLengthArray<[string, string, string]>
यह सबसे सुरक्षित तरीका है, इस पर विचार करने से यह सूचकांक को सीमाओं से बाहर जाने से रोकता है ।
कार्यान्वयन:
type ArrayLengthMutationKeys = 'splice' | 'push' | 'pop' | 'shift' | 'unshift' | number
type ArrayItems<T extends Array<any>> = T extends Array<infer TItems> ? TItems : never
type FixedLengthArray<T extends any[]> =
Pick<T, Exclude<keyof T, ArrayLengthMutationKeys>>
& { [Symbol.iterator]: () => IterableIterator< ArrayItems<T> > }
टेस्ट:
var myFixedLengthArray: FixedLengthArray< [string, string, string]>
// Array declaration tests
myFixedLengthArray = [ 'a', 'b', 'c' ] // ✅ OK
myFixedLengthArray = [ 'a', 'b', 123 ] // ✅ TYPE ERROR
myFixedLengthArray = [ 'a' ] // ✅ LENGTH ERROR
myFixedLengthArray = [ 'a', 'b' ] // ✅ LENGTH ERROR
// Index assignment tests
myFixedLengthArray[1] = 'foo' // ✅ OK
myFixedLengthArray[1000] = 'foo' // ✅ INVALID INDEX ERROR
// Methods that mutate array length
myFixedLengthArray.push('foo') // ✅ MISSING METHOD ERROR
myFixedLengthArray.pop() // ✅ MISSING METHOD ERROR
// Direct length manipulation
myFixedLengthArray.length = 123 // ✅ READ-ONLY ERROR
// Destructuring
var [ a ] = myFixedLengthArray // ✅ OK
var [ a, b ] = myFixedLengthArray // ✅ OK
var [ a, b, c ] = myFixedLengthArray // ✅ OK
var [ a, b, c, d ] = myFixedLengthArray // ✅ INVALID INDEX ERROR
(*) इस समाधान के लिए कार्य करने के लिए noImplicitAny
टाइपस्क्रिप्ट कॉन्फ़िगरेशन निर्देश को सक्षम करने की आवश्यकता होती है (आमतौर पर अनुशंसित अभ्यास)
ऐरे (ईश) दृष्टिकोण:
यह समाधान Array
एक अतिरिक्त दूसरे पैरामीटर (एरे लंबाई) को स्वीकार करते हुए, प्रकार की वृद्धि के रूप में व्यवहार करता है । टपल आधारित समाधान के समान सख्त और सुरक्षित नहीं है ।
सिंटेक्स उदाहरण:
let foo: FixedLengthArray<string, 3>
ध्यान रखें कि यह दृष्टिकोण आपको घोषित सीमाओं से बाहर एक सूचकांक तक पहुंचने से रोक नहीं पाएगा और इस पर एक मूल्य निर्धारित करेगा।
कार्यान्वयन:
type ArrayLengthMutationKeys = 'splice' | 'push' | 'pop' | 'shift' | 'unshift'
type FixedLengthArray<T, L extends number, TObj = [T, ...Array<T>]> =
Pick<TObj, Exclude<keyof TObj, ArrayLengthMutationKeys>>
& {
readonly length: L
[ I : number ] : T
[Symbol.iterator]: () => IterableIterator<T>
}
टेस्ट:
var myFixedLengthArray: FixedLengthArray<string,3>
// Array declaration tests
myFixedLengthArray = [ 'a', 'b', 'c' ] // ✅ OK
myFixedLengthArray = [ 'a', 'b', 123 ] // ✅ TYPE ERROR
myFixedLengthArray = [ 'a' ] // ✅ LENGTH ERROR
myFixedLengthArray = [ 'a', 'b' ] // ✅ LENGTH ERROR
// Index assignment tests
myFixedLengthArray[1] = 'foo' // ✅ OK
myFixedLengthArray[1000] = 'foo' // ❌ SHOULD FAIL
// Methods that mutate array length
myFixedLengthArray.push('foo') // ✅ MISSING METHOD ERROR
myFixedLengthArray.pop() // ✅ MISSING METHOD ERROR
// Direct length manipulation
myFixedLengthArray.length = 123 // ✅ READ-ONLY ERROR
// Destructuring
var [ a ] = myFixedLengthArray // ✅ OK
var [ a, b ] = myFixedLengthArray // ✅ OK
var [ a, b, c ] = myFixedLengthArray // ✅ OK
var [ a, b, c, d ] = myFixedLengthArray // ❌ SHOULD FAIL
arr
इसे प्रारंभ करने के बाद भी असीमित संख्या को "संख्या" पर धकेल सकते हैं ।