Skip to content

抽象类

js
// readonly的在类中的用法
class Person {
    constructor(public readonly name: string) {}
}
let tom = new Person('tom')
// tom.name = 'chaos' // 报错,因为使用readonly关键字。(这点是跟存在get而不存在对应的set作用是一样的,readonly写起来简洁)

// 抽象类: 只能被继承,不能被实例化(abstract n.抽象)
abstract class Demo {
    name: string
    getName() {
        return this.name
    }
    abstract getAge(): number // 抽象方法,继承时子类必须自己实现一下
}
class Demo1 extends Demo{
    constructor(name: string) {
        super()
        this.name = name
    }
    // 实现抽象方法
    getAge() {
        return 18
    }
}

// let tom = new Demo1('tom')
// console.log(tom.getName())


// interface 的继承(抽象)

interface Person {
    name: string
}
// 【合二为一】
interface P1 extends Person{
    age: number
}

function fn(person: P1) {
    this.name = person.name
    this.age = person.age
    // this.sex = person.sex // 声明式对象就算传进来也没法用,还是会报错
}
let chaos = {name: 'chaos', age: 19}
fn(chaos)
let tom = {name: 'tom', age: 18, sex: 'man'}
fn(tom) // 声明式对象tom中sex属性多余,但是ts不报错
fn({name: 'tom', age: 18, sex: 'man'}) // 报错,传入非声明式对象时做了强校验,sex是多余的。