Typescript的接口

接口的作用:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里面的实现细节,它只规定这批类必须提供某些方法,提供这些方法的类就可以满足实际需要。typescript中的接口类似于java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。

属性类接口

  1. // 对方法传入的参数进行约束
  2. // 传入的参数只能为字符串
  3. function printLabel(label:string):void {
  4. console.log(label);
  5. }
  6. // 传入的参数只能为规定格式的json串对象
  7. function printLabel(label:{label:string}):void {
  8. console.log('aaaa');
  9. }
  10. printLabel({label:'张三'});
  11. // 传入对象的约束
  12. // 定义接口
  13. interface FullName {
  14. firstName:string;
  15. secondName:string;
  16. }
  17. // 函数必须传入对象
  18. function printName(name:FullName) {
  19. console.log(name.firstName + "--" + name.secondName);
  20. }
  21. // 对象必须包含firstName和secondName
  22. var obj={
  23. age:20, // 此处多一个age也不影响,最后age不会被传进printName函数
  24. firstName:'张',
  25. secondName:'三'
  26. }
  27. printName(obj);
  28. // 直接写到函数参数中时,要求对象只能有firstName和secondName
  29. printName({
  30. firstName : '张',
  31. secondName : '三' // 如果再加上age属性就会报错
  32. })

可选属性:

  1. interface FullName {
  2. firstName?:string; // 属性名称后加问号.表示该属性为可选属性,可传也可不传
  3. secondName:string;
  4. }
  5. function getName(name:FullName):void {
  6. console.log(name);
  7. }
  8. // 可以不录入firstName
  9. getName({
  10. secondName:'secondName' ;
  11. });

示例程序1:使用Interface封装ajax

  1. // 定义ajax要传入的内容对象
  2. interface Config{
  3. type:string;
  4. url:string;
  5. data?:string;
  6. dataType:string;
  7. }
  8. // 定义ajax方法
  9. function ajax(config:Config):void{
  10. var xhr = new XMLHttpRequest();
  11. xhr.open(config.type,config.url, true);
  12. xhr.send(config.data);
  13. xhr.onreadystatechange = function() {
  14. if(xhr.readyState==4 && xhr.status==200) {
  15. console.log('成功');
  16. if(config.dataType == 'json') {
  17. console.log(JSON.parse(xhr.responseText));
  18. } else {
  19. console.log(xhr.responseText);
  20. }
  21. }
  22. }
  23. }
  24. // 调用
  25. ajax({
  26. type:'get',
  27. url:'http://www.baidu.com',
  28. dataType:'json'
  29. })

示例程序2:封装加密算法

  1. interface encrypt{
  2. (key:string, value:string):string;
  3. }
  4. var md5:encrypt = function(key:string,value:string):string{
  5. return key + value;
  6. }
  7. var sha1:encrypt = function(key:string, value:string):string{
  8. return key+'-----'+value;
  9. }
  10. console.log(md5('name','张三'));

只读属性:

  1. interface Point {
  2. // 作为变量用时使用const,作为属性用时使用readonly
  3. readonly x: number; // 只能在对象刚创建时修改其值
  4. readonly y: number;
  5. }
  6. // 使用ReadonlyArray<T>确保数组创建后不能被修改
  7. let a: number[] = [1, 2, 3, 4];
  8. let ro: ReadonlyArray<number> = a;
  9. // ro[0] = 1;会报错
  10. // 就算将整个ReadonlyArray赋值给一个普通数组也不可以,比如 a = ro;此时也会报错
  11. // 如果需要将ReadonlyArray赋值给一个普通数组,可以使用类型断言重写
  12. a = ro as number[];

可索引接口

对数组、json对象的约束

  1. // 对数组的约束
  2. // 约束对象的下标为数字,值为字符串,即数组对象
  3. interface UserArr{
  4. [index:number]:string
  5. }
  6. var arr:UserArr=['aaa', 'bbb'];
  7. console.log(arr[0]);
  8. // 对对象的约束
  9. // 约束对象的下标的字符串,即json对象
  10. interface UserObj {
  11. [index:string]:string
  12. }
  13. var obj:UserObj = {'name' : 'zhangsan', sex : '男'};

类类型接口

对类的约束

  1. interface Animal{
  2. name:string;
  3. eat(str:string):void;
  4. }
  5. class Dog implements Animal {
  6. name:string;
  7. constructor(name:string) {
  8. this.name = name;
  9. }
  10. // 接口中eat虽然有参数,但是实现类中的eat可以不传参数,最后调用时则也不能传参数
  11. // 但是如果接口eat无参数,则实现类中的eat也必须无参数
  12. eat():void{
  13. console.log(`${this.name}吃狗粮`);
  14. }
  15. }
  16. class Cat implements Animal {
  17. name:string;
  18. constructor(name:string) {
  19. this.name = name;
  20. }
  21. // 接口中eat虽然有参数,但是实现类中的eat可以不传参数,最后调用时则也不能传参数
  22. // 但是如果接口eat无参数,则实现类中的eat也必须无参数
  23. eat(food:string):void{
  24. console.log(`${this.name}吃${food}`);
  25. }
  26. }
  27. class Cat implements Animal {
  28. name:string;
  29. constructor(name:string) {
  30. this.name = name;
  31. }
  32. // 接口中eat虽然有参数,但是实现类中的eat可以不传参数,最后调用时则也不能传参数
  33. // 但是如果接口eat无参数,则实现类中的eat也必须无参数
  34. eat(food:string):void{
  35. console.log(`${this.name}吃${food}`);
  36. }
  37. }
  38. // Dog的eat方法没有加参数,则调用时候也不能带有参数
  39. var d = new Dog('小黑');
  40. d.eat();
  41. var c = new Cat('小花');
  42. c.eat('猫粮');

接口扩展

接口继承接口

  1. interface Animal {
  2. eat():void;
  3. }
  4. interface Person extends Animal {
  5. work():void;
  6. }
  7. class Programmer {
  8. name:string;
  9. constructor(name:string){
  10. this.name = name;
  11. }
  12. coding(code:string):void{
  13. console.log(`${this.name} write ${code}`);
  14. }
  15. }
  16. class Web extends Programmer implements Person {
  17. constructor(name:string) {
  18. super(name);
  19. }
  20. eat():void{
  21. console.log(`${this.name}喜欢吃馒头`);
  22. }
  23. work():void{
  24. console.log(`${this.name}在写代码`);
  25. }
  26. }
  27. var x = new Web('小李');
  28. x.work();
  29. x.coding('console.log');