在 TypeScript 中,object, Object 和 {} 之间存在一些区别,需要注意理解它们的使用场景:
function acceptsObject(obj: object): void {
console.log(obj);
}
acceptsObject({}); // 正确
acceptsObject([]); // 正确
acceptsObject(new Date()); // 正确
acceptsObject(42); // 错误,number 是基本类型
function acceptsObject(obj: Object): void {
console.log(obj.toString()); // 可以访问 Object 的方法
console.log(obj.prop); // 但无法访问对象的具体属性
}
acceptsObject({}); // 正确
acceptsObject([]); // 正确
acceptsObject(42); // 正确,number 也是 Object 类型
并且,Object 类型在 TypeScript 中提供了一些常用的函数,主要有以下几种:
用于将一个或多个源对象的可枚举属性复制到目标对象。
const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };
const result = Object.assign(target, source);
console.log(result); // { a: 1, b: 3, c: 4 }
console.log(target); // { a: 1, b: 3, c: 4 }
创建一个新对象,使用现有的对象作为新创建对象的原型。
const person = {
printInfo() {
console.log(`Name: ${this.name}, Age: ${this.age}`);
}
};
const john = Object.create(person, {
name: { value: 'John', writable: true },
age: { value: 30, writable: true }
});
john.printInfo(); // Name: John, Age: 30
这三个函数分别返回给定对象自身可枚举属性的键名数组、值数组和键值对数组。
const obj = { a: 1, b: 2, c: 3 };
console.log(Object.keys(obj)); // ['a', 'b', 'c']
console.log(Object.values(obj)); // [1, 2, 3]
console.log(Object.entries(obj)); // [['a', 1], ['b', 2], ['c', 3]]
Object.freeze() 可以冻结一个对象,冻结后该对象的属性不能被添加、删除、重新赋值。 Object.seal() 可以密封一个对象,密封后该对象的属性值可以修改,但是新增或删除属性会失败。
const obj = { a: 1, b: 2 };
Object.freeze(obj);
obj.a = 3; // 无效,属性无法修改
obj.c = 4; // 无效,无法添加新属性
const sealedObj = { a: 1, b: 2 };
Object.seal(sealedObj);
sealedObj.a = 3; // 有效,属性值可修改
sealedObj.c = 4; // 无效,无法添加新属性
function acceptsEmptyObject(obj: {}): void {
console.log(obj);
}
acceptsEmptyObject({}); // 正确
acceptsEmptyObject([]); // 错误, 数组不是空对象
acceptsEmptyObject(new Date()); // 错误, 日期不是空对象
acceptsEmptyObject(42); // 错误, 数字不是空对象
在编码时,根据具体需求选择合适的类型会有助于提高代码的可读性和类型安全性。