2016-06-01 17 views
0

私の目標は、typescript文字列列挙型の属性を持つオブジェクトを持つことです。Typescriptのインデックスシグネチャパラメータタイプの列挙型

type PARAM = "long-parameter" | "long-parameter2"; 

const PARAM = { 
    param1: "long-parameter" as PARAM, 
    param2: "long-parameter2" as PARAM, 
} 

var f = function(params:{[id:PARAM]:number}){} 

f({ //must be valid 
    [PARAM.param1]:1, 
}); 

f({ //should display error 
    "asdas":1 
}); 

問題がvar f = function(params:{[id:PARAM]:number}){}リターンエラーAn index signature parameter type must be string or number.

が、その周りにどのような方法があることはありますか?

答えて

1

インデックスの記号のキーは、文字列または数字でなければなりません。これは、JavaScriptがどのように機能するか(なぜなら、オブジェクトメンバーの参照ですべてがstringに変換されるためです)。

メンバーの名前が分かっている場合は、実際に宣言する必要があります。これを以下に示します。

almでテスト
type PARAM = "long-parameter" | "long-parameter2"; 

const PARAM = { 
    param1: "long-parameter" as PARAM, 
    param2: "long-parameter2" as PARAM, 
} 

var f = function(params: { "long-parameter"?: PARAM, "long-parameter2"?: PARAM }) { } 

f({ //must be valid 
    [PARAM.param1]: 1, 
}); 

f({ //should display error 
    "asdas": 1 
}); 

有効な割り当て作業はどのようenter image description here

+0

- '1'は、文字列値ではありません '長いparameter'または'長期parameter2'をインタフェースの値は 'PARAM'に設定されています...なぜ' f({[PARAM.param1]:1}) 'が正常にコンパイルされますか? –