//class 也是一种类型
class Person{
age:number;//实例属性
gender:string;//类型推论使得gender类型为string,默认值是' 男'
//构造函数 不需要返回值,可通过this访问成员
constructor(age:number,gender:string){
this.age = age;
this.gender = gender;
}
}
const p = new Person(18,'男')//实例化,分配内存
console.log(p)
//子类继承父类
class Animal{
name:string
run(){
console.log("跑.")
}
walk(){
console.log("走.")
}
}
class Dog extends Animal{
bark(){
console.log("旺旺.")
}
}
const dog = new Dog()
dog.run()//继承父类的方法
dog.walk()//继承父类的方法
dog.bark()
//类的接口实现
interface Singable{
player:string//演唱曲目
sing():void
}
class Bird implements Singable{
player: string;
sing(): void {
console.log("鸟鸣.",this.player)
}
}
let bird = new Bird()
bird.player = "baba"
bird.sing()
//类的访问限制 public protected private
//readonly 只读属性,只能在构造函数使用 只可以修饰属性 不可修饰方法 不仅仅可以用在类中,接口也可以用,对象也可以用
class Tree{
name:string //默认 public,子类和父类都可以调用
protected age:number //protected,子类和父类内部可以调用
private name2:'野生树'
readonly color:string = '红色'//当只读类型没有指定类型但是有默认值的时候,类型是字面量类型
walk(){
//private 仅供当前类的内部可以使用
console.log(this.color,this.name2," 走。")
}
constructor(color:string){
this.color = color
}
}
class Pine extends Tree{
private name3:'松树'
info(){
console.log(this.name,"+",this.age)//public protected 子类的内部可以使用
}
run(){//private 当前类的内部可以使用
console.log(this.color,this.name3,"松树 跑。")
}
}
const tree1 = new Tree('黑')
const tree2 = new Pine('red')
//public 子类的外部可以使用,protected 子类的外部不可以使用
tree1.name
tree2.name
tree1.walk()
tree2.run()
//类型兼容性
/*
两种类型系统:结构化类型系统 标明类型系统
ts采用结构化类型系统,类型检查观察关注参数形状
*/
class Point{x:number;y:number}
class Point2D{x:number;y:number}
class Point3D{x:number;y:number;z:number}
interface IPoint2D{x:number;y:number}
interface IPoint3D{x:number;y:number;z:number}
const p1 :Point = new Point2D();
//没有报错,因为Point 和Point2D 属性个数和属性类型相同,标明类型系统会报错
const p2 :Point = new Point3D(); //参数少的兼容参数多的
//没有报错,因为Point 和Point3D 前两个属性个数和属性类型相同,标明类型系统会报错
const p3 :IPoint3D = new Point3D(); //接口和类兼容
//没有报错,因为IPoint3D 和Point3D 属性个数和属性类型相同,标明类型系统会报错
//函数兼容 相同位置的参数类型要相同(指基础类型)或兼容(对象类型)
type F1 = (a:number)=>void
type F2 = (a:number,b:number)=>void
let f1:F1;
let f2:F2;
// f2 = f1;//函数参数少的可以兼容函数参数多的 因为js中函数多的可以忽略
TS 学习第二天
于 2024-06-03 20:05:16 首次发布