在 TypeScript 中,Object 和 object 之间存在很大的区别,尽管它们的名称相似。这两个类型处理对象时有不同的用法和语义。在更深入地了解它们之前,先总结一下它们的主要区别:
Object类型: 是所有 JavaScript 对象的父类型,但允许分配所有非原始类型(包括数组、函数等)。object类型: 是更严格的类型,只允许分配普通对象(不包括原始类型,如number、string、symbol等)。
Object 类型
在 TypeScript 中,Object 类型符合所有的非原始类型,即任何的 Object 或者 Function,这包括内置对象、数组、函数等。基本上,只有 null 和 undefined 是不属于 Object 类型的。
let obj1: Object;
obj1 = { name: 'Alice' }; // 对象字面量 - OK
obj1 = [1, 2, 3]; // 数组 - OK
obj1 = function() {}; // 函数 - OK
obj1 = new Date(); // Date 对象 - OK
obj1 = new Map(); // Map 对象 - OK
// 错误示例:以下是原始类型,不允许赋给 Object
obj1 = 42; // 错误:number 不属于 Object
obj1 = "Hello"; // 错误:string 不属于 Object
obj1 = true; // 错误:boolean 不属于 Object
obj1 = Symbol(); // 错误:symbol 不属于 Objectobject 类型
object 类型更加严格,只允许普通 JavaScript 对象,这意味着它不包括原始类型,以及 null 和 undefined。不像 Object 类型那样宽泛,它专门用于限制变量只含有对象字面量。
let obj2: object;
obj2 = { name: 'Alice' }; // 对象字面量 - OK
obj2 = [1, 2, 3]; // 数组 - OK
obj2 = function() {}; // 函数 - OK
obj2 = new Date(); // Date 对象 - OK
obj2 = new Map(); // Map 对象 - OK
// 错误示例:以下是原始类型,不允许赋给 object
obj2 = 42; // 错误:number 不属于 object
obj2 = "Hello"; // 错误:string 不属于 object
obj2 = true; // 错误:boolean 不属于 object
obj2 = Symbol(); // 错误:symbol 不属于 objectObject 和 object 在实际开发中的应用
使用 Object
Object 常用于表示非原始类型的广泛类型,不限制为特定的对象形态。这在一些通用性的代码中非常有用。
function logObj(obj: Object): void {
console.log(obj);
}
logObj({ name: 'Alice' }); // 对象 - OK
logObj([1, 2, 3]); // 数组 - OK
logObj(() => {}); // 函数 - OK
logObj(new Date()); // Date 对象 - OK
logObj(123); // 错误:number 不属于 Object使用 object
object 主要用于需要严格限制变量只能是对象的场合,它不会接受非对象类型,这样能提高代码的类型安全性。
function handleObject(obj: object): void {
console.log(obj);
}
handleObject({ name: 'Alice' }); // 对象 - OK
handleObject([1, 2, 3]); // 数组 - OK
handleObject(() => {}); // 函数 - OK
handleObject(new Date()); // Date 对象 - OK
handleObject(123); // 错误:number 不属于 objectObject、object 与 {} 的区别
在 TypeScript 中,还有一种 {} 类型,与 Object 和 object 有一定的区别。
{}: 表示任何非null和undefined的值,它比object更宽泛,甚至允许原始类型,但不能是null和undefined。
let obj3: {};
obj3 = { name: 'Alice' }; // 对象字面量 - OK
obj3 = [1, 2, 3]; // 数组 - OK
obj3 = function() {}; // 函数 - OK
obj3 = new Date(); // Date 对象 - OK
obj3 = new Map(); // Map 对象 - OK
obj3 = 42; // number 也是 OK
obj3 = "Hello"; // string 也是 OK
obj3 = true; // boolean 也是 OK
obj3 = Symbol(); // symbol 也是 OK
obj3 = null; // 错误:null 不属于 {}
obj3 = undefined; // 错误:undefined 不属于 {}总结
-
Object类型:- 代表所有的非原始类型(原始类型包括
number、string、boolean、symbol、null和undefined)。 - 广泛应用于需要兼容多种非原始类型的场景。
- 代表所有的非原始类型(原始类型包括
-
object类型:- 更严格,只代表普通对象(不包括原始类型)。
- 提高类型安全性,适用于需要限制变量为普通对象的场景。
-
{}类型:- 表示任何非
null和undefined的值,包括原始类型和对象。
- 表示任何非
通过理解这些不同的类型及其用途,可以在编写 TypeScript 代码时更精确地控制类型检查和约束,提升代码的健壮性和可维护性。