前言
最近在开发鸿蒙应用,在封装开发框架的时候,总是会遇到Object、object和{}的类型选择问题,本文的目的是记录各个类型的不同和相同,方便理解学习
1 什么是object
object是在TypeScript2.2中引入的新类型,是TypeScript中的一种基本类型,用于表示非原始类型。在 JavaScript 中以下类型被视为原始类型:string、boolean、number、bigint、symbol、null和undefined。换句话说,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类型的实例。表示所有非null和undefined的值,包括原始类型的包装对象。
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。 -
如果需要一个更宽泛的类型,可以接受原始类型的包装对象(如
String、Number等),使用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); // 错误