2017-02-24 17 views
4

更新で型チェックのために、固定サイズの配列を宣言する方法:これらのチェックはないランタイムで、コンパイル時のために意図されています。私の例では、失敗したケースはコンパイル時にすべて捕まえられ、もう1つのケースでも同様の動作が予想されます。は失敗しますケース。活字体:コンパイル時

私は、何か私はクラスのすべてのメンバーが同じ長さの配列になりたいテーブルのようなクラスを書いているとします

class MyClass { 
    tableHead: string[3]; // expect to be a 3 element array of strings 
    tableCells: number[3]; // expect to be a 3 element array of numbers 
} 

私はそう遠い見つけた最も近いソリューションを:

class MyClass { 
    tableHead: [string, string, string]; 
    tableCells: [number, number, number]; 
} 

let bar = new MyClass(); 
bar.tableHead = ['a', 'b', 'c']; // pass 
bar.tableHead = ['a', 'b'];  // fail 
bar.tableHead = ['a', 'b', 1]; // fail 

// BUT these also pass, which are expected to fail at compile time 
bar.tableHead = ['a', 'b', 'c', 'd', 'e']; // pass 
bar.push('d'); // pass 
bar.push('e'); // pass 

もっと良いアイディアですか?

+0

アクセス機能でメンバーデータをラップする必要があります。次に、配列に追加する引数の数やデータの長さをチェックできます。 –

+0

あなたは 'getter'と' setter'を意味しますか? – benjaminz

+0

はい。それらを非公開にして、あなたのリストからプッシュまたは削除されているものを制御するメソッドを提供します。それから、あなたはそれを完全にコントロールするでしょう – iberbeu

答えて

0

ここでは、内部配列の長さを制御する簡単なクラスの例を示します。それはばかプルーフをされていません(取得/あなたが浅いかどうかを検討する必要があります設定/深いクローニングなど:

https://jsfiddle.net/904d9jhc/

class ControlledArray { 

    constructor(num) { 
    this.a = Array(num).fill(0); // Creates new array and fills it with zeros 
    } 

    set(arr) { 
    if (!(arr instanceof Array) || arr.length != this.a.length) { 
     return false; 
    } 
    this.a = arr.slice(); 
    return true; 
    } 

    get() { 
    return this.a.slice(); 
    } 

} 

$(document).ready(function($) { 

    var m = new ControlledArray(3); 

    alert(m.set('vera')); // fail 
    alert(m.set(['vera', 'chuck', 'dave'])); // pass 

    alert(m.get()); // gets copy of controlled array 

}); 
+0

回答ありがとうございますが、質問の議論でわかるように、私はこれを実行するつもりでした**コンパイル時**にチェックしてください。ランタイムではありません。私は将来の混乱を避けるために質問を更新しています。 – benjaminz

3

が、私はそれが可能だとは思わないの型チェックタプルの長さ。Hereのこのテーマに関する活字体の作成者の意見。

私が何を求めていることは必要ではないと主張するだろう。このタイプを定義するとし

type StringTriplet = [string, string, string] 

とその型の変数を定義します。

const a: StringTriplet = ['a', 'b', 'c'] 

あなたは、例えばそのトリプレットのうち、より多くの変数を取得することはできませんこれは期待しないよう、一方

const [one, two, three, four] = a; 

がエラーを与える:

const [one, two, three] = a; 

を私は長さを制限する能力の欠如が問題になると思う唯一の状況は、例えばありますときmap

const result = a.map(/* some pure function */) 

トリプレットを超えると、実際にはそれ以上3.ただし、この場合には、あなたの代わりにタプルの集合として aを扱っているしていることができたときにそれはですので resultはとにかく3つの要素を持っていることを期待しますタプル構文の正しいユースケースではありません。

+0

良い答え。私はあなたがHejlsbergのコメントを含むことが好きで、背景を理解するのに役立ちます。 – sleske