2017-10-14 15 views
0

the documentationによれば、タプルのサイズを超えてインデックスにアクセスすると、定義されていないか、まったくエラーをスローするのではなく、タプル内のすべての既知の型の和集合型が生成されます。タプル上の余分なインデックスにアクセスすることが許可されるのはなぜですか?

現在、これをエラーにすることはできますか?

+1

https://github.com/Microsoft/TypeScript/issues/6229に投票してください。 –

答えて

1

いいえ@ 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 

は、その後、あなたは開閉タプルの間で変換することができます。ただし、このパスを開始すると、タプルにまったく依存するのではなく、特定の名前付きプロパティを持つインターフェイスを作成するほうがよいでしょう。しかし、あなたの走行距離は変わるかもしれません。

希望があれば、がんばろう。

関連する問題