TypeScriptでは、const
キーワードをクラスプロパティの宣言に使用することはできません。これを行うと、「クラスメンバーは 'const'キーワードを持つことができません」というエラーが発生します。
プロパティを変更すべきではないことをコードで明確に示す必要があることに気付きました。宣言されたプロパティに新しい値を代入しようとすると、IDEまたはコンパイラにエラーが発生します。あなたはどうやってこれを達成しますか?
私は現在読み取り専用のプロパティを使用していますが、私はTypeScript(およびJavaScript)に初めて慣れているので、もっと良い方法があるかどうか疑問に思います
get MY_CONSTANT():number {return 10};
TypeScript 1.8を使っています。提案?
シモンズ:私は今TypeScript 2.0.3を使っているので、私は/を受け入れました Davidの答え
TypeScript 2.0には readonly
修飾子 があります。
class MyClass {
readonly myReadOnlyProperty = 1;
myMethod() {
console.log(this.myReadOnlyProperty);
this.myReadOnlyProperty = 5; // error, readonly
}
}
new MyClass().myReadOnlyProperty = 5; // error, readonly
コンストラクタで代入ができるので、厳密には定数ではありませんが、大したことではない可能性があります。
代替ソリューション
別の方法は、static
キーワードをreadonly
と一緒に使用することです。
class MyClass {
static readonly myReadOnlyProperty = 1;
constructor() {
MyClass.myReadOnlyProperty = 5; // error, readonly
}
myMethod() {
console.log(MyClass.myReadOnlyProperty);
MyClass.myReadOnlyProperty = 5; // error, readonly
}
}
MyClass.myReadOnlyProperty = 5; // error, readonly
これには、コンストラクタ内で代入できず、1か所にしか存在しないという利点があります。
定数はクラスの外で宣言してクラス内で使用することができます。そうでなければget
プロパティはいい回避策です
const MY_CONSTANT: string = "wazzup";
export class MyClass {
public myFunction() {
alert(MY_CONSTANT);
}
}
宣言の中でreadonly
修飾子でプロパティをマークすることができます。
export class MyClass {
public static readonly MY_PUBLIC_CONSTANT = 10;
private static readonly myPrivateConstant = 5;
}
角度2不透明定数と呼ばれる非常に良い機能を提供します。クラスを作成し、そこにあるすべての定数を不透明な定数を使って定義します。
import { OpaqueToken } from "@angular/core";
export let APP_CONFIG = new OpaqueToken("my.config");
export interface MyAppConfig {
apiEndpoint: string;
}
export const AppConfig: MyAppConfig = {
apiEndpoint: "http://localhost:8080/api/"
};
App.module.tsのプロバイダにそれを注入する
あなたはすべてのコンポーネントにわたってそれを使うことができるでしょう。
Angular 4のEDIT:
Angular 4の新しい概念はインジェクショントークンで、不透明トークンはAngular 4では非推奨です。
インジェクショントークンOpaqueトークンの上に機能性を追加し、TypeScriptジェネリックを介してトークンにタイプ情報を添付することを可能にし、さらにインジェクショントークンは@Injectを追加する必要性を排除
コード例
不透明トークンを使用したAngular 2
const API_URL = new OpaqueToken('apiUrl'); //no Type Check
providers: [
{
provide: DataService,
useFactory: (http, apiUrl) => {
// create data service
},
deps: [
Http,
new Inject(API_URL) //notice the new Inject
]
}
]
インジェクショントークンを使用したAngular 4
const API_URL = new InjectionToken<string>('apiUrl'); // generic defines return value of injector
providers: [
{
provide: DataService,
useFactory: (http, apiUrl) => {
// create data service
},
deps: [
Http,
API_URL // no `new Inject()` needed!
]
}
]
インジェクショントークンは不透明トークンの上に論理的に設計されています。不透明トークンはAngular 4で廃止されました。
宣言する必要がある定数でreadOnly修飾子を使用するか、クラスの外側で定数を宣言してget演算子を使用して必要なクラスでのみ使用することができます。
このために、readonly
修飾子を使用できます。 readonly
であるオブジェクトプロパティは、オブジェクトの初期化中にのみ割り当てることができます。
クラスの例:
class Circle {
readonly radius: number;
constructor(radius: number) {
this.radius = radius;
}
get area() {
return Math.PI * this.radius * 2;
}
}
const circle = new Circle(12);
circle.radius = 12; // Cannot assign to 'radius' because it is a read-only property.
オブジェクトリテラルの例:
type Rectangle = {
readonly height: number;
readonly width: number;
};
const square: Rectangle = { height: 1, width: 2 };
square.height = 5 // Cannot assign to 'height' because it is a read-only property
readonly
修飾子は純粋にTypeScriptコンストラクトであり、TSがJSにコンパイルされると、コンストラクトはコンパイルされたJSに存在しないことも知っておく価値があります。読み取り専用のプロパティを変更すると、TSコンパイラはそれについて警告します(有効なJSです)。