如果你使用一个类,你可以将字段本身标记为readonly,你只能在构造函数中赋值:
class Test {
readonly foo : string;
constructor () {
this.foo = "";
}
}
let fn = new Test();
fn.foo = "" // Error
如果你使用对象字面量,你可以使用显式类型来不允许字段的突变,只是它的初始赋值:
let fn : {
readonly foo: string
} = {
foo: "1"
}
您也可以使用Object.freeze,它也具有运行时行为:
let fn = Object.freeze({
foo: "1"
})
fn.foo = "" // error
在任何一种情况下,您都可以创建一个 readonly 字段,该字段只能在创建对象时分配。没有办法创建一个在初始化后只能分配一次的字段,例如在您的示例中。
编辑
注意readonly不是很强,不会导致两个具有相同字段的类型不兼容:
let fn = Object.freeze({
foo: "1"
}) // foo is readonly
let nonReadonlyFn : { foo: string } =fn; // foo is not readonly but assignment is allowed
nonReadonlyFn.foo = "" // not a compiler error.
更新
如果您不知道密钥,您可以创建一个只读索引签名:
let fn: {
readonly [n: string] : string
} = { foo: "" };
fn["foo"] ="" // error
console.log(fn["foo"])
创建只读对象而不一次全部初始化它们的常用方法是拥有一个可变版本,对其进行变异,然后在完成将其分配给只读版本时:
let fnNotReadOnly: {
[n: string] : string
} ;
fnNotReadOnly["foo"] = "";
//When done mutating:
let fn : {
readonly [n: string] : string
} = fnNotReadOnly;
fn["foo"] = ""
console.log(fn["foo"])