2017-11-17 30 views
1

私は、Typescriptで定数を動的に定義する方法を見つけようとしていますが、これは不可能であることを始めています。Typescriptで定数を動的に定義することはできますか?

私はこの試みた:私は呼び出すことになっています

define(name: string, value: any): boolean { 
    var undef; 
    const name = value; 
    return name == undef; 
    } 

を:

define ('MY_CONST_NAME', 'foo_value); 

私は次のエラーを取得する:

Duplicate 'name' identifier. 

私はそれは普通のことだと思いますが、私はしないでください私の目標を達成する方法を知っている。

+3

あなたが関数のパラメータを持っているので、あなたはそのエラーを取得している:しかし、それはあなたが再帰的にフリーズする場合を除き、それほど深い変化が(気をつける)またはパス

From the MDN上問題となり、浅いです同じ名前のローカル変数を使用します。別の名前を使用するか、達成しようとしていることを明確にしてください –

+1

より多くのコンテキスト(たとえば 'define'をどのように呼び出すか)が必要です。ここではエラーは正常です。関数のパラメータとスコープの中に 'name'が定義されています。 – ValLeNain

+0

私はそれを取得しますが、私は成功するかどうか私の関数に定数を作成し、ブール値を返したい場合 – DMCISSOKHO

答えて

1

要するに、番号Constはブロックスコープです。それが宣言されると、それが利用可能になり、それまでではありません。不変であると宣言したい場合はそれほど難しいことではありませんが、この質問はおそらく知識の不足を示しています。もっと便利なのは、オブジェクトを凍結させて、オブジェクトを追加、削除、変更することができないようにする方法です。

var obj = { 
    prop: function() {}, 
    foo: 'bar' 
}; 

// New properties may be added, existing properties may be 
// changed or removed 
obj.foo = 'baz'; 
obj.lumpy = 'woof'; 
delete obj.prop; 

// Both the object being passed as well as the returned 
// object will be frozen. It is unnecessary to save the 
// returned object in order to freeze the original. 
var o = Object.freeze(obj); 

o === obj; // true 
Object.isFrozen(obj); // === true 

// Now any changes will fail 
obj.foo = 'quux'; // silently does nothing 
// silently doesn't add the property 
obj.quaxxor = 'the friendly duck'; 

// In strict mode such attempts will throw TypeErrors 
function fail(){ 
    'use strict'; 
    obj.foo = 'sparky'; // throws a TypeError 
    delete obj.quaxxor; // throws a TypeError 
    obj.sparky = 'arf'; // throws a TypeError 
} 

fail(); 

// Attempted changes through Object.defineProperty; 
// both statements below throw a TypeError. 
Object.defineProperty(obj, 'ohai', { value: 17 }); 
Object.defineProperty(obj, 'foo', { value: 'eit' }); 

// It's also impossible to change the prototype 
// both statements below will throw a TypeError. 
Object.setPrototypeOf(obj, { x: 20 }) 
obj.__proto__ = { x: 20 } 
+0

ああああありがとう:「この質問は知識の不足を示している」といい、それは良い答えです私は、何か不可能なことをしようとしていたと確信していました。 – DMCISSOKHO

関連する問題