2016-10-27 6 views
1

タイプ・スクリプト2.0プロジェクトでは、Immutable.jsを使用して不変の変数を定義したいと考えています。特に、マップのキーを既知のセットに制限したいと思います。次のようなもの:制限付き辞書をタイプ・スクリプトで入力する

responseのようなものかもしれない
type ConstrainedKeys = 'foo' | 'bar' | 'baz'; 
interface INameValuePair { 
    name: string; 
    value: string; 
}; 
const dictionary = Immutable.Map<ConstrainedKeys, NameValuePair>(response); 

{ 
    foo: { 
     name: 'foo', 
     value: 'typing is fun' 
    } 
} 

しかし、私は試してみてdictionary.foo.valueを参照するとき、私は活字のエラーを取得:

[ts] Property 'foo' does not exist on type 'Map<ConstrainedKeys,INameValuePair>'.

+1

何をするときに、そのエラーを取得しますか? 'foo'に' dictionary.foo'のようにアクセスしようとしていますか? –

+0

申し訳ありません。それを質問に追加します。 – ken

+0

また、TypeScriptの型チェックをサポートする軽量不変ヘルパーであるhttps://github.com/engineforce/ImmutableAssignをチェックして、POJO(Plain Old JavaScript Object)での作業を続けることもできます。 – engineforce

答えて

1

Immutable.Mapインスタンスドンエントリのプロパティがある場合は、次のようにアクセスする必要があります。

let foo = dictionary.get("foo"); 

あなたはdictionary.fooのようにアクセスできるようにする場合、あなたはインスタンスを自分で変更する必要がある、またはあなたが使用できるProxy

const map = Immutable.Map<ConstrainedKeys, INameValuePair>({ 
    foo: { 
     name: 'foo', 
     value: 'typing is fun' 
    } 
}); 

const dictionary = new Proxy(map, { 
    get: (target: Immutable.Map<ConstrainedKeys, INameValuePair>, name: ConstrainedKeys) => { 
     if ((target as any)[name]) { 
      return (target as any)[name]; 
     } 
     return target.get(name); 
    } 
}) as Immutable.Map<ConstrainedKeys, INameValuePair> & { foo: INameValuePair }; 

console.log(dictionary.foo); // {name: "foo", value: "typing is fun"} 
console.log(dictionary.get("foo")); // {name: "foo", value: "typing is fun"} 
+0

ありがとうNitzan;不変に非常に新しいので、初心者の質問にあなたの忍耐を感謝します。 – ken

関連する問題