TypeScript 中的 object 和 Object 的区别

2023-09-11 00:00    #typescript  

在 TypeScript 中,objectObject 虽然看起来相似,但它们有着不同的含义和用途。

1. object(小写)

object 是一个 类型,表示任何非原始类型的值。原始类型包括:numberstringbooleansymbolnullundefined。换句话说,object 类型是指 除原始类型之外的所有类型

特点:

示例:

1let obj: object;
2
3obj = { name: "Alice" };  // 合法
4obj = [1, 2, 3];          // 合法
5obj = () => {};           // 合法
6
7obj = 42; // 错误:类型 'number' 不能赋值给类型 'object'
8obj = "hello"; // 错误:类型 'string' 不能赋值给类型 'object'

object 类型限制了只能是“非原始类型”的值,但是它并不关心具体是什么类型(例如是数组、函数还是普通对象)。因此,你不能直接访问对象的属性,除非你进一步指定对象的结构或类型。

2. Object(大写)

ObjectJavaScript 中的内置构造函数,用来创建对象实例。在 TypeScript 中,Object 表示所有非 null 的类型,也就是说,它是所有类型的超集,除了 nullundefined

特点:

示例:

1let obj: Object;
2
3obj = { name: "Alice" };  // 合法
4obj = [1, 2, 3];          // 合法
5obj = "hello";            // 合法(尽管通常不这么做)
6obj = 42;                 // 合法(`number` 也是 `Object` 类型的一部分)
7
8obj = null;  // 错误:`null` 不能赋值给 `Object`

Object 类型实际上包含了 所有类型,除 nullundefined 之外。

3. 区别总结

特性objectObject
表示的内容任何非原始类型(不包括 number, string, boolean, symbol, null, undefined所有类型(包括 number, string, boolean, symbol, 除 nullundefined
是否允许原始类型不允许原始类型(只能是对象)允许原始类型(包括 number, string, boolean, symbol 等)
访问属性不能直接访问属性,需要进一步细化类型允许访问属性,实际上是 Object 类型的超集
常见用途用于限定某个值是对象类型(而不是原始值)表示所有类型(但不包括 nullundefined

4. 进一步的示例:

object 示例:

 1let obj: object;
 2
 3obj = { name: "Alice" };  // 合法
 4obj = [1, 2, 3];          // 合法
 5obj = () => {};           // 合法
 6
 7// 下面的类型会报错,因为 `object` 类型不允许原始类型
 8obj = 42; // 错误
 9obj = "hello"; // 错误
10obj = true; // 错误

Object 示例:

1let obj: Object;
2
3obj = { name: "Alice" };  // 合法
4obj = [1, 2, 3];          // 合法
5obj = "hello";            // 合法
6obj = 42;                 // 合法
7
8// `null` 不能赋值给 `Object` 类型
9obj = null; // 错误

5. 总结

在 TypeScript 中,建议尽量使用 object 来表示对象类型,避免使用 Object,除非你确实需要一个更宽泛的类型(表示所有非 null/undefined 的值)。