/*
类的继承
*/
class Animal {constructor(name,age){
this.name=name
this.age=age
}run(distance: number){
console.log(`Animal run ${distance}m`)}}
class Dog extends Animal {constructor(name,age,sex){super(name,age)//super继承原型属性的关键字,super必须放在最上面
this.sex = sex
}cry(){
console.log('wang! wang!')}run(){//重写方法:因为原型链是按照隐式原型查找的,找到Dog构造函数实例上的run方法后就会停止查找,不会再去找Animal构造函数实例上的run方法}}const dog = new Dog()
dog.cry()
dog.run(100)// 可以调用从父中继承得到的方法
多态
多态:父类定义一个方法不去实现,让继承他的子类去实现,每一个子类有不同的表现,多态也属于继承
class Futher {
public age: number;constructor(age: number){
this.age = age
}counts():void{
console.log(this.age)}}
class children1 extends Futher {constructor(age: number){super(age)}counts():void{/* 多态,重写方法不执行父类方法 */
console.log(this.age -1)}}
class children2 extends Futher {constructor(age: number){super(age)}counts():void{
console.log(this.age +1)}}
公共,私有与受保护的修饰符
默认为 public
在 TypeScript 里,成员都默认为 public,你也可以明确的将一个成员标记成 public
/*
抽象类
不能创建实例对象, 只有实现类才能创建实例
可以包含未实现的抽象方法
*/
abstract class Animal {
abstract cry()run(){
console.log('run()')}}
class Dog extends Animal {cry(){
console.log(' Dog cry()')}}const dog = new Dog()
dog.cry()
dog.run()
函数
在 TypeScript 里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方。
基本示例
和 JavaScript 一样,TypeScript 函数可以创建有名字的函数和匿名函数。你可以随意选择适合应用程序的方式,不论是定义一系列 API 函数还是只使用一次的函数。
通过下面的例子可以迅速回想起这两种 JavaScript 中的函数:
// 命名函数
function add(x, y){return x + y
}// 匿名函数
let myAdd =function(x, y){return x + y;}
函数类型
为函数定义类型
让我们为上面那个函数添加类型:
//参数X,Y为number类型,并且返回值也是number类型
function add(x: number, y: number): number {return x + y
}//参数X,Y为number类型,并且返回值也是number类型
let myAdd =function(x: number, y: number): number {return x + y
}
/*
函数重载: 函数名相同, 而形参不同的多个函数
需求: 我们有一个add函数,它可以接收2个string类型的参数进行拼接,也可以接收2个number类型的参数进行相加
*/// 重载函数声明
function add(x: string, y: string): string
function add(x: number, y: number): number
// 定义函数实现
function add(x: string | number, y: string | number): string | number {// 在实现上我们要注意严格判断两个参数的类型是否相等,而不能简单的写一个 x + yif(typeof x ==='string'&&typeof y ==='string'){return x + y
}elseif(typeof x ==='number'&&typeof y ==='number'){return x + y
}}
console.log(add(1,2))
console.log(add('a','b'))// console.log(add(1, 'a')) // error
泛型
指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定具体类型的一种特性
正常使用
function createArray(value: any, count: number): any[]{const arr: any[]=[]for(let index =0; index < count; index++){
arr.push(value)}return arr
}const arr1 =createArray(11,3)const arr2 =createArray('aa',3)
console.log(arr1[0].toFixed(), arr2[0].split(''))
function swap <K, V>(a: K, b: V):[K, V]{return[a, b]}const result = swap<string, number>('abc',123)
console.log(result[0].length, result[1].toFixed())
泛型接口
interface IbaseCRUD <T>{//data是一个数组,且数组的元素中必须含有 name 和age 属性
data: T[]//add是一个方法,且方法中的参数必须有name和age属性,可以没有返回值
add:(t: T)=>void//getById是一个方法,参数id必须为number类型,返回值中必须包含name和age属性
getById:(id: number)=> T
}
class User {//属性类型描述
id?: number;//id主键自增
name: string;//姓名
age: number;//年龄constructor(id:number,name:string, age:number){
this.id=id
this.name = name
this.age = age
}}
class UserCRUD implements IbaseCRUD <User>{
data: User[]=[]//参数user对象必须包括name和age对象,id属性不确定add(user: User):void{
console.log(user)
this.data.push(user)
console.log('保存user', user.id)}getById(id: number): User {return this.data.find(item => item.id===id)}}const userCRUD = new UserCRUD()
console.log(userCRUD)// console.log(userCRUD.name) //err 不存在name属性
userCRUD.add(new User(1,'tom',12))
userCRUD.add(new User(2,'tom2',13))
console.log(userCRUD.getById(1))
泛型类
class GenericNumber<T>{
zeroValue: T
add:(x: T, y: T)=> T
}
let myGenericNumber = new GenericNumber<number>()
myGenericNumber.zeroValue =0
myGenericNumber.add =function(x, y){return x + y
}
let myGenericString = new GenericNumber<string>()
myGenericString.zeroValue ='abc'
myGenericString.add =function(x, y){return x + y
}//string型
console.log(myGenericString.add(myGenericString.zeroValue,'test'))//number类型
console.log(myGenericNumber.add(myGenericNumber.zeroValue,12))
// Boolean Number 等都是对象,不是基础数据类型
let b: Boolean = new Boolean(1)
let n: Number = new Number(156465)
let s: String = new String('abc')
let d: Date = new Date()
let r: RegExp =/^1/
let e: Error = new Error('error message')//报错, bb是Boolean对象类型// let bb: boolean = new Boolean(2) // error
console.log(bb)
console.log(n)