TypeScript 中类型 object 和类型 Object 的区别
2024-08-11 564字
在 TypeScript 开发过程中,有时需要定义对象类型的变量。但在选择类型时,很多人会对 object 和 Object 这两个选项感到困惑。本文将详细解释它们之间的关键区别。
object 类型
object 表示所有 非原始类型(non-primitive types)。
JavaScript 的原始类型包括:number、string、boolean、symbol、bigint、null 和 undefined。object 类型则用于表示这些原始类型之外的所有类型,即所有对象类型。从本质上讲,object 类型的作用是确保变量必须是对象,而不能是原始值。
具体示例如下:
let a: object;
a = 1; // ❌ 错误:不能将类型 “number” 分配给类型 “object”
a = “hi”; // ❌ 错误:不能将类型 “string” 分配给类型 “object”
a = true; // ❌ 错误:不能将类型 “boolean” 分配给类型 “object”
a = Symbol(); // ❌ 错误:不能将类型 “symbol” 分配给类型 “object”
a = null; // ❌ 错误:不能将类型 “null” 分配给类型 “object”
a = undefined; // ❌ 错误:不能将类型 “undefined” 分配给类型 “object”
a = BigInt(9007199254740991); // ❌ 错误:不能将类型 “bigint” 分配给类型 “object”
a = {}; // ✅ 正确:对象字面量
a = [1, 2]; // ✅ 正确:数组也是对象
a = function() {}; // ✅ 正确:函数也是对象
a = new String(“1”); // ✅ 正确:包装器对象
Object 类型
Object 表示所有继承自 Object.prototype 的值,几乎涵盖了除 null 和 undefined 之外的所有类型。因此可以简单理解为:Object 表示除 null 和 undefined 之外的所有值。
具体示例如下:
let b: Object;
b = null; // ❌ 错误:不能将类型 “null” 分配给类型 “Object”
b = undefined; // ❌ 错误:不能将类型 “undefined” 分配给类型 “Object”
// 以下赋值全部合法
b = 1;
b = “hi”;
b = true;
b = Symbol();
b = {};
b = [1, 2];
b = function() {};
b = new String(“1”);
b = BigInt(9007199254740991);
总结
- 使用
object类型可以更精确地限制变量只能接收对象(而非原始类型) - 使用
Object类型则允许几乎所有类型(除了 null 和 undefined),实际上它的作用很弱,通常不推荐使用 - 在现代 TypeScript 开发中,应优先使用
object而不是Object,以实现更好的类型安全