0
the documentationによれば、タプルのサイズを超えてインデックスにアクセスすると、定義されていないか、まったくエラーをスローするのではなく、タプル内のすべての既知の型の和集合型が生成されます。タプル上の余分なインデックスにアクセスすることが許可されるのはなぜですか?
現在、これをエラーにすることはできますか?
the documentationによれば、タプルのサイズを超えてインデックスにアクセスすると、定義されていないか、まったくエラーをスローするのではなく、タプル内のすべての既知の型の和集合型が生成されます。タプル上の余分なインデックスにアクセスすることが許可されるのはなぜですか?
現在、これをエラーにすることはできますか?
いいえ@ AsadSaeeduddinによると、このリクエストはMicrosoft/TypeScript#6229で追跡されます。
あなたが本当にそれをしたい場合は
は、あなた自身の「閉じた」タプルを定義することができます。あなたがする必要があるときinterface Closed1<T> { 0: T }
interface Closed2<T, U> extends Closed1<T> { 1: U }
interface Closed3<T, U, V> extends Closed2<T, U> { 2: V }
interface Closed4<T, U, V, W> extends Closed3<T, U, V> { 3: W }
// as many as you like ...
function closeTuple<T, U, V, W>(open: [T, U, V, W]): Closed4<T, U, V, W>;
function closeTuple<T, U, V>(open: [T, U, V]): Closed3<T, U, V>;
function closeTuple<T, U>(open: [T, U]): Closed2<T, U>;
function closeTuple<T>(open: [T]): Closed1<T>;
function closeTuple(open: any): any {
return open;
}
function openTuple<T, U, V, W>(closed: Closed4<T, U, V, W>): [T, U, V, W];
function openTuple<T, U, V>(closed: Closed3<T, U, V>): [T, U, V];
function openTuple<T, U>(closed: Closed2<T, U>): [T, U];
function openTuple<T>(closed: Closed1<1>): [T];
function openTuple(closed: any): any {
return closed;
}
// demo usage
const anOpenTuple: [string, boolean, number] = ['foo', true, 2];
const okay = anOpenTuple[2]; // number
const what = anOpenTuple[10]; // string | number | boolean
const aClosedTuple = closeTuple(anOpenTuple);
const stillOkay = aClosedTuple[2]; // number
const nowError = aClosedTuple[10]; // error if you have noImplicitAny on
は、その後、あなたは開閉タプルの間で変換することができます。ただし、このパスを開始すると、タプルにまったく依存するのではなく、特定の名前付きプロパティを持つインターフェイスを作成するほうがよいでしょう。しかし、あなたの走行距離は変わるかもしれません。
希望があれば、がんばろう。
https://github.com/Microsoft/TypeScript/issues/6229に投票してください。 –