class Dictionary {
readonly[key: string]: string;
constructor(props: Dictionary) {
Object.assign(this, props);
}
}
let d1 = new Dictionary({ key1: "one", key2: "two" });
console.log(d1); // Dictionary {key1: "one", key2: "two"}
let d2 = new Dictionary(d1);
console.log(d1); // Dictionary {key1: "one", key2: "two"}
使用 Object.assign
比使用 for/in 循环更好,这里有一个示例:
class A {
[key: string]: any;
constructor() {
this["k1"] = "v1";
this["k2"] = "v2";
}
method() {}
}
let a = new A();
let a1 = Object.assign({}, a);
console.log(a1); // { k1: "v1", k2: "v2" }
let a2 = {};
for (const key in a) {
a2[key] = a[key];
}
console.log(a2); // { k1: "v1", k2: "v2", method: () }
Object.assign
就没有这个问题。 (在playground中查看代码)
另一个选项是使用Object.keys:
let a3 = {};
Object.keys(a).forEach(key => a3[key] = a[key]);
console.log(a3); // { k1: "v1", k2: "v2" }
Object.setProperty
并将它们设置为只读,这样在设置时实际上就像使用 get
关键字而不是 readonly
(虽然必须在初始化时给出一个值,以防万一有人正在尝试使其工作)。请记住,readonly
只是一个提示,没有任何实际强制执行的方式... - RycochetObject.freeze(...);
防止在JS级别更改对象,并在Typescript中创建类型Readonly<T>
。占位符... (T) 可以是原生字典、Map<X, Y>
、数组或其他任何类型。因此,无需实现自己的字典,只需使用已提供的工具进行声明/创建即可。