Typescript中的类
readonly为只读属性,不能对其进行修改.static为静态属性,只能通过类的属性去访问,不能通过实例的属性去访问.
class Person {
readonly name:string = '孙悟空';
static age:number = 10;
info(){
}
}
const per = new Person()
console.log(per.info)
console.log(Person.age)
console.log(per.name)
class info{
name = '猪八戒';
age=10;
static sayHello(){
console.log('hello 大家好!!!!!!!!!!!')
}
}
const per2 = new info()
per2.sayHello()
info.sayHello()
constructor构造函数,对象创建时调用
class Person2{
name:string;
age:number;
constructor(name:string,age:number){
this.name = name
this.age = age
console.log('constructor被调用了.')
};
bark(){
console.log('玩哇哇哇!')
}
}
const pe = new Person2('旺财',10)
const pe2 = new Person2('小花',10)
const pe3 = new Person2('哈普',5)
const pe4 = new Person2('宙斯',6)
console.log(pe.bark())
console.log(pe2)
console.log(pe3.bark())
console.log(pe4)
继承:子类继承父类的属性和方法. 子类可以对父类的方法进行重写并且可以添加新的方法.
super:调用父类的构造函数和方法.
class Animal{
name:string;
age:number;
constructor(name:string,age:number){
this.name = name
this.age = age
};
sayHello(){
console.log('动物在叫!!')
};
run(){
console.log('动物再跑!')
}
}
class Dog extends Animal{
sayHello(){
console.log('汪汪汪!!')
};
run(){
console.log(`${this.name}再跑!`)
}
}
class Cat extends Animal{
sayHello(){
console.log('喵喵喵!!')
}
}
const dog = new Dog('旺财',5)
console.log(dog)
dog.sayHello()
dog.run()
const cat = new Cat('咪咪',3)
console.log(cat)
cat.sayHello()
class Dog1 extends Animal{
sex:string;
constructor(name:string,age:number,sex:string){
super(name,age)
this.sex = sex
};
sayHello(){
super.sayHello();
super.run();
console.log(`${this.name}再叫!`);
}
}
const dog1 = new Dog1('旺财',5,'male')
console.log(dog1)
dog1.sayHello()
abstract: 定义抽象类
抽象类: 抽象类不能实例化
抽象方法: 子类必须对抽象方法进行重写
abstract class Animal2{
name:string;
constructor(name:string){
this.name = name
};
abstract sayHello():void;
}
class Dog2 extends Animal2{
sayHello(){
console.log('汪汪汪')
}
}
class Cat2 extends Animal2{
sayHello(){
console.log('喵喵喵!!')
}
}
接口
type myType = {
name:string,
age:number
}
interface myInstance{
name:string;
age:number
}
interface myInstance{
gender:String
}
const obj:myInstance={
name:'梨花',
age:10,
gender:'女'
}
interface myInter{
name:string;
sayHello():void;
}
class myClass implements myInter{
name:string;
constructor(name:string){
this.name = name
};
sayHello(){
}
}
public private protected
public 修饰的属性可以在任意位置(包括子类)访问(修改) 默认值
private 私有属性,私有属性只能在类的内部进行访问(修改)
protected 受保护的属性,只能在类和其子类中访问
class Person{
protected name:string;
public age:number;
constructor(name:string,age:number){
this.name = name
this.age = age
}
}
const per = new Person('孙悟空',18)
console.log(per)
per.age = -10
console.log(per)
class A extends Person{
test(){
console.log(this.name)
}
}
const a = new A('李白',20)
a.test()
class Person{
private _name:string;
private _age:number;
constructor(name:string,age:number){
this._name = name
this._age = age
}
get name(){
return this._name
}
set name(val:string){
this._name = val
}
get age(){
return this._age
}
set age(val:number){
if(val>=0){
this._age = val
}
}
}
const per = new Person('孙悟空',18)
console.log(per)
per.name = '猪八戒'
per.age = 5
per.age = -10
console.log(per)
简写方式 C1和C2类等价
class C1{
name:string;
age:number;
constructor(name:string,age:number){
this.name = name
this.age = age
}
}
class C2{
constructor(public name:string,public age:number){}
}
泛型 在定义函数或类时.如果遇到类型不明确就可以使用泛型.
function fn(a:any):any{
return a
}
function fn1<T>(a: T): T{
return a
}
let f1 = fn1(10)
let f2 = fn1<string>('hello')
function fn2<T,K>(a:T,b:K):T{
console.log(b)
return a
}
let f3 = fn2<number,string>(123,'hello')
interface Inter {
length:number
}
function fn3<T extends Inter>(a: T):T{
return a
}
class MyClass<T>{
name:T;
constructor(name:T){
this.name = name
}
}
const per = new MyClass<string>('孙悟空')
console.log(per)