当前位置: 首页 > news >正文

typescript 中的类型推断

在 TypeScript 中,类型推断(Type Inference)是一种编译器自动确定变量或表达式类型的能力。这大大减少了需要显式声明类型的代码量,使得代码更加简洁和易读。TypeScript 的类型推断机制非常强大,可以在很多情况下自动推断出正确的类型。

以下是一些常见的类型推断场景:

1. 变量声明

当你声明一个变量并给它赋一个值时,TypeScript 会根据赋值的内容推断变量的类型。

let x = 10; // 推断为 number 类型
let name = "TypeScript"; // 推断为 string 类型
let isDone = true; // 推断为 boolean 类型

2. 数组

当你声明一个数组并给它赋值时,TypeScript 会根据数组元素的类型推断数组的类型。

let numbers = [1, 2, 3]; // 推断为 number[]
let fruits = ["apple", "banana", "cherry"]; // 推断为 string[]

3. 函数参数和返回值

TypeScript 也可以推断函数的参数和返回值的类型。

function add(a: number, b: number): number {return a + b;
}let sum = add(5, 3); // sum 被推断为 number 类型// 在没有显式类型注解的情况下,TypeScript 也能推断出参数和返回值的类型
function greet(name: string): string {return `Hello, ${name}!`;
}let message = greet("Alice"); // message 被推断为 string 类型

4. 对象字面量

当你声明一个对象字面量时,TypeScript 会根据对象的属性类型推断对象的类型。

let person = {name: "Alice",age: 30
};// person 被推断为 { name: string; age: number; }

5. 上下文类型推断

在某些情况下,TypeScript 会根据上下文(如函数参数的期望类型)来推断变量的类型。

function findElement(array: number[], predicate: (element: number) => boolean): number | undefined {for (let element of array) {if (predicate(element)) {return element;}}return undefined;
}let result = findElement([1, 2, 3, 4], (x) => x > 2); // x 被推断为 number 类型

6. letconst 的区别

在 TypeScript 中,letconst 的类型推断略有不同。对于 const,由于它声明的变量是不可变的,TypeScript 有时会进行更严格的类型推断。

let arr = []; // 推断为 any[]
const fixedArr = []; // 推断为 never[],因为没有指定元素类型,且不可变// 需要在声明时指定类型或添加元素来明确类型
const typedArr: number[] = [];
const inferredArr = [1, 2, 3]; // 推断为 number[]

7. 高级类型推断

在复杂的类型结构中,TypeScript 也能进行类型推断。例如,在泛型函数或类中。

function identity<T>(arg: T): T {return arg;
}let output = identity<string>("Hello"); // 输出被推断为 string 类型
let numOutput = identity(42); // 输出被推断为 number 类型

总结

TypeScript 的类型推断功能极大地减少了手动指定类型的需要,使得代码更加简洁和灵活。然而,有时候为了代码的清晰和可维护性,显式地指定类型也是一个好的实践。类型推断和显式类型注解可以结合使用,以达到最佳效果。

http://www.lryc.cn/news/466709.html

相关文章:

  • linux 隐藏文件
  • 【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)
  • 手表玻璃盖板视觉贴合
  • 电信和互联网行业数据安全评估师CCRC-DSA人才强基计划
  • MQTTnet 4.3.7.1207 (最新版)使用体验,做成在线客服聊天功能,实现Cefsharp的物联的功能(如远程打开新网址)
  • 将java项目jar包打包成exe服务
  • Django请求响应对象
  • DevExpress中文教程 - 如何在静态SSR模式下使用Blazor Drawer组件?
  • 商汤科技十周年公布新战略,将无缝集成算力、模型及应用
  • 【如何获取股票数据07】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股历史分时MA数据获取实例演示及接口API说明文档
  • Rust语法基础
  • AWS WAF实现API安全防护
  • vue将table转换为pdf导出
  • 20240818 字节跳动 笔试
  • 在Debian上安装向日葵
  • 13.2 Linux_网络编程_UNIX域套接字
  • 10.22 多进程间通信-共享内存、信号量集
  • 输入输出管理器的使用
  • windows连接linux服务器上的jupyter lab
  • golang生成并分析cpu prof文件
  • 【Python爬虫实战】XPath与lxml实现高效XML/HTML数据解析
  • 软件测试学习笔记丨Selenium学习笔记:元素定位与操作
  • 在 HTML 中,<input> 元素支持的事件汇总
  • vue3【实战】 渲染 md 文件(markdown语法 .md后缀的文件)
  • Sora高端制造业WordPress外贸主题
  • windows安装superset及各种问题解决
  • JMeter模拟并发请求
  • 【小趴菜前端实习日记5】
  • 如何通过谷歌外推占据搜索引擎首页?
  • jmeter学习(6)逻辑控制器