类的类型
接口声明
在之前的文章中,我们了解到声明一个对象类型可以使用 type 关键字。对象还有另外一种声明方式,就是通过 interface 接口来声明。
1. 可选属性
接口中也可以定义可选属性,上述例子中的 friend 属性就是可选属性
2. 只读属性
索引类型
我们可能会遇到接口中不确定的属性名,类型,方法,这个时候可以使用索引类型。
函数类型
通过interface来定义对象中普通的属性和方法的,实际上它也可以用来定义函数类型
interface CalcFn { (n1: number, n2: number): number } function calc(num1: number, num2: number, calcFn: CalcFn) { return calcFn(num1, num2) } const add: CalcFn = (num1, num2) => { return num1 + num2 } calc(20, 30, add)
接口继承
接口和类一样都是可以集成的,但是一般类只允许单继承,接口是支持多继承的。
interface ISwim { swimming: () => void } interface IFly { flying: () => void } interface IAction extends ISwim, IFly { } const action: IAction = { swimming() { }, flying() { } }
接口实现
一般使用实用类实现我们的接口。通过implements实现接口
交叉类型
在开发中,通常会对对象类型进行交叉
interface和type区别
在开发中,我们是选择interface还是选择type来定义对象类型呢。
如果是定义非对象类型,通常推荐使用type。
- interface 可以重复的对某个接口来定义属性和方法;
- type定义的是别名,别名是不能重复的;
TypeScript枚举类型
枚举类型是为数不多的TypeScript特性有的特性之一,枚举其实就是将一组可能出现的值,一个个列举出来,定义在一个类型中,这个类型就是枚举类型
枚举允许开发者定义一组命名常量,常量可以是数字、字符串类型
enum Direction { LEFT = "LEFT", RIGHT = "RIGHT", TOP = "TOP", BOTTOM = "BOTTOM" } let name: string = "abc" let d: Direction = Direction.BOTTOM function turnDirection(direction: Direction) { console.log(direction) switch (direction) { case Direction.LEFT: console.log("改变角色的方向向左") break; case Direction.RIGHT: console.log("改变角色的方向向右") break; case Direction.TOP: console.log("改变角色的方向向上") break; case Direction.BOTTOM: console.log("改变角色的方向向下") break; default: const foo: never = direction; break; } } turnDirection(Direction.LEFT) turnDirection(Direction.RIGHT) turnDirection(Direction.TOP) turnDirection(Direction.BOTTOM)