开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
一、只读属性
一个属性不希望外界更改,只希望确定值后直接使用
class Person {
readonly name: string
age: number
constructor(name: string, age: number) {
this.name = name
this.age = age
}
}
const p = new Person("name", 21)
p.name = "name2"// 报错
二、setter/getter
私有属性前面加_,给私有属性设置setter/getter
class Person {
private _name: string
constructor(name: string) {
this._name = name
}
running() {
console.log("running", this._name)
}
set name(newValue: string) {
this._name = newValue
}
get name() {
return this._name
}
}
const p = new Person("name")
p.name = "newName"
三、参数属性的使用(语法糖)
class Person {
constructor(public name: string, private age: number, readonly height: number) {
}
running() {
console.log(this.age)
}
}
四、抽象类和方法使用
abstract class Shape {
// getArea方法只有声明没有实现体
// 实现让子类自己实现
// 可以将getArea方法定义为抽象方法: 在方法的前面加abstract
// 抽象方法必须出现在抽象类中, 类前面也需要加abstract
abstract getArea()
}
class Rectangle extends Shape {
constructor(public width: number, public height: number) {
super()
}
getArea() {
return this.width * this.height
}
}
class Circle extends Shape {
constructor(public radius: number) {
super()
}
getArea() {
return this.radius ** 2 * Math.PI
}
}
// 通用的函数
function calcArea(shape: Shape) {
return shape.getArea()
}
calcArea(new Rectangle(10, 20))
calcArea(new Circle(5))
五、接口中类的实现
interface IKun {
name: string
age: number
slogan: string
playBasketball: () => void
}
interface IRun {
running: () => void
}
const ikun: IKun = {
name: "why",
age: 18,
slogan: "你干嘛!",
playBasketball: function() {}
}
// 作用: 接口被类实现
class Person implements IKun, IRun {
name: string
age: number
slogan: string
playBasketball() {
}
running() {
}
}
const ikun2 = new Person()
const ikun3 = new Person()
const ikun4 = new Person()
console.log(ikun2.name, ikun2.age, ikun2.slogan)
ikun2.playBasketball()
ikun2.running()