TypeScript 中 Object, object类型之间的区别

335 阅读2分钟

前言

最近在开发鸿蒙应用,在封装开发框架的时候,总是会遇到Objectobject{}的类型选择问题,本文的目的是记录各个类型的不同和相同,方便理解学习

1 什么是object

object是在TypeScript2.2中引入的新类型,是TypeScript中的一种基本类型,用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:stringbooleannumberbigintsymbolnullundefined。换句话说,object类型表示任何不是原始类型的值,包括数组、函数和普通对象。

object 类型表示如下:

// All primitive types
type Primitive = string 
 | boolean | number 
 | bigint | symbol 
 | null | undefined;

// All non-primitive types
type NonPrimitive = object;
let obj: object;

obj = { name: "John" };  // 正确
obj = [1, 2, 3];         // 正确
obj = () => {};          // 正确

obj = "hello";           // 错误
obj = 42;                // 错误
obj = true;              // 错误
obj = null;              // 错误
obj = undefined;         // 错误

2 什么是Object

Object是JavaScript中的全局对象,所有JavaScript对象都是Object类型的实例。表示所有非nullundefined的值,包括原始类型的包装对象。

let obj: Object;

obj = { name: "John" };  // 正确
obj = [1, 2, 3];         // 正确
obj = () => {};          // 正确
obj = "hello";           // 正确
obj = 42;                // 正确
obj = true;              // 正确
obj = null;              // 错误
obj = undefined;         // 错误

在TypeScript中,Object类型表示所有JavaScript对象的类型,是所有非原始类型的超类型。Object类型是所有类的实例的类型。它由以下两个接口来定义:

  • Object 接口定义了 Object.prototype 原型对象上的属性; 代码语言:javascript
// node_modules/typescript/lib/lib.es5.d.ts

interface Object {
  constructor: Function;
  toString(): string;
  toLocaleString(): string;
  valueOf(): Object;
  hasOwnProperty(v: PropertyKey): boolean;
  isPrototypeOf(v: Object): boolean;
  propertyIsEnumerable(v: PropertyKey): boolean;
}
  • ObjectConstructor 接口定义了 Object 类的属性。 代码语言:javascript

**复制

// node_modules/typescript/lib/lib.es5.d.ts

interface ObjectConstructor {
  /** Invocation via `new` */
  new(value?: any): Object;
  /** Invocation via function calls */
  (value?: any): any;

  readonly prototype: Object;

  getPrototypeOf(o: any): any;

  // ···
}
declare var Object: ObjectConstructor;

3 实际使用建议

  • 如果需要一个值必须是一个对象,而不是原始类型,使用object

  • 如果需要一个更宽泛的类型,可以接受原始类型的包装对象(如StringNumber等),使用Object

例子:

function processObject(obj: object) {
  // 可以确保 obj 是一个对象
}

function processAnything(value: Object) {
  // value 可以是任何非 null 和 undefined 的值
}

processObject({});           // 正确
processObject([]);           // 正确
processObject(() => {});     // 正确
processObject("string");     // 错误
processObject(123);          // 错误

processAnything({});         // 正确
processAnything([]);         // 正确
processAnything(() => {});   // 正确
processAnything("string");   // 正确
processAnything(123);        // 正确
processAnything(null);       // 错误
processAnything(undefined);  // 错误