基础类型
// 基本类型(与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]}