How can you create a type in TypeScript that only accepts arrays with two or more elements?
needsTwoOrMore(["onlyOne"]) // should have error needsTwoOrMore(["one", "two"]) // should be allowed needsTwoOrMore(["one", "two", "three"]) // should also be allowed
position: Array<number>; ...it will let you make an array with arbitrary length. However, if you want an array containing numbers with a specific length i.e. 3 for x,y,z components can you make a type with for a fixed length array, something like this? Any help or clarification appreciated!
Use a tuple to declare an array with fixed length in TypeScript, e.g. const arr: [string, number] = ['a', 1] . Tuple types allow us to express an array with a fixed number of elements whose types are known, but can be different.
var len= arr. length; //Now arr. length returns 5.
This can be accomplished with a type like:
type ArrayTwoOrMore<T> = { 0: T 1: T } & Array<T> declare function needsTwoOrMore(arg: ArrayTwoOrMore<string>): void needsTwoOrMore(["onlyOne"]) // has error needsTwoOrMore(["one", "two"]) // allowed needsTwoOrMore(["one", "two", "three"]) // also allowed
TypeScript Playground Link
This is an old question and the answer is fine (it helped me as well), but I just stumbled across this solution as well while playing.
I had already defined a typed Tuple (type Tuple<T> = [T, T];
), and then below that, I had defined array of two or more as described above (type ArrayOfTwoOrMore<T> = { 0: T, 1: T } & T[];
).
It occurred to me to try using the Tuple<T>
structure in place of { 0: T, 1: T }
, like so:
type ArrayOfTwoOrMore<T> = [T, T, ...T[]];
And it worked. Nice! It's a little more concise and perhaps able to be clearer in some use-cases.
Worth noting is that a tuple doesn't have to be two items of the same type. Something like ['hello', 2]
is a valid tuple. In my little code snippet, it just happens to be a suitable name and it needs to contain two elements of the same type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With