在JavaScript中并没有出现接口的概念,但这个是TypeScript核心原则之一的设计,在TypeScript中,接口就是为代码定义类型,约定契约关系
基础用法:
const sum = ({x, y}: {x: number, y: number}): number => {return x + y;}
以上的写法中约定了,我们x、y必须为number类型,而且返回值也必须要number类型,这样写是完全没有问题的,但是当对象的属性较多时,我们的代码就不适合阅读了,所以我们可以使用接口进行简化:
interface ISum {x: number;y: number;}const sum = ({x, y}: ISum): number => {return x + y;}
可选属性:
接口中的属性不全是必须的。有些只是在某些条件下存在,或者根本不存在,这个时候就需要使用到可选属性
interface SquareConfig {color?: string;width?: number;}function createSquare(config: SquareConfig): {color: string; area: number} {let newSquare = {color: "white", area: 100};if (config.color) {newSquare.color = config.color;}if (config.width) {newSquare.area = config.width * config.width;}return newSquare;}let mySquare = createSquare({color: "black"});
带有可选属性的接口和普通定义的接口差不多,只是在可选属性名定义的后面加上一个?
可选属性的好处之一就是可以对可能存在的属性进行预设定,好处二就是可以捕获引用了不存在属性时的错误。
只读属性:
一些对象属性只能在刚刚创建的时候修改其值,我们可以在属性名前使用readonly来指定只读属性:
interface Point {readonly x: number;readonly y: number;}//可以通过赋值一个对象字面量来构造一个Point。 赋值后, x和y再也不能被改变了。let p1: Point = { x: 10, y: 20 };p1.x = 5; // error!
TypeScript具有ReadonlayArray
let a: number[] = [1, 2, 3, 4];let ro: ReadonlyArray<number> = a;ro[0] = 12; // error!ro.push(5); // error!ro.length = 100; // error!
那么到底是应该使用readonly还是使用const呢?如果是作为变量使用的话用const,如果作为属性使用则用readonly。
函数类型:
为了使用接口表示函数,需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义,参数列表里的每一个参数都需要名字和类型。
interface SearchFunc {(source: string, subString: string): boolean;}let mySearch: SearchFunc;// 对于函数类型的类型检查来说,函数的参数名不需要与接口里定义的名字相匹配。mySearch = function(src: string, sub: string) {let result = src.search(sub);return result > -1;}
