function rangeArray<S extends number, E extends number>( start: S, end: E, step: number = 1 ): /* TODO */; const result: readonly [1, 2, 3, 4] = rangeArray(1, 5); // ok console.log(result); // [1, 2, 3, 4] start と end が(型計算が重くならない)十分小さな非負整数で step = 1 が満たされる場合には、返り値に number[] ではなく [1, 2, 3, 4] のようなより詳しい型を付ける、というのが今回やりたいことです。 完成品 TypeScript Playground 解説 以降は実装の解説です。 関数本体の実装 型は後で付けるとして本体をまず実装します。 実装方