If you are using Typescript 4.1 or newer, you can utilize Recursive conditional types to create tuple types with flexible length:
type TupleOf<T, N extends number> = N extends N ? number extends N ? T[] : _TupleOf<T, N, []> : never;
type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? R : _TupleOf<T, N, [T, ...R]>;
which allows you to easily specify the value type and length of your tuple
type T1 = TupleOf<string, 3>;
Then such tuple would compile
const tuple: T1 = ['one', 'two', 'three'];
whereas this one wouldn't
const tuple: T1 = ['one', 'two', 'three', 'four'];
TS2322: Source has 4 element(s) but target allows only 3
The downside is of course that you can't easily specify different types in the tuple, so this approach is rather suitable for single-typed tuples.