尚硅谷TypeScript教程(李立超老师TS新课)

//////////////////////////////////////////////////////////////////////////////////////// 定义类
class person {
// 定义实例属性(需要new使用)
name: string = "小斌"
// 定义类属性通过static(静态属性) 通过person获取
static age: number = 18
// readonly只读不可以修改
readonly sex: string = "男"
// 静态只读
static readonly sex: string = "男"
// 定义方法
sayHellow() {
console.log("大家好")
}
}
const per = new person()
////////////////////////////////////////////////////////////////////////////////// this指向
class dog {
name: string
age: number
// 每次调用都会指向实例(构造函数的this)
constructor(name: string, age: number) {
this.name = name
this.age = age
console.log("构造函数执行了")
}
bark() {
console.log(this)
}
}
// const dog1 = new dog("小黑", 5)
// const dog2 = new dog("旺财", 4)
// dog2.bark()
// console.log(dog1, dog2)
//////////////////////////////////////////////////////////////////////////////////// class继承
;(function () {
// 两个类相同 出现重复代码 所以提取(就是继承 extends) all是父类(写上面) 其他子类 并且可以再子类追加
class all {
name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
bark() {
console.log("动物再叫")
}
}
// 狗类
class dog extends all {
// name: string
// age: number
// constructor(name: string, age: number) {
// this.name = name
// this.age = age
// }
// bark() {
// console.log("汪汪汪")
// }
}
//猫类
class cat extends all {
// name: string
// age: number
// constructor(name: string, age: number) {
// this.name = name
// this.age = age
// }
// bark() {
// console.log("瞄")
// }
//父也有bark 子也定义bark 会覆盖 称为(方法重写)
bark() {
console.log("瞄")
}
}
var DOG = new dog("旺财", 7)
var CAT = new cat("小米", 2)
// console.log(DOG, CAT)
// DOG.bark()
// CAT.bark()
})()
///////////////////////////////////////////////////////////////超类(也就是父类)super
;(function () {
// 人类
class people {
name: string
constructor(name: string) {
this.name = name
}
talk() {
console.log(`我是${this.name}`)
}
}
// 张三类
class zhangsan extends people {
// 方法重写
talk() {
// super 表示当前类的父级
// super.talk()
console.log("我才是张三")
}
//super应用 constructor函数因为父类定义 所以会重写,语法会错误,必须加上super()函数,父类constructor接收name所以也要传过去
//重写后需要两个参数所以传两个
age: number
constructor(name: string, age: number) {
super(name)
this.age = age
}
}
// 未重写constructor
// const zs = new zhangsan("张三")
// 重写constructor
const zs = new zhangsan("张三", 100)
// console.log(zs)
// zs.talk()
})()
////////////////////////////////////////////////////////////////////////////////////////////////抽象类abstract
;(function () {
// 汽车类(父)
//抽象类就是专门用来继承的 不能new,并且可以定义抽象方法 如didi()
abstract class car {
name: string
constructor(name: string) {
this.name = name
}
// 抽象方法 没有方法体 void定义类型空
//抽象方法必须定义在抽象类中,子类必须对抽象方法进行重写
abstract didi(): void
}
// 凯迪拉克(子)
class cadillac extends car {
// 抽象方法重写
didi() {
console.log(`我想买${this.name}`)
}
}
const cd = new cadillac("凯迪拉克")
console.log(cd)
cd.didi()
//使用父类(可以)---但是不想使用(只用来继承)用抽象类 abstract
// const che = new car("兰博") //无法使用抽像类
})()
//////////////////////////////////////////////////////////////////////////接口 interface
;(function () {
// 自定义声明类型
type myType = {
name: string
age: number
}
const obj: myType = {
name: "代",
age: 18,
}
//接口用来自定义一个类中可以包含哪些属性方法,同时接口可以当成声明类型使用
interface myInterface {
name: string
age: number
}
interface myInterface {
gender: string
}
//接口可以当成声明类型使用 两者合
const jiekou: myInterface = {
name: "代",
age: 18,
gender: "男",
}
// 区别:接口可以定义一个类中可以包含哪些属性方法(属性与方法都不能有实际的值--只是一个结构)
interface jiekou {
name: string
sayLove(): void
}
// 使用myClass类,实现接口jiekou,实现接口就是满足接口结构要求
class myClass implements jiekou {
name: string
constructor(name: string) {
this.name = name
}
sayLove() {
console.log(`我是${this.name}`)
}
}
const aa = new myClass("帅哥")
console.log(aa)
})()