TypeScript(三)对象类型

本文介绍了TypeScript中的非原始类型,包括Object与object的区别,Array、Function、Tuple、Enum等对象类型的使用,并通过示例代码展示了它们的声明和用途,强调了正确指定类型以充分利用TypeScript的强类型检查功能的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

对象类型

Object与object有什么区别?

Array(数组)

Function(函数)

Tuple(元组)

Enum(枚举)

数字:

字符串:

 计算类型:

二进制计算:

异构枚举(不同类型的初始值):

Object(对象)

总结


前言

本文收录于TypeScript知识总结系列文章,欢迎指正! 

在TS中除了之前的基本类型外,还包含Array(数组),Function(函数),Tuple(元组),Object(对象)等非原始值,他们统称为object类型(对象类型)

这些类型也是TS强类型检查的基础

对象类型

在此之前我们需要了解下面这个概念

Object与object有什么区别?

object是TypeScript中的类型(在JS中不存在),它是非基本数据类型的统称,包括普通对象、数组、函数等等

而Object可以看成是JavaScript中的全局Object对象,它包括所有JavaScript内置的对象类型,我们常说的万物皆对象说的就是Object

一句话总结:Object 包含了所有JavaScript内置对象类型,而object包含了所有非原始类型的值

以下代码可以用上述概念解释

const obj: Object = 1 // 正常运行
const obj1: object = 1 // error 不能将类型“number”分配给类型“object”

言归正传,如果一个变量的类型是object,那么它可以存储任何引用类型的值。示例代码如下:

const obj: object = {} // 对象
const arr: object = [1, 2, 3] // 数组
const fn: object = function () { // 函数
    console.log(obj);
}
const tuple: object = ['count', 10] // 元组
const map: object = new Map() // 键值对集合
const set: object = new Set() // 无序集合

上述代码写法不会报错,但是无法使用特有的属性或函数,如执行fn(),会提示无法执行,使用map.set会找不到该函数

解决方法是使用更具象的类型来表示变量,如:

const obj: Object = {}
const arr: number[] = [1, 2, 3]
const fn: Function = function () {
    console.log(obj);
}
const tuple: [string, number] = ['count', 10]
const map: Map<number, string> = new Map()
const set: Set<string> = new Set()
obj.valueOf()
arr.push(4)
fn()
tuple.push(1)
TypeScript中,可以使用类型断言和类型保护来判断对象的类型。 1. 类型断言(Type Assertion): 类型断言是一种告诉编译器某个值的具体类型的方式。可以使用尖括号语法或者as关键字进行类型断言。 例如: ```typescript let obj: any = "hello"; let strLength: number = (<string>obj).length; // 使用尖括号语法进行类型断言 let strLength: number = (obj as string).length; // 使用as关键字进行类型断言 ``` 2. 类型保护(Type Guard): 类型保护是一种在特定范围内缩小变量的类型的方式,以便在该范围内使用特定类型的属性和方法。 TypeScript提供了多种类型保护的方式,包括typeof类型保护、instanceof类型保护和自定义类型保护。 - typeof类型保护: 可以使用typeof操作符来判断基本类型的变量类型。 例如: ```typescript function printLength(obj: string | number) { if (typeof obj === "string") { console.log(obj.length); // 在这个范围内,obj被缩小为string类型 } else { console.log(obj); // 在这个范围内,obj被缩小为number类型 } } ``` - instanceof类型保护: 可以使用instanceof操作符来判断对象的具体类型。 例如: ```typescript class Animal { name: string; constructor(name: string) { this.name = name; } } class Dog extends Animal { breed: string; constructor(name: string, breed: string) { super(name); this.breed = breed; } } function printName(animal: Animal) { if (animal instanceof Dog) { console.log(animal.breed); // 在这个范围内,animal被缩小为Dog类型 } else { console.log(animal.name); // 在这个范围内,animal被缩小为Animal类型 } } ``` - 自定义类型保护: 可以使用自定义的类型保护函数来判断对象的具体类型。 例如: ```typescript function isString(obj: any): obj is string { return typeof obj === "string"; } function printLength(obj: string | number) { if (isString(obj)) { console.log(obj.length); // 在这个范围内,obj被缩小为string类型 } else { console.log(obj); // 在这个范围内,obj被缩小为number类型 } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宇的编程之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值