Answers:
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
这样的好处是不能在构造函数中分配,而只能存在于一个位置。
export
(外部模块)和public
关键词无关的这个问题/答案,但在显性的话题,我个人觉得非常容易看出一个成员当关键字不存在是公开的。我不会因为这个原因而烦恼它,因为它增加了更多的噪音并且不需要键入。这也使公众成员与标记为private
或的成员更加不同protected
。无论如何,仅是我的意见:)
static readonly myReadOnlyProperty
class声明时如何访问的任何想法export default class { ... }
?试过this.myVar,self.myVar,静态,默认值...不起作用...(编辑:default.myVar似乎是解决方案,但我遇到类型错误)
常量可以在类外部声明,也可以在类中使用。否则,该get
属性是一个不错的解决方法
const MY_CONSTANT: string = "wazzup";
export class MyClass {
public myFunction() {
alert(MY_CONSTANT);
}
}
get
在您的情况下非常适合使用属性
export const
,然后从另一个文件导入。虽然很容易测试。只需const
在一个文件中声明一个文件,然后尝试在不进行导出/导入的情况下在另一个文件中使用它,或者在浏览器控制台中使用它即可。
您可以readonly
在声明中使用修饰符标记属性:
export class MyClass {
public static readonly MY_PUBLIC_CONSTANT = 10;
private static readonly myPrivateConstant = 5;
}
Angular 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:
对于Angular 4,新概念是“注入令牌”和“不透明令牌”在Angular 4中已弃用。
注入令牌在不透明令牌的基础上添加功能,它允许通过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!
]
}
]
注入令牌在逻辑上是在Opaque令牌之上设计的,而Angular 4中已弃用了Opaque令牌。
要么使用带有常量的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
修饰符纯粹是一个打字稿构造,并且当TS编译为JS时,该构造将不会出现在已编译的JS中。当我们修改只读属性时,TS编译器会警告我们(它是有效的JS)。
对我而言,先前的答案均无效。我确实需要将我的静态类转换为枚举。像这样:
export enum MyConstants {
MyFirstConstant = 'MyFirstConstant',
MySecondConstant = 'MySecondConstant'
}
然后在我的组件中,按照其他答案的建议添加新属性
export class MyComponent {
public MY_CONTANTS = MyConstans;
constructor() { }
}
然后在我组件的模板中以这种方式使用它
<div [myDirective]="MY_CONTANTS.MyFirstConstant"> </div>
编辑:对不起。我的问题不同于OP的问题。如果还有其他问题,我仍然将其留在这里。
export
之前的关键字class
以及public static
在之前readonly
的关键字。看到这里:stackoverflow.com/a/22993349