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

TypeScript基础语法使用参考

基础类型

// 基本类型(与js一致)letname:string='Alice'letage:number=25letisActive:boolean=trueletnothing:null=nullletnotDefined:undefined=undefinedletsym:symbol=Symbol('id')letbig:bigint=9007199254740991n// 数组letnumbers:number[]=[1,2,3]letstrings:Array<string>=['a','b']// 元组lettuple:[string,number]=['hello',42]// 对象letperson:{name:string;age:number}={name:'Bob',age:30}// any(尽量避免使用)letrandom:any='could be anything'// unknown(安全的 any)letuncertain:unknown='maybe string'if(typeofuncertain==='string'){console.log(uncertain.toUpperCase())}// void(无返回值)functionlogMessage(msg:string):void{console.log(msg)}// never(永远不会返回)functionthrowError(msg:string):never{thrownewError(msg)}

类型断言与守卫

// 类型断言letsomeValue:unknown='hello world'letstrLength1:number=(someValueasstring).lengthletstrLength2:number=(<string>someValue).length// 非空断言letelement:HTMLElement|null=document.getElementById('app')element!.style.display='block'// 确信不为 null// typeof 守卫(类/对象)functionprocessValue(value:string|number){if(typeofvalue==='string'){returnvalue.toUpperCase()}returnvalue.toFixed(2)}// instanceof 守卫(类/对象)functionhandleError(error:Error|string){if(errorinstanceofError){console.log(error.message)}else{console.log(error)}}// in 守卫(属性检查)interfaceCat{meow():void}interfaceDog{bark():void}functionmakeSound(animal:Cat|Dog){if('meow'inanimal){animal.meow()}else{animal.bark()}}

类 (Class)

// 访问修饰符classAnimal{publicname:string// 任何地方可访问privateage:number// 仅类内部protectedspecies:string// 类内部和子类constructor(name:string,age:number){this.name=namethis.age=agethis.species='unknown'}// 方法publicspeak():void{console.log(`${this.name}makes a sound`)}// 私有方法privategetAge():number{returnthis.age}}// 继承classDogextendsAnimal{constructor(name:string,age:number){super(name,age)this.species='canine'// protected 可访问// this.age // Error: private 不可访问}speak():void{console.log(`${this.name}barks`)}}// 抽象类abstractclassShape{abstractgetArea():number// 抽象方法getDescription():string{return`Area:${this.getArea()}`}}classCircleextendsShape{constructor(privateradius:number){super()}getArea():number{returnMath.PI*this.radius**2}}// 实现接口interfaceFlyable{fly():void}classBirdextendsAnimalimplementsFlyable{fly():void{console.log(`${this.name}is flying`)}}

接口 (Interface)

// 基础接口interfaceUser{id:numbername:stringemail:stringage?:number// 可选属性readonlycreatedAt:Date// 只读属性}// 方法定义interfaceGreetable{greet(name:string):voidsayHi:(msg:string)=>void}// 继承接口interfaceAdminextendsUser{permissions:string[]}// 索引签名interfaceStringMap{[key:string]:string}// 使用constuser:User={id:1,name:'John',email:'john@example.com',createdAt:newDate()}

类型别名 (Type)

// 联合类型typeStatus='pending'|'success'|'error'typeID=string|number// 交叉类型typeEmployee=User&{department:string}// 工具类型typePartialUser=Partial<User>// 所有属性可选typeRequiredUser=Required<User>// 所有属性必填typeReadonlyUser=Readonly<User>// 所有属性只读typeUserName=Pick<User,'name'|'id'>// 选取部分属性typeUserWithoutEmail=Omit<User,'email'>// 排除属性// 使用letstatus:Status='pending'

函数

// 函数类型声明typeAddFn=(a:number,b:number)=>number// 函数实现constadd:AddFn=(a,b)=>a+b// 泛型函数functionidentity<T>(value:T):T{returnvalue}// 多泛型functionmerge<T,U>(obj1:T,obj2:U):T&U{return{...obj1,...obj2}}// 参数默认值functiongreet(name:string='Guest'):string{return`Hello,${name}`}// 剩余参数functionsum(...numbers:number[]):number{returnnumbers.reduce((a,b)=>a+b,0)}// 重载functionprocess(value:string):stringfunctionprocess(value:number):numberfunctionprocess(value:string|number):string|number{if(typeofvalue==='string')returnvalue.toUpperCase()returnvalue*2}

泛型

// 泛型接口interfaceApiResponse<T>{data:Tstatus:numbermessage:string}// 泛型类classBox<T>{privatecontent:Tconstructor(value:T){this.content=value}getValue():T{returnthis.content}setValue(value:T):void{this.content=value}}// 泛型约束interfaceHasLength{length:number}functionlogLength<TextendsHasLength>(item:T):T{console.log(item.length)returnitem}// keyof 约束functiongetProperty<T,KextendskeyofT>(obj:T,key:K):T[K]{returnobj[key]}
http://www.cnnetsun.cn/news/1915387.html

相关文章:

  • 你还在用tag管理Qwen-VL和InternVL?这5个未公开的版本管理反模式,正悄悄吞噬你的多模态推理稳定性(含真实SLO跌落日志截图)
  • League Akari:英雄联盟玩家的智能助手,三大核心功能提升游戏体验
  • ThinkPad风扇控制终极方案:TPFanCtrl2让你的笔记本告别噪音与过热
  • AI时代工程师的超级进化论
  • 从图形化到命令行:一次 SVN 工程化能力补齐与流程治理实践(Windows)
  • 15分钟掌握libIEC61850:电力自动化通信的标准化解决方案
  • STM32内存管理全解析:从map文件看堆、栈、bss段的内存分配机制
  • 三阶跃迁:ChemBERTa如何用Transformer架构重塑药物研发范式
  • 10. C++17新特性-保证的拷贝消除 (Guaranteed Copy Elision / RVO)
  • AUTOSAR从入门到精通-【自动驾驶】自动驾驶激光雷达点云畸变的成因与解决方案
  • Electron终端中文乱码终结者:动态编码检测与转换实战
  • 零基础复盘:从命令行运行 Python 文件失败到成功,我踩过的 5 个坑
  • AI地铁轻轨门控系统功率MOSFET选型方案——高可靠、快速响应与长寿命驱动系统设计指南
  • etcdserver: mvcc: database space exceeded
  • 赣州二手车评估
  • 迁移学习实战:如何用预训练ResNet在小型LFW子集上达到90%+准确率
  • 便携式综合气象观测仪
  • 11. C++17新特性-更严格的表达式求值顺序
  • 为什么Redis的KEYS命令在生产环境是禁止使用的?
  • 你的FOC电流环总调不好?可能是运放基准电压惹的祸(从ADC值2048说起)
  • 错过SITS2026等于错过未来2年XAI标准?这6个已被主流框架(Llama-3-Vision、Qwen-VL、Fuyu-8B)采纳的解释协议必须立刻掌握
  • 机器学习之方差和标准差计算
  • 如何在微控制器上用纯 Python 替代 NumPy 实现颜色渐变计算
  • Go 中使用 go-json-rest 时调用 Write 方法的正确方式
  • 计算机毕业设计:Python全国降水数据采集与预警平台 Flask框架 数据分析 可视化 大数据 AI 大模型 爬虫 数据大屏(建议收藏)✅
  • 高精度加减
  • 朱雀AI检测率高怎么降?嘎嘎降AI实操攻略分享
  • uv提供的cpython高版本已经解决了matplotlib无法显示图形问题
  • Batch Normalization在VAE中的花式用法:从防梯度消失到解决posterior collapse的完整指南
  • 告别裸机思维:在IMX6ULL上,用设备树重构你的第一个Linux按键驱动