TypeScript 基础指南:object、Object 和 {}

在 TypeScript 中,object, Object 和 {} 之间存在一些区别,需要注意理解它们的使用场景:

部分
1
object
object 是 TypeScript 中的一种基本类型,它代表任何非基本类型(non-primitive type)的值,如函数、数组、日期等。
使用 object 类型可以明确表示一个变量不是基本类型(number、string、boolean、symbol、null、undefined)。
代码示例:
function acceptsObject(obj: object): void {
  console.log(obj);
}

acceptsObject({}); // 正确
acceptsObject([]); // 正确
acceptsObject(new Date()); // 正确
acceptsObject(42); // 错误,number 是基本类型
部分
2
Object
Object 是 JavaScript 中的一个内置对象构造函数,它可以用来创建对象。
在 TypeScript 中,Object 类型表示所有拥有 Object 属性和方法的值,包括基本类型和非基本类型。
使用 Object 类型时,会失去对象属性和方法的类型检查。
代码示例:
function acceptsObject(obj: Object): void {
  console.log(obj.toString()); // 可以访问 Object 的方法
  console.log(obj.prop); // 但无法访问对象的具体属性
}

acceptsObject({}); // 正确
acceptsObject([]); // 正确
acceptsObject(42); // 正确,number 也是 Object 类型

并且,Object 类型在 TypeScript 中提供了一些常用的函数,主要有以下几种:

Object.assign(target, ...sources):

用于将一个或多个源对象的可枚举属性复制到目标对象。

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 }
Object.create(proto, [propertiesObject]):

创建一个新对象,使用现有的对象作为新创建对象的原型。

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
Object.keys(obj), Object.values(obj), Object.entries(obj):

这三个函数分别返回给定对象自身可枚举属性的键名数组、值数组和键值对数组。

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(obj), Object.seal(obj):

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; // 无效,无法添加新属性
部分
3
{}
{} 表示一个空对象字面量类型,它与 object 类型不同,object 可以是任何非基本类型的值。
{} 类型仅表示一个空对象,而不是任意对象。
代码示例:
function acceptsEmptyObject(obj: {}): void {
  console.log(obj);
}

acceptsEmptyObject({}); // 正确
acceptsEmptyObject([]); // 错误, 数组不是空对象
acceptsEmptyObject(new Date()); // 错误, 日期不是空对象
acceptsEmptyObject(42); // 错误, 数字不是空对象
部分
4
总结
object 表示任何非基本类型的值,是一个广义的类型。
Object 是 JavaScript 的内置对象构造函数,在 TypeScript 中表示所有拥有 Object 属性和方法的值。
{} 表示一个空对象字面量类型,它与 object 类型不同,object 可以是任何非基本类型的值。

在编码时,根据具体需求选择合适的类型会有助于提高代码的可读性和类型安全性。