首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 1 章 准备知识
1.1 前端技术简介
1.2 HTML入门
1.2.1 准备开发工具
1.2.2 HTML中的基础标签
1.3 CSS入门
1.3.1 CSS选择器入门
1.3.2 CSS样式入门
1.4 JavaScript入门
1.4.1 我们为什么需要JavaScript
1.4.2 JavaScript语法简介
1.4.3 从JavaScript到TypeScript
1.5 渐进式开发框架Vue
1.5.1 第一个Vue应用
1.5.2 范例:一个简单的用户登录页面
1.5.3 Vue 3的新特性
1.5.4 我们为什么要使用Vue框架
第 2 章 TypeScript基础
2.1 重新认识TypeScript
2.1.1 安装TypeScript
2.1.2 TypeScript语言版本的HelloWorld程序
2.1.3 使用高级IDE工具
2.2 TypeScript中的基本类型
2.2.1 布尔、数值与字符串
2.2.2 特殊的空值类型
2.2.3 数组与元组
2.3 TypeScript中有关类型的高级内容
2.3.1 枚举类型
2.3.2 枚举的编译原理
2.3.3 any、never与object类型
2.3.4 关于类型断言
2.4 函数的声明和定义
2.4.1 函数的类型
2.4.2 可选参数、默认参数和不定个数参数
2.4.3 函数的重载
第 3 章 TypeScript中的面向对象编程
3.1 理解与应用“类”
3.1.1 类的定义与继承
3.1.2 类的访问权限控制
3.1.3 只读属性与存取器
3.1.4 关于静态属性与抽象类
3.1.5 类的实现原理
3.2 接口的应用
3.2.1 接口的定义
3.2.2 使用接口约定函数和可索引类型
3.2.3 使用接口来约束类
3.2.4 接口的继承
3.3 TypeScript中的类型推断与高级类型
3.3.1 关于类型推断
3.3.2 联合类型与交叉类型
3.3.3 TypeScript的类型区分能力
3.3.4 字面量类型与类型别名
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(一)
小册名称:TypeScript和Vue从入门到精通(一)
### 3.3 TypeScript中的类型推断与高级类型 在TypeScript的世界里,类型系统是其最强大的特性之一,它不仅提供了静态类型检查的能力,还通过类型推断极大地简化了代码编写过程,同时支持一系列高级类型特性,让开发者能够构建出既安全又灵活的代码结构。本章将深入探讨TypeScript中的类型推断机制以及几种关键的高级类型特性。 #### 3.3.1 类型推断基础 **类型推断(Type Inference)** 是TypeScript编译器自动分析变量值或表达式的上下文,并据此推断出一个合适的类型的过程。这意味着在很多情况下,开发者无需显式指定类型,TypeScript编译器就能自动处理。这不仅减少了代码量,还使得代码更加简洁易读。 ##### 示例1:基础类型推断 ```typescript let age = 30; // 推断为 number 类型 let name = "Alice"; // 推断为 string 类型 let isStudent = false; // 推断为 boolean 类型 // 数组的字面量推断 let numbers = [1, 2, 3]; // 推断为 number[] 类型 let mixedArray = [1, "two", true]; // 推断为 (number | string | boolean)[] 类型 // 对象字面量的推断 let person = { name: "Bob", age: 25 }; // 推断为 { name: string; age: number; } 类型 ``` 在上述示例中,TypeScript编译器根据变量初始化时的值或表达式,自动推断出了变量的类型。 ##### 示例2:函数参数与返回值的类型推断 ```typescript function greet(name: string) { return "Hello, " + name; } // 函数返回值的类型推断 let greeting = greet("Charlie"); // greeting 推断为 string 类型 // 函数参数的类型推断(在函数体内) function add(a, b) { return a + b; } // 如果没有明确的参数类型,TypeScript 会基于参数的使用来推断类型 let sum = add(1, 2); // 推断 a 和 b 为 number 类型 ``` 在函数上下文中,TypeScript同样能够推断出参数和返回值的类型,尽管在某些情况下(如示例中的`add`函数),参数类型推断依赖于参数的使用方式。 #### 3.3.2 高级类型特性 TypeScript提供了多种高级类型特性,这些特性使得开发者能够表达更复杂的类型结构和逻辑,从而提升代码的可维护性和健壮性。 ##### 3.3.2.1 交叉类型(Intersection Types) 交叉类型是将多个类型合并为一个类型的方式。当一个值同时符合多个类型时,可以使用交叉类型来表示。 ```typescript interface Alarm { alert(): void; } interface Light { lightOn(): void; lightOff(): void; } // 创建一个同时具有 Alarm 和 Light 功能的对象 type AlarmLight = Alarm & Light; let combined: AlarmLight = { alert() { console.log('Alert!'); }, lightOn() { console.log('Light is on'); }, lightOff() { console.log('Light is off'); } }; ``` ##### 3.3.2.2 联合类型(Union Types) 联合类型表示一个值可以是几种类型之一。使用`|`分隔每个类型。 ```typescript let id: number | string; id = 123; // 正确 id = "123"; // 正确 // 使用类型守卫处理联合类型 function printId(id: number | string) { if (typeof id === "string") { console.log(`ID is: ${id}`); } else { console.log(`ID is: ${id}`); } } ``` ##### 3.3.2.3 类型别名(Type Aliases) 类型别名用于给类型起一个新的名字,便于代码复用和理解。 ```typescript type Name = string; type Id = number; type User = { name: Name, id: Id }; let user: User = { name: "David", id: 12345 }; ``` ##### 3.3.2.4 映射类型(Mapped Types) 映射类型允许你通过现有的类型来创建一个新的类型,新类型的属性基于原始类型的属性进行转换。 ```typescript type ReadOnly<T> = { readonly [P in keyof T]: T[P]; }; type UserProps = { name: string; age: number; }; type ReadOnlyUserProps = ReadOnly<UserProps>; let user: ReadOnlyUserProps = { name: "Eve", age: 30 }; // user.age = 40; // 这会报错,因为所有属性都是只读的 ``` ##### 3.3.2.5 条件类型(Conditional Types) 条件类型允许TypeScript根据条件表达式来解析类型。 ```typescript type TypeName<T> = T extends string ? "string" : T extends number ? "number" : T extends boolean ? "boolean" : T extends object ? "object" : "unknown"; type T1 = TypeName<string>; // "string" type T2 = TypeName<number>; // "number" type T3 = TypeName<boolean>; // "boolean" type T4 = TypeName<{ prop: string }>; // "object" type T5 = TypeName<symbol>; // "unknown" ``` ##### 3.3.2.6 索引类型查询(Indexed Access Types) 索引类型查询允许你通过类型来访问属性的类型。这在处理复杂类型或泛型时特别有用。 ```typescript interface Person { name: string; age: number; } type NameType = Person['name']; // string type AgeType = Person['age']; // number // 在泛型中使用 function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; } let name = getProperty(person, 'name'); // name 类型为 string ``` #### 3.3.3 总结 通过本章的学习,我们深入了解了TypeScript中的类型推断机制,它如何帮助开发者减少代码冗余并提高代码的可读性和可维护性。同时,我们也掌握了多种高级类型特性,包括交叉类型、联合类型、类型别名、映射类型、条件类型和索引类型查询,这些特性为TypeScript提供了强大的类型表达能力,使得开发者能够构建出更加复杂且健壮的应用程序。在后续的章节中,我们将继续探索TypeScript的其他高级特性,包括泛型、枚举、命名空间等,以进一步提升我们的TypeScript编程技能。
上一篇:
3.2.4 接口的继承
下一篇:
3.3.1 关于类型推断
该分类下的相关小册推荐:
Vue.js从入门到精通(一)
移动端开发指南
Vue.js从入门到精通(三)
Vue.js从入门到精通(二)
VUE组件基础与实战
TypeScript和Vue从入门到精通(四)
TypeScript和Vue从入门到精通(三)
Vue.js从入门到精通(四)
Vue源码完全解析
TypeScript和Vue从入门到精通(二)
Vue原理与源码解析
Vue面试指南