TypeScriptで以下のようなコードでタプルを定義しようとしても、[string, number]型ではく(string|number)[]のような共用体(Union)の配列と型推論されてしまいます。

notuple.ts
const tupleStrNum = ["X", 2]; // (string|number)[]

以下のように型定義をすることもできますが

tuple.ts
const tupleStrNum = ["X", 2] as [string, number];
// or
const tupleStrNum: [string, number] = ["X", 2];

以下のような関数を定義しておくことで

util.ts
export function tuple<T1, T2>(t1: T1, t2: T2): [T1, T2];
export function tuple<T1, T2, T3>(t1: T1, t2: T2, t3: T3): [T1, T2, T3];
export function tuple(...args: any[]) {
    return args;
}

以下のようにしてタプルへの型推論を行うことができます。

tuple.ts
import { tuple } from "./util";

const tupleStrNum = tuple("X", 2); // [string, number]
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.