一、接口

  1. 接口就是一套规范,当很多的类型具备相同的特征或者属性时,我们可以将这些特征和属性单独抽离成一个接口,
  2. 让这些类对这个接口(规范)进行实现
  1. class Dog{
  2. eat(){
  3. console.log("骨头");
  4. }
  5. run(){
  6. console.log("狗跑");
  7. }
  8. }
  9. class Cat{
  10. eat(){
  11. console.log("鱼");
  12. }
  13. run(){
  14. console.log("猫跑");
  15. }
  16. }
  17. //只要是动物类都要实现eat()和run()方法

1-1 类类型接口

  1. interface Animal{
  2. eat():void;
  3. run():void;
  4. }
  5. /* 接口就是一套规范,当很多的类型具备相同的特征或者属性时,我们可以将这些特征和属性单独抽离成一个接口,
  6. 让这些类对这个接口(规范)进行实现
  7. */
  8. class Dog implements Animal{
  9. eat():void{
  10. console.log("骨头");
  11. }
  12. run():void{
  13. console.log("狗跑");
  14. }
  15. }
  16. class Cat implements Animal{
  17. eat():void{
  18. console.log("鱼");
  19. }
  20. run():void{
  21. console.log("猫跑");
  22. }
  23. }
  24. /* 1、那么一个类实现某个接口之后,必须对接口中的属性和方法进行重写 */

1-2 属性接口

  1. interface Params {
  2. url: string,
  3. method: string,
  4. data?: Object //?可传可不传
  5. }
  6. /* 属性接口:对方法的参数的约束 */
  7. /* function http (obj:{url:string,method:string}):void{
  8. console.log(obj);
  9. }
  10. http({url:"top250",method:"get"}) */
  11. function http(d: Params): void {
  12. console.log(d);
  13. }
  14. http({
  15. url: "top250",
  16. method: "get",
  17. })
  18. http({
  19. url:"login",
  20. method:"post",
  21. data:{
  22. usename:"lisi",
  23. pwd:123
  24. }
  25. })

1-3 函数类型接口

  1. interface encrypt{
  2. /* 设置函数的参数和返回值的类型 */
  3. (key:string,value:string):string
  4. }
  5. var md:encrypt = function(key:string,value:string):string{
  6. return key+value
  7. }
  8. console.log(md("key","lisi"));

1-4 接口的继承

  1. class Animal{
  2. name:string;
  3. age:number;
  4. }
  5. interface Dog extends Animal{
  6. eat(str:string):void
  7. }
  8. class WolfDog implements Dog{
  9. name:string;
  10. age:number;
  11. eat(str:string):void{
  12. console.log(str);
  13. }
  14. constructor(name:string,age:number){
  15. this.name = name;
  16. this.age = age;
  17. }
  18. }
  19. var w:WolfDog = new WolfDog("狗",8)

二、泛型

  1. /* 泛型:任意类型 */
  2. var str:any = "hello";
  3. str = 2021;
  4. /* 劣势:放弃了类型检查 */
  5. /* 既要任意类型又要类型检查 */
  6. // 1、有类型检查,只能放置特定数据类型
  7. function getData(msg:string){
  8. console.log(msg);
  9. }
  10. // 2、可以传入任意类型,但没有类型检查
  11. function test(msg:any){
  12. console.log(msg);
  13. }

2-1 设置泛型

  1. /* 泛型好处:既有类型检查又可以传入任意类型 */
  2. function getMsg<T>(msg:T){
  3. console.log(msg);
  4. }
  5. getMsg<string>("hello")
  6. getMsg<Number>(2021)

2-2 泛型函数

  1. function getStr<T>(msg:T){
  2. console.log(msg);
  3. }
  4. getStr<string>("hello");
  5. getStr<object>({name:"lisi"});

2-3 约束泛型

  1. function echoWithArr<T>(arg:T []){
  2. console.log(arg);
  3. }
  4. echoWithArr<string>(["html"]);
  5. echoWithArr<number>([1234]);
  6. /* 约束泛型:使用接口对泛型进行了拓展 */
  7. interface len{
  8. length:number;
  9. }
  10. function getLength<T extends len>(arg:T){
  11. console.log(arg.length);
  12. }
  13. getLength<string>("hello");
  14. getLength({length:10});
  15. getLength<Array<number>>([1,2,3]);

2-4 泛型类

  1. class NumList<T>{
  2. public list:Array<T> = [];
  3. add(val:T){
  4. this.list.push(val);
  5. }
  6. }
  7. var nums = new NumList<number>();
  8. nums.add(1);
  9. nums.add(2);
  10. console.log(nums);
  11. var strs = new NumList<string>();
  12. strs.add("html")
  13. strs.add("css");
  14. console.log(strs);

2-5 泛型接口

A 对象类型接口

  1. interface attrs<T,U>{
  2. name:T,
  3. age:U
  4. }
  5. var obj:attrs<string,number> = {name:"lisi",age:10}