[] 안에 정확한 타입을 하나씩 입력하면 됩니다. 표기하지 않은 자리는 undefined 타입이 됩니다. [number, boolean, string]으로 타이핑했으니 0번째 인덱스는 숫자만, 1번째 인덱스는 불 값만, 2번째 인덱스는 문자열만 가능합니다. 표기하지 않은 3번째 인덱스부터는 undefined 타입이 됩니다. 따라서 tuple[2]에 숫자를 넣을 때나, tuple[3]에 문자열을 넣을 때는 전부 에러가 발생합니다. 또한, 3번째 이상의 인덱스에 접근하려 하면 해당 인덱스에는 요소가 없다는 에러 메세지가 표시됩니다.
희한하게도 push, pop, unshift, shift 메서드를 통해 배열에 요소를 추가하거나 제거하는 것은 막지 않습니다. push를 사용할 수는 있지만 tuple[4]처럼 인덱스에 접근할 수가 없으니, 딱히 의미가 없습니다. push를 사용하는 것까지 막으려면 readonly 수식어를 붙여주어야 합니다. 그러면 튜플을 수정할 수 없습니다.
const tuple: readonly [number, boolean, string] = [1, false, 'hi'];
tuple.push('no');
// Property 'push' does not exist on type 'readonly [number, boolean, string]'.
튜플에서는 push 같은 메서드로 값을 바꾸는 것을 기본적으로 막지 않는다는 사실을 기억하세요. 튜플이 아닌 배열에서도 readonly 수식어를 붙일 수 있습니다.