-
类实现接口需要用implements关键字来实现,必须实现接口中所有的属性。但是如果类定义自己的属性,是不会报错的。
-
接口只能约束类的公有成员,对私有成员是不能约束的,接口约束类的构造函数,也会报错。
interface Human {
//new (name:string):void 不能约束构造函数!!
name:string;
eat():void;
}
// 继承
interface Man extends Human{
run():void
}
interface Child{
cry():void
}
// 接口继承class
interface Boy extends Man,Child{}
let boy:Boy ={
name:'',
eat(){},
run(){},
cry(){}
}
class Asian implements Human{
name:string
//private name:string //这种私有属性是不能在接口中继承的
constructor(name:string){
//constructor(public name:string){ //这样就不用在上面先声明了
this.name=name
}
eat(){}
sleep(){} // 新增的是不会报错的
}
-
typescript的类型检测原则,也是利用鸭子类型。 即当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。即原类型必须具备目标类型的必要属性。即成员少的兼容成员多的。 但是在接口对象中,是参数多的兼容参数少的。
-
交叉类型可以做对象的混入,联合类型可以时类型具有一定的不确定性。
-
关于面向对象: ts是支持面向对象的。它对js中的class进行了更好的扩展。面向对象的核心:
封装 继承 多态 抽象
- 一般的面向对象将公共的属性,方法放在一个类中(封装)通过
public
:实例和类以及继承的类都可以使用的属性(默认)、private
:只能被当前的类使用、protected
:不能给实例对象使用 三个修饰符来增强了 JS 中的类。 - 可以用extends对父类进行继承, 利用implement放置接口来限制类的属性和方法。
- 用abstract进行抽象,所谓抽象,只是对类进行一个定义,可以归为一个统称。 抽象类的方法必须被子类所实现,抽象的类是不能被实例出来的,但是可以被其他的类进行继承。
- 多态,抽象的方法被其他的子类继承时, 不同的子类有不同的操作(多种状态)。
- 一般的面向对象将公共的属性,方法放在一个类中(封装)通过
interface DogInterface{
run():void
}
interface CatInterface{
jump():void
}
// 联合类型 & 交叉类型 |
let pet: DogInterface & CatInterface = {
run()
jump()
}
通过索引类型来限制key
let obj = {
a: 1,
b: 2,
c:3
}
// keyof 可以遍历key值
function getValue<T,K extends keyof T>(obj:T,key:K[]){
return keys.map(item=> obj[key]) // 返回下标
}
console.log(getValue(obj,['a','b'])) // [1,2]
console.log(getValue(obj, ['e', 'f'])) // TS报错,因为不存在。
映射类型(预先定义的泛型接口):
ReadObj, Partial, Omit, PickObj 等被称为同态。只作用与Obj属性不会作用与其他属性
interface Obj{
a:string,
b:number,
c:boolean
}
// 只读的
type ReadObj = Readonly<Obj>
// 可选的
type PartialObj = Partial<Obj>
// 抽取子集
type PickObj = Pick<Obj, "a" | "b">
//将Obj作为value
type recordObj = record<"x"|"y", Obj>
条件类型: Exclude<T,U> NonNullable ,
Extract<T,U> 可以从T中抽取类型。
模块化导出
Node:
导出:module.exports = ...
导入:const c1 = require('../c')
ESComment:
导出:export default ... , 或者 export {},
导入:import {} as from ''
ts中的declare可以为外部变量提供声明,主要解决外部变量的问题。 例如我们写sdk的时候,可能用到平台的全局变量例如微信小程序中的 wx 这个全局变量。 我们可以直接在d.ts文件中声明。