How can you create a type in TypeScript that only accepts arrays with two or more elements?
needsTwoOrMore([\"onlyOne\"]) // should have error
needsTwoOrMore
type FixedTwoArray<T> = [T,T]
interface TwoOrMoreArray<T> extends Array<T> {
0: T
1: T
}
let x: FixedTwoArray<number> = [1,2];
let y: TwoOrMoreArray<string> = ['a','b','c'];
TypeScript Playground
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.
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