ts基础入门d2
D1回顾
ts是超集、静态:在编译时便会代码检查
命令行编译:需先下载npm i -g typescript
然后 tsc hello.ts 会将ts文件生成js文件、tsc --init 是将ts转为js的配置文件、tsc --watch监视文件中所有ts的变化
属性加?代表可选可不选
类型
string number boolean null undefined symbol object(Array、function...)
any unknown never void tuple enum type interface
大写的Number、String是包装对象object
str2=new String('hello')
断言
不是类型转换,是明确类型
D2速成
常用类型
-
let a:any就不会推断a的类型了、且any可以赋值给任意类型的变量、可以调用其任何属性 -
let a:unknown当你不知道该变量的类型、unknown不能赋值给其他类型(除非加if或者断言)、不能调用其任何属性let x:stringx=a as stringx=<string> a
-
function demo():never{}限制函数不能顺利调用(死循环or不可正常运行完)never一把是ts自动推断出来的 -
function:void可以return undefined void类型:后续不可用返回值作后续任何事情(if判断之类)(undefined类型则可以) -
let a:objectobject类型是非原始类型,a可以存储非原始类型a={} //[1,2] function(){} new String("123")
-
let b:Objectb也可以存储原始类型 b=1 但b不能存null和undefined -
索引签名
let person:{
name:string,
age?:number
[key:string]:any}
person={
name:'tt',
age:18,
gender:'female'}
- 函数
let count:(a:number,b:number)=>number //=>这个剪头代表函数类型
count=function(a:number,b:number):number{ //js中的=>代表具体函数实现
return a+b
}
-
let arr2:Array<string>这个Array是泛型 -
元组 tuple不是关键字
let arr1:[string,number]规定类型和个数let arr2:[number,...string[]]后面的...string[]表示任意多个
-
enum 枚举
表示一组明确的可选址
enum Direction{Up,Down,Left,Right} //可以给成员设置初始值,Up=10...、若是字符串枚举,每个成员都要有字符串值,Up="Up"
fucntion changeDirection(data:Direction){
console.log(data)
}
changeDirection(Direction.Up)
数字枚举:自动递增
字符串枚举 Up='up'
常量枚举 const enum
-
type
能为任意类型创造别名
type Status=number | string联合类型
type Gender="男" | “女”联合类型
type Area={ height:number,width:number}
交叉类型 type1 & type2 -
特殊情况
type Func = ()=> void
const f1:Func =function(){
return 999} //type定义函数限制返回值为void 写函数时可以有返回值
- 类
class Person{
name:string
age:number
constructor(name:string,age:number){
this.name=name
this.age=age}
speak(){
}
}
class Student extends Person{ //继承
grade:string
constructor(name:string,age:number){
super(name,age)
this.grae=grade}
study()}
const s1=new Student('李',17)
s1.study()
简写后:
class Person{
constructor(public name:string,public age:number){}
getDetails(){
return `我叫${this.name}`
}
}
属性修饰符 protected类内部和子类可访问、private类内部,readonly只读(public readonly)
- 抽象类 无法被实例化,被继承时具体呈现(必须实现其中的抽象方法)
abstract class Package{
constructor(public weight:number){}
//抽象方法
abstract calculate():number
}
//继承类
class StandardPackage extends Package{
constructor(weight:number,public unitPrice:number){super(weight)}
calculate():number{
return this.weight*this.unitPrice;
}
}
const s1=new StandardPackage(10,5)
- 接口
定义结构的方式:只定义格式不能包含任何实现
interface IPerson{
name:string
age:number
speak(n:number):void
}
class Person implements IPerson{
constructor(public name:string,public age:number){}
speak(n:number):void{}
}
const p1= new Person('to',18)
p1.speak(4)
//如果不是定义类 而是定义对象
const person :IPerson ={
name:'11',
age:10
}
//函数接口
interface CountInterface{
(a:number,b:number):number;}
const count:CountInterface=(x,y)=>{
return x+y
}
//接口之间可以继承
//接口可自动合并 interface Iperson... interface Iperson...
interface和type
接口专注定义对象和类,支持继承合并
type定义类型别名、联合类型交叉类型
接口和抽象类
接口不能有任何代码实现、一个类可以继承多个接口,抽象类可以有抽象方法也可以有具体方法
泛型
function Log<T>(data:T){}
Log<number>(100)
Log<string>('hello')
泛型可以有多个
interface Iperson<T>{name:T}
泛型类
class Person<T>{}
类型声明文件
.d.ts 声明 为现有的js代码提供类型信息,使得ts能够在使用这些js库或模块时进行类型检查和提示
浙公网安备 33010602011771号