TypeScript - 利用GPT辅助学习
TypeScript
- 一、基础
- 1. 安装 TypeScript
- 2. 创建你的第一个 TypeScript 文件
- 3. 编译 TypeScript 代码
- 4. 变量声明与类型注解
- 5. 函数与类型注解
- 6. 总结
- 二、进阶
- 常用类型
- 1. 类型别名
- 2. 对象类型
- 3. 类型断言
- 4.`typeof` 操作符
- 高级类型
- 1. 类
- 2. 交叉类型
- 3. 泛型与 `keyof`
- 4. 索引签名类型与 索引查询类型
- 5 映射类型
- 6.总结
- 三、文件类型
- 1. `.ts` 文件 — TypeScript 的“主战场”
- 用途:编写程序代码的地方。
- 示例:
- 2. `.d.ts` 文件 — 类型声明的超级英雄
- 用途:为 JS 提供类型信息
- 示例:
- 3.`.ts` 与 `.d.ts` 文件的关键区别
- 4.如何使用 `.d.ts` 文件
- 5.总结:TS 里的 `.ts` 和 `.d.ts` 文件
本篇由GPT辅助学习TypeScript而来的,仅为简单学习所创,若有疑惑还请去 TypeScript官网进一步了解
一、基础
1. 安装 TypeScript
在开始之前,你需要在你的电脑上安装 TypeScript 编译器。只需要几个步骤,就能拥有它。
步骤 1:安装 Node.js 和 npm 如果你还没有安装 Node.js,快去官网下载安装。Node.js 附带的 npm(包管理器)是我们接下来安装 TypeScript 的工具。
步骤 2:通过 npm 安装 TypeScript
npm install -g typescript
这样就将 TypeScript 安装到了你的机器上。-g 表示全局安装,可以在任何地方使用 tsc 命令。
步骤 3:检查安装是否成功
安装完后,输入以下命令检查 TypeScript 版本:
tsc --version
如果看到版本号,就表示安装成功!🎉
2. 创建你的第一个 TypeScript 文件
步骤 1:创建文件
用你喜欢的文本编辑器(如 VS Code、Sublime Text 等),创建一个文件,命名为 hello.ts。这个 .ts 后缀标志着这是一个 TypeScript 文件。
步骤 2:编写代码
在 hello.ts 文件里,写一些简单的 TypeScript 代码:
let message: string = "Hello, TypeScript!";
console.log(message);
3. 编译 TypeScript 代码
在命令行中,切换到包含 hello.ts 的目录,然后运行以下命令将 TypeScript 代码编译成 JavaScript:
tsc hello.ts
运行后,你会看到同目录下生成了一个 hello.js 文件,内容类似这样:
var message = "Hello, TypeScript!";
console.log(message);
步骤 3:运行 JavaScript 代码
你可以使用 Node.js 来运行编译后的 JavaScript 文件:
node hello.js
你应该会看到控制台输出:
Hello, TypeScript!
4. 变量声明与类型注解
在 TypeScript 中,变量的类型不再是模糊不清的了。你可以在声明变量时指定它们的类型。这是 TypeScript 的超级武器之一!
基本类型
let age: number = 30; // 数字类型
let names: string = "TypeScript"; // 字符串类型
let isActive: boolean = true; // 布尔类型
数组
数组的类型可以用 [] 来表示:
let numbers: number[] = [1, 2, 3]; // 数字数组
let fruits: string[] = ["apple", "banana", "cherry"]; // 字符串数组
或者使用 Array<type>:
let numbers: Array<number> = [1, 2, 3];
元组
元组是一个固定长度和类型的数组:
let person: [string, number] = ["Alice", 25]; // 元组,第一个元素是字符串,第二个是数字
任意类型
有时候,你不确定变量的类型,可以使用 any 来表示:
let anything: any = "Hello"; // 类型可以是任何类型
anything = 42; // 现在是数字了
anything = true; // 现在是布尔类型了
字面量
用于约束变量的值为特定字符串、数字或布尔值的类型。
let direction: "up" | "down" = "up"; // 只能是 "up" 或 "down"
direction = "down"; // OK
direction = "left"; // 错误:不能赋值 "left"
枚举类型(Enums)
枚举用于定义一组具名的常数,通常用于表示一组有限的状态或选项。
enum Direction {Up = "UP",Down = "DOWN",Left = "LEFT",Right = "RIGHT",
}let move: Direction = Direction.Up; // 使用枚举
未知类型
如果你想声明一个不确定的变量类型,但又想要一些检查,可以使用 unknown,它比 any 更安全:
let value: unknown = "hello";
value = 42; // 也可以是数字
5. 函数与类型注解
函数也可以定义参数类型和返回类型。这就是 TypeScript 的类型检查功能,能提前警告你代码中的潜在问题。
函数声明
function greet(name: string): string {return `Hello, ${name}!`;
}let greeting = greet("TypeScript");
console.log(greeting); // 输出 "Hello, TypeScript!"
可选参数
你也可以设置参数为可选的,只需要在参数后加一个问号:
function greet(name: string, age?: number): string {if (age) {return `Hello, ${name}! ${age} `;}return `Hello, ${name}!`;
}console.log(greet("Alice")); // 输出 "Hello, Alice!"
console.log(greet("Bob", 18)); // 输出 "Hello, Bob! 18"
6. 总结
你现在已经有了一个 TypeScript 文件,成功安装了 TypeScript 编译器,并了解了如何声明变量、定义类型和编写简单的函数。是不是感觉有点厉害了?😎
接下来,你可以探索更多高级功能,如 类、接口、泛型、模块 等等,但今天我们就先从基础开始,让你顺利地飞起来!🚀
二、进阶
让我们继续扩展 TypeScript 的神奇世界,一口气包括更多常用类型、类型别名、函数类型、对象类型等,也涵盖一些高级类型,让你的 TypeScript 技能更上一层楼。准备好了吗?我们开始!🚀
常用类型
1. 类型别名
类型别名(Type Aliases)用来给一个类型取个别名,可以让你的代码更简洁易懂。
type StringOrNumber = string | number; // String 或 Number 类型
let data: StringOrNumber = "hello"; // 可以是 string 或 number
data = 42; // 也可以是数字
2. 对象类型
对象类型(Object Types)是用来描述对象的结构,确保对象中的每个属性都有合适的类型。
type Person = {name: string;age: number;
};const person: Person = {name: "Alice",age: 30,
};
let person:{name: string;age: number;} ={name: "Alice",age: 30,
}
3. 类型断言
类型断言(Type Assertions)告诉 TypeScript 编译器,开发者“知道”某个变量的确切类型,通常用于从更宽泛的类型转换为更精确的类型。
let message: any = "Hello, TypeScript!";
let strLength: number = (message as string).length; // 类型断言为 string
4.typeof 操作符
typeof 用于获取变量的类型,通常用于与 类型保护 和 类型推论 配合使用。
let name = "Alice";
let nameType: typeof name = "Bob"; // 类型为 string
高级类型
1. 类
类(Class)是面向对象编程的重要组成部分,TypeScript 中的类提供了更多的功能和类型检查。
class Animal {name: string;constructor(name: string) {this.name = name;}speak() {console.log(`${this.name} makes a sound.`);}
}class Dog extends Animal {speak() {console.log(`${this.name} barks.`);}
}const dog = new Dog("Buddy");
dog.speak(); // 输出 "Buddy barks."
在 TypeScript 中,两个类型如果结构相同,它们是兼容的。
interface Animal {name: string;
}class Dog {name: string;constructor(name: string) {this.name = name;}
}let dog: Dog = new Dog("Buddy");
let animal: Animal = dog; // 兼容,因为 Dog 类符合 Animal 接口的结构
2. 交叉类型
交叉类型(Intersection Types)是将多个类型合并为一个类型,合并后的类型包含了所有类型的成员。
type Person = {name: string;age: number;
};type Employee = {jobTitle: string;
};type EmployeePerson = Person & Employee; // 交叉类型const employee: EmployeePerson = {name: "Alice",age: 30,jobTitle: "Developer",
};
3. 泛型与 keyof
泛型(Generics)允许你定义可以接受任意类型的函数、类、接口等,确保类型安全。
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello!"); // 类型是 string
let numResult = identity<number>(42); // 类型是 number
keyof 用来提取某个对象的所有键,并形成一个类型。
interface Person {name: string;age: number;
}type PersonKeys = keyof Person; // "name" | "age"
4. 索引签名类型与 索引查询类型
索引签名类型(Index Signature Types) 允许你定义可以动态访问的对象类型。
interface Dictionary {[key: string]: string;
}const dict: Dictionary = {hello: "world",foo: "bar",
};
索引查询类型(Index Access Types) 允许你查询对象类型的某个属性的类型。
type NameType = Person["name"]; // 类型是 string
5 映射类型
映射类型(Mapped Types)允许你根据某个类型创建一个新类型,常用于批量修改对象的属性。
type ReadOnly<T> = {readonly [K in keyof T]: T[K];
};interface Person {name: string;age: number;
}const person: ReadOnly<Person> = { name: "Alice", age: 30 };
// person.name = "Bob"; // 错误,属性是只读的
也可以结合 in 操作符来创建新的类型。
type PartialPerson = {[K in keyof Person]?: Person[K]; // 将 Person 中的所有属性变为可选
};
6.总结
现在你已经有了 TypeScript 的常用类型、类型别名、函数类型、对象类型等的全面了解,还可以更深入地理解高级类型如类、交叉类型、泛型、映射类型等。通过这些强大的特性,TypeScript 能够帮助你编写更加灵活、安全且可维护的代码。是不是已经迫不及待要开始动手写更复杂的 TypeScript 项目了呢?🎉
三、文件类型
TypeScript 是个聪明的小家伙,它通过 .ts 和 .d.ts 两种文件类型让我们编写代码时更加得心应手!让我们一个个捋顺清楚,看看它们之间的“微妙”区别吧!🚀
1. .ts 文件 — TypeScript 的“主战场”
.ts 文件就是 TypeScript 的本体,里面包含了你写的所有实现代码。你写的函数、类、变量,甚至所有的类型注解都在这里。可以说它是 TypeScript 的灵魂,是我们“战斗”的地方!💥
用途:编写程序代码的地方。
- 你最常用的文件类型——这里写代码!
- 可以写任何可执行的 TypeScript 代码——函数、类、对象、你想要的一切都在这里!
- 编译成 JavaScript,跑在浏览器或 Node.js 环境中。🎯
示例:
// hello.ts — 你开始写的第一行 TypeScript 代码!🎉function greet(name: string): string {return `Hello, ${name}!`; // 就这么简单,带着热情!
}console.log(greet("Alice")); // 输出: Hello, Alice!
小贴士:
- 运行
tsc hello.ts之后,你会发现编译器生成了hello.js文件,这个文件就是最终执行的 JavaScript 代码。 - 你可以通过
node hello.js来运行它,看看效果如何!🌟
2. .d.ts 文件 — 类型声明的超级英雄
.d.ts 文件就像是 TypeScript 的“隐形助手”——它不会参与执行,但却能让你的代码在幕后更有条理。它专门用来给你的 JavaScript 提供类型信息,帮助 TypeScript 理解“这个东西应该是什么类型”!😎
用途:为 JS 提供类型信息
- 为外部库(那些没有内置 TypeScript 类型的 JavaScript 库)提供类型定义。👑
- 你可以用它来描述 JavaScript 代码的结构,确保 TypeScript 编译器能够正确识别并提供类型检查。📚
- 不包含实际实现代码,只是类型的“地图”。✨
示例:
假设你在用某个 JavaScript 库,里面有个 greet 函数,但它没有 TypeScript 类型信息。怎么办?没关系,来个 .d.ts 文件吧!
// greet.d.ts — 类型定义开始!declare function greet(name: string): string; // 只定义函数签名,没有实现!
这个 .d.ts 文件告诉 TypeScript:“嘿,greet 函数是存在的,而且它接受一个字符串参数并返回一个字符串!”这样 TypeScript 就能通过这个类型信息来为你提供智能提示和类型检查了!✨
3..ts 与 .d.ts 文件的关键区别
| 特性 | .ts 文件 | .d.ts 文件 |
|---|---|---|
| 目的 | 编写 TypeScript 可执行代码,编译成 JavaScript 运行 | 提供类型声明,告诉 TypeScript 其他代码的结构和类型 |
| 内容 | 包含实现代码(函数、类、逻辑等) | 仅包含类型定义,没有实现代码 |
| 编译 | 编译成 .js 文件 | 不编译成 JavaScript 文件,仅用于类型检查 |
| 场景 | 编写程序的核心逻辑、功能等 | 为第三方库提供类型定义,或为 JavaScript 代码添加类型定义 |
4.如何使用 .d.ts 文件
- 为第三方库添加类型定义
你在使用一个没有 TypeScript 类型定义的 JavaScript 库时,怎么办?别担心!只需要通过 @types 包来引入它们的类型声明文件!🎉
举个例子,如果你在用 Lodash(一个 JavaScript 的工具库),并且想用它的类型定义:
npm install @types/lodash
这个命令会安装 Lodash 的类型声明文件,TypeScript 就会知道 Lodash 是怎样工作的,让你享受到类型检查和代码补全的好处!👏
手动为 JavaScript 写声明文件
如果你自己有一些 JavaScript 文件,也可以自己写 .d.ts 文件来为它们添加类型信息。比如你写了一个 utils.js 文件,你可以写一个 utils.d.ts 来描述它的类型:
// utils.d.tsdeclare function formatDate(date: Date): string; // 格式化日期的函数
declare function sum(a: number, b: number): number; // 加法函数MyButton: typeof MyButton;
这样 TypeScript 就知道了 formatDate 和 sum 函数的类型,不用再怕类型错误了!💪
5.总结:TS 里的 .ts 和 .d.ts 文件
.ts文件:你的主战场,里面的代码会被编译为 JavaScript 并运行。它包含了你所有的功能实现,类型注解,甚至你的勇气!🚀.d.ts文件:类型声明的超级英雄,它让 TypeScript 知道其他 JavaScript 文件的类型结构,确保你的代码在没有实际实现的情况下也能进行类型检查。🦸♂️
这两种文件的结合,让 TypeScript 能够发挥最大的优势,既保证代码的灵活性,又确保类型安全。记住,.ts 文件用来写逻辑,.d.ts 文件用来给外部代码“写传单”!😏
相关文章:
TypeScript - 利用GPT辅助学习
TypeScript 一、基础1. 安装 TypeScript2. 创建你的第一个 TypeScript 文件3. 编译 TypeScript 代码4. 变量声明与类型注解5. 函数与类型注解6. 总结 二、进阶常用类型1. 类型别名2. 对象类型3. 类型断言4.typeof 操作符 高级类型1. 类2. 交叉类型3. 泛型与 keyof4. 索引签名类…...
VMware虚拟机迁移到阿里云
VMware虚拟机迁移到阿里云是一个涉及多个步骤的过程,具体如下: 使用阿里云的服务器迁移中心(SMC)进行P2V或V2V迁移。如果是小型应用,可以通过制作镜像文件然后上传至阿里云OSS,并基于该镜像创建ECS实例。对…...
【STM32-学习笔记-15-】MAX7219点阵屏模块
文章目录 MAX7219点阵模块一、MAX7219Ⅰ、 概述Ⅱ、功能特点Ⅲ、引脚功能Ⅳ、典型应用电路Ⅴ、内部组成结构Ⅵ、时序图Ⅶ、寄存器 二、STM32控制点阵屏Ⅰ、程序框图Ⅱ、程序编写①、MAX7219.c②、MAX7219.h③、MAX7219_Img.h④、main.c MAX7219点阵模块 一、MAX7219 Ⅰ、 概述…...
高并发内存池_CentralCache(中心缓存)和PageCache(页缓存)申请内存的设计
三、CentralCache(中心缓存)_内存设计 (一)Span的创建 // 页编号类型,32位下是4byte类型,64位下是8byte类型 // #ifdef _WIN64 typedef unsigned long long PageID; #else _WIN32 typedef size_t PageI…...
elementUI Table组件实现表头吸顶效果
需求描述 当 table 内容过多的时候,页面上滑滚动,表头的信息也会随着被遮挡,无法将表头信息和表格内容对应起来,需要进行表头吸顶 开始编码💪 环境:vue2.6、element UI step1: 给el-table__h…...
语言模型的价值定位与技术突破:从信息处理到创新认知
标题:语言模型的价值定位与技术突破:从信息处理到创新认知 文章信息摘要: 当前语言模型的核心价值主要体现在信息综合与处理能力上,用户友好的交互界面是其成功关键。在模型计算机制方面,推理能力的实现包括chain-of-…...
微信小程序使用上拉加载onReachBottom。页面拖不动。一直无法触发上拉的事件。
1,可能是原因是你使用了scroll-view的标签,用onReachBottom触发加载事件。这两个是有冲突的。没办法一起使用。如果页面的样式是滚动的是无法去触发页面的onReachBottom的函数的。因此,你使用overflow:auto.来使用页面的某些元素滚动…...
Spring Boot 快速创建项目
目录 一. 创建项目 编辑 二. 项目目录 三. 运行项目 (1) 启动项目 (2) 输出HelloWorld 一. 创建项目 我们以idea专业版为例创建Spring项目: 步骤: (1) File --> New --> Project (2) 配置项目基本信息 (3) 依赖: 需要什么就勾选什么. 我们这里就只勾选一个Spri…...
kafka学习笔记5 PLAIN认证——筑梦之路
在Kafka中,SASL(Simple Authentication and Security Layer)机制包括三种常见的身份验证方式: SASL/PLAIN认证:含义是简单身份验证和授权层应用程序接口,PLAIN认证是其中一种最简单的用户名、密码认证方式&…...
直驱式风电储能制氢仿真模型matlab/simulink
接着还是以直驱式风电为DG中的研究对象,上篇博客考虑的风电并网惯性的问题,这边博客主要讨论功率消纳的问题。 考虑到风速是随机变化的,导致风电输出功率的波动性和间歇性问题突出;随着其应用规模的不断扩大以及风电在电网中渗透率…...
excel批量提取批注
打开excel ALTF11 插入代码 Function GetComment(rng As Range) As StringOn Error Resume NextDim commentText As StringcommentText rng.Comment.TextcommentText Replace(commentText, "rina.farriani:", "")GetC…...
高性能PCIE硬件加密卡:满足大数据时代的安全需求
在大数据时代,数据的海量增长和快速流动带来了前所未有的安全挑战。如何确保数据的机密性、完整性和可用性,成为企业和组织必须面对的重要问题。高性能PCIE硬件加密卡作为一种专业的数据安全解决方案,凭借其卓越的性能和安全性,正…...
C语言小项目——通讯录
功能介绍: 1.联系人信息:姓名年龄性别地址电话 2.通讯录中可以存放100个人的信息 3.功能: 1>增加联系人 2>删除指定联系人 3>查找指定联系人的信息 4>修改指定联系人的信息 5显示所有联系人的信息 6>排序(名字&…...
uni-app连接EventSource
前言 uniapp默认是不支持event-source,这里是借助renderjs进行SSE连接 正文 引入event-source-polyfill 这里演示的是直接将代码下载到本地进行引入 下载地址 把里面的eventsource.min.js文件放到项目中的static文件夹 项目封装event-source.vue组件 <templ…...
Spring Boot 实战:轻松实现文件上传与下载功能
目录 一、引言 二、Spring Boot 文件上传基础 (一)依赖引入 (二)配置文件设置 (三)文件上传接口编写 (一)文件类型限制 (二)文件大小验证 ࿰…...
火狐浏览器Firefox一些配置
没想到还会开这个…都是Ubuntu的错 一些个人习惯吧 标签页设置 常规-标签页 1.按最近使用顺序切换标签页 2.打开新标签而非新窗口(讨厌好多窗口) 3.打开新链接不直接切换过去(很打断思路诶) 4.关闭多个标签页时不向我确认 启动…...
[STM32 HAL库]串口中断编程思路
一、前言 最近在准备蓝桥杯比赛(嵌入式赛道),研究了以下串口空闲中断DMA接收不定长的数据,感觉这个方法的接收效率很高,十分好用。方法配置都成功了,但是有一个点需要进行考虑,就是一般我们需要…...
C++入门 详细版
欢迎来到干货小仓库!! 一分耕耘一分收获,离自己的目标越来越近。 passion!passion!!passion!!! 1.命名空间 由于C语言无法避免名字或者函数重复等问题,当有多…...
MIAOYUN信创云原生项目亮相西部“中试”生态对接活动
近日,以“构建‘中试’生态,赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节,成都元来云志科技有限…...
网络编程 | UDP组播通信
1、什么是组播 在上一篇博客中,对UDP的广播通信进行了由浅入深的总结梳理,本文继续对UDP的知识体系进行探讨,旨在将UDP的组播通信由浅入深的讲解清楚。 组播是介于单播与广播之间,在一个局域网内,将某些主机添加到组中…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
