How to Extract The Indexes of Any Array in TypeScript
With a Full Explanation and Potential Use Cases
So I came across this tweet from Matt Pocock on X and it's very exciting.
However, Matt doesn't explain this trick in detail.
He also doesn't suggest any potential use cases for this trick which is a bummer.
I see this as a missed opportunity for Matt, and therefore I believe it is my duty to explain this trick to level up your TypeScript abilities!
So without further ado… Let’s dive right in!
ToNumber Type
The purpose of the ToNumber
type is to take in a key that resembles an array index, then parse it into a number. E.g. "42" -> 42 as a number
.
Here is the code for ToNumber
with an explanation down below:
Key extends PropertyKey
ensures the input will extend the built-inPropertyKey
type, which equalsstring | number | symbol
- We check if the input
Key
can be transformed into a template literal that infersIndex
as a number. - In simpler terms, we perform a conditional to check that the input type can be parsed into a number.
- If true, the type returned is a number (
Index
). - If false, the type is
never
.
IndexesOfArray Type
The purpose of this type is simple.
- Take in the type of a
readonly Array
. - Parse every index in this
Array
to a number.
- The generic
Array
type can be ofany
type, as long as it'sreadonly
. ToNumber
uses thekeyof
operator to extract each index from the inputArray
and parse it into a number.
Usage Example
In this example, we create a simple array of names
and mark it as const
.
This is very important so we ensure the array is readonly
.
Lastly, we pass in the type of the array names
and use IndexesOfArray
to extract the number indexes.
If you hover over the resulting NameIndexes
type, you should expect the following type:
Conclusion
That's about it!
This is a cool little trick that you can use in your TypeScript applications.
I personally don't see any real use case for this, however it's a very cool trick regardless.
If you have a use case for this, please let us know in the comments down below!
If you enjoyed this article, please make sure to Subscribe, Clap, Comment and Connect with me today! 🌐