[TypeScript学习笔记-03]常用类型解读

发布时间:2026/10/5 17:22:22

[TypeScript学习笔记-03]常用类型解读 1. 三种原生类型primitivesJavaScript 中有三种非常常用的基本类型字符串、数字和布尔值。每种类型在 TypeScript 中都有对应的类型。正如你所预料的如果你对这些类型的值使用 JavaScript 的typeof运算符你会看到相同的名称string表示字符串值例如“Hello, world”number表示数字例如 42。JavaScript 没有专门的运行时整数值因此没有与int或float等效的整数类型——所有类型都只是numberboolean表示true和false这两个值。2. 数组Array两种表示方法T[]:number[]、string[]和boolean[]等ArrayT:Arraynumber、Arraystring和Arrayboolean等。3. any当你不希望某个特定值导致类型检查错误时可以使用它。当一个值的类型为any时你可以访问它的任何属性这些属性本身也是any类型像调用函数一样调用它将其赋值给或从任何类型的值或者几乎做任何其他语法上合法的事情。当您不指定类型且 TypeScript 无法从上下文中推断类型时编译器通常会默认使用 any 类型。不过通常你应该避免这种情况因为any不会进行类型检查。使用编译器标志--noImplicitAny可以将任何隐式的any标记为错误。4. 函数Function参数类型标注functiongreet(name:string){console.log(Hello, name.toUpperCase()!!);}返回类型标注functiongetFavoriteNumber():number{return26;}注:与变量类型注解类似通常不需要返回值类型注解因为 TypeScript 会根据函数的返回语句推断其返回类型。上面示例中的类型注解不会改变任何内容。有些代码库会出于文档编写、防止意外更改或个人偏好等目的显式指定返回值类型。异步函数asyncfunctiongetFavoriteNumber():Promisenumber{return26;}匿名函数constnames[Alice,Bob,Eve];// Contextual typing for function - parameter s inferred to have type stringnames.forEach(function(s){console.log(s.toUpperCase());});// Contextual typing also applies to arrow functionsnames.forEach((s){console.log(s.toUpperCase());});注即使参数s没有类型注解TypeScript 也使用了forEach函数的类型以及数组的推断类型来确定s的类型。这个过程被称为上下文类型化因为函数发生的上下文决定了它应该是什么类型。5. 对象Object对象指的是任何带有属性的 JavaScript 值几乎涵盖了所有 JavaScript 值要定义一个对象类型我们只需列出它的属性及其类型即可。functionprintCoord(pt:{x:number;y:number}){console.log(The coordinates x value is pt.x);console.log(The coordinates y value is pt.y);}printCoord({x:3,y:7});可缺省参数functionprintName(obj:{first:string;last?:string}){// Error - might crash if obj.last wasnt provided!console.log(obj.last.toUpperCase());// obj.last is possibly undefined.if(obj.last!undefined){console.log(obj.last.toUpperCase());}console.log(obj.last?.toUpperCase());}5. 联合Union联合类型是由两个或多个其他类型组成的类型它表示的值可以是其中任何一个类型。我们将这些类型分别称为联合体的成员。从集合角度来将就是取并集。functionprintId(id:number|string){console.log(Your ID is: id);}// OKprintId(101);// OKprintId(202);// ErrorprintId({myID:22342});TypeScript 只允许对联合体中的每个成员都有效的操作(联合类型的交集成员)执行。例如如果你有一个联合体string | number你就不能使用仅适用于字符串的方法。functionprintId(id:number|string){console.log(id.toUpperCase());//Property toUpperCase does not exist on type string | number.//Property toUpperCase does not exist on type number.}functiongetFirstThree(x:number[]|string){returnx.slice(0,3);}使用其它成员需要采用相应的Type Narrowing手段可以使用typeof对联合类型实施 Type NarrowingfunctionprintId(id:number|string){if(typeofidstring){// In this branch, id is of type stringconsole.log(id.toUpperCase());}else{// Here, id is of type numberconsole.log(id);}}可以使用Array.isArray对联合类型实施Type NarrowingfunctionwelcomePeople(x:string[]|string){if(Array.isArray(x)){// Here: x is string[]console.log(Hello, x.join( and ));}else{// Here: x is stringconsole.log(Welcome lone traveler x);}}6. 类型别名Alias经常需要多次使用同一种类型并用同一个名称来指代它。typePoint{x:number;y:number;};typeIDnumber|string;注别名仅仅是别名—不能使用类型别名来创建同一类型的不同版本。使用别名时其作用与直接编写别名类型完全相同。7. 接口接口声明是命名对象类型的另一种方式interfacePoint{x:number;y:number;}接口扩展与别名扩展interfaceAnimal{name:string;}interfaceBearextendsAnimal{honey:boolean;}typeAnimal{name:string;}typeBearAnimal{honey:boolean;}注从集合的角度来讲看起来实在拓展成员本质上在执行交集操作。可以直接向现有接口添加成员interfaceWindow{title:string;}interfaceWindow{ts:TypeScriptAPI;}8. 类型断言Type Assertion有时你会获得一些关于值类型的信息而 TypeScript 却无法知道这些信息。在这种情况下您可以使用类型断言来指定更具体的类型constmyCanvasdocument.getElementById(main_canvas)asHTMLCanvasElement;constmyCanvasHTMLCanvasElementdocument.getElementById(main_canvas);只允许类型断言转换为更具体或更不具体的类型版本。这条规则可以防止诸如以下不可能的类型强制转换constxhelloasnumber;//Conversion of type string to type number may be a mistake because neither type sufficiently overlaps with the other.// If this was intentional, convert the expression to unknown first.解决方案constaexprasanyasT;9. 字面量类型Literal 一种理解方式是考虑 JavaScript 如何声明变量。var和let都允许更改变量内部存储的内容而const则不允许。这体现在 TypeScript 如何为字面量创建类型上。letchangingStringHello World;// let changingString: stringconstconstantStringHello World;// const constantString: Hello World将字面量视为一种具有固定值的类型那么letx:hellohello;// OKxhello;// ...xhowdy;//Type howdy is not assignable to type hello.针对字面量类型的联合就好理解了可以视为枚举functionprintText(s:string,alignment:left|right|center){// ...}针对boolean类型的理解typebooleantrue|false当您使用对象初始化变量时TypeScript 会假定该对象的属性值之后可能会发生变化所以属性类型并不是字面量类型。constobj{counter:0};if(someCondition){obj.counter1;}所以不能使用非字面量类型属性成员为字面量类型参数赋值declarefunctionhandleRequest(url:string,method:GET|POST):void;constreq{url:https://example.com,method:GET};handleRequest(req.url,req.method);// Argument of type string is not assignable to parameter of type GET | POST.这个问题的两种解决方案解决方案1使用as将变量类型转换成更具体的字面量类型// Change 1:constreq{url:https://example.com,method:GETasGET};// Change 2handleRequest(req.url,req.methodasGET);解决方案2使用as将对象转换成const类型constreq{url:https://example.com,method:GET}asconst;handleRequest(req.url,req.method);as const 后缀的作用类似于 const但它是针对类型系统的确保所有属性都被赋予字面类型而不是像 string 或 number 这样的更通用的版本。10. null undefinedJavaScript 有两个原始值用于表示值缺失或未初始化null和undefined。TypeScript 中有两个同名的对应类型。这些类型的行为取决于你是否启用了--strictNullChecks选项。strictNullChecks off关闭--strictNullChecks后仍然可以正常访问可能为null或undefined的值并且可以将null和undefined值赋给任何类型的属性。这与没有空值检查的语言例如 C#、Java的行为类似。缺少对这些值的检查往往是导致 bug 的主要原因我们始终建议用户在代码库中条件允许的情况下启用strictNullChecks。strictNullChecks on启用strictNullChecks后当值为null或undefined时在使用该方法或属性之前需要先检查这些值是否为 null。就像在使用可选属性之前检查undefined一样我们可以使用范围缩小来检查可能为null的值functiondoSomething(x:string|null){if(xnull){// do nothing}else{console.log(Hello, x.toUpperCase());}}可以使用类似与C#的方式后缀。functionliveDangerously(x?:number|null){// No errorconsole.log(x!.toFixed());}11. SymbolJavaScript 的Symbol是一种独特的原始数据类型用来创建不可重复的唯一标识符常用于对象属性键以避免冲突。它既保证唯一性又能实现弱封装和信息隐藏。它具有如下特性唯一性每次调用Symbol()都会返回一个全新的、唯一的值类型typeof Symbol()返回 “symbol”不可用 newnew Symbol()会抛出TypeError只能直接调用Symbol()描述字符串可以传入一个字符串作为描述仅用于调试不影响唯一性。使用场景对象属性键避免与其他属性冲突且不会被常规枚举方法如for...in、Object.keys访问。弱封装隐藏内部实现细节。全局共享 Symbol通过Symbol.for(key)和Symbol.keyFor(symbol)使用全局注册表。并能被枚举constpasswordSymbol(password);constaccount{user_id:alice,email:aliceexample.com,[password]:password}for(constkeyinaccount){console.log(${key})}//输出//user_id//email
延伸阅读

更多相关文章

2026/9/30 20:48:49

[TypeScript学习笔记-02]tsc:TypeScript编译器

tsc 是 TypeScript 的官方编译器,它的作用就是把 .ts 文件编译成标准的 .js 文件,供浏览器或 Node.js 执行。核心功能包括: 类型检查:在编译阶段发现类型错误,提升代码安全性。语法转换:把 TypeScript 特性…

2026/10/2 14:43:23

免费本地大模型:用 AnyLanguageModel 快速接入 Ollama

免费本地大模型:用 AnyLanguageModel 快速接入 Ollama 【免费下载链接】AnyLanguageModel An API-compatible, drop-in replacement for Apples Foundation Models framework with support for custom language model providers. 项目地址: https://gitcode.com/g…

2026/10/5 17:18:00

插件加载失败排查指南:从报错到激活链路全拆解

我发现一个很有意思的现象:最近搜 “plugins” 这个词的人,大多数不是来学概念的,而是带着一行报错来的:“failed to load plugins”、“harness failed to load plugins”、“2 entries did not activate”,再往后看还…

2026/10/5 17:18:00

AngularJS与SQL Server深度整合:双向绑定、安全加固与性能优化

今年年中接手了一个老系统的升级改造,前端是 AngularJS,后端数据层是 SQL Server。很多朋友一听 AngularJS 就觉得是过时技术,我一开始也有点犹豫,但真正把业务跑通之后,我开始理解为什么那么多企业还在用这套组合。市…

2026/10/5 17:18:00

深入理解JavaScript构造函数、原型链与new的底层原理

在 JavaScript 生态里待得越久,你会越发觉一个事实:很多人写业务代码极其熟练,组件、状态管理、性能优化都能侃侃而谈,但一碰到“构造函数、原型、原型链”这三个词就支支吾吾。我自己也是这么过来的,早年在电商项目里…

2026/10/5 17:18:00

骶骨腰痛脊椎分割数据集实战:三切面、标签与避坑指南

简介:面向医学图像分割研究者和算法工程师的骶骨腰痛脊椎分割数据集,涵盖轴位面、冠状面、矢状面三个切面,共5个类别,并提供类别说明文件与可视化脚本。图像统一为512512尺寸,采用医学影像常用窗宽窗位增强处理&#x…

2026/10/5 17:18:00

JavaWeb学生成绩管理系统高分项目实战:从报错到交付

简介:本资源是一套完整、高分通过的JavaWeb学生成绩管理系统项目源码,专为计算机及相关专业学生设计,适用于课程设计、期末大作业与项目实战训练。系统涵盖学生、教师、课程、成绩等核心模块,采用JSPServletMySQL技术栈&#xff0…

2026/10/5 17:12:59

MFAC六大仿真案例:伪偏导数与动态线性化全解析

做控制方向的人应该都有过这种经历:定了MFAC(无模型自适应控制)的课题,翻开文献满眼都是伪偏导数、动态线性化、CFDL、PFDL这类概念,脑子里知道大概意思,但想真正跑一个能用的仿真程序,翻遍各种…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/4 0:01:02

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/4 1:01:05

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑