typescript学习2.0

函数

  • 函数的关键点:参数、返回值、函数的作用、函数在什么地方调用

  • es5 定义的函数

function fn() {}

const fn1 = function() {}
  • ts 定义的函数
function fn():void {}

const fn1 = function():void {}
  • 函数传参

function fn(name:string, age:number):string {
  // console.log('我是 void ');
  return `${name}-${age}`;
}

// console.log('我是 void ');
// const fn1 = function(name, age):void {}

console.log(fn('刘建行', 18));
  • 可传参数(age?:number)
function fn(name:string, age?:number):string {
  // console.log('我是 void ');
  return `${name}-${age}`;
}

// console.log('我是 void ');
// const fn1 = function(name, age):void {}

console.log(fn('李四'));
  • 默认参数
// age = 18
function fn(name:string, age:number = 18, ...reset:any):string {
  console.log(reset);
  // console.log('我是 void ');
  return `${name}-${age}`;
}

// console.log('我是 void ');
// const fn1 = function(name, age):void {}

console.log(fn('李四'));
// console.log(fn('李四', 18, [1, 2, 3]));
  • 剩余参数
// reset
function fn(name:string, ...reset:any):string {
  console.log(reset);
  // console.log('我是 void ');
  return `${name}-${reset}`;
}

// console.log('我是 void ');
// const fn1 = function(name, age):void {}

// console.log(fn('李四'));
console.log(fn('李四', 18, [1, 2, 3]));
  • 重载
  • JavaScript本身是个动态语言。 JavaScript里函数根据传入不同的参数而返回不同类型的数据是很常见的。

function fn(msg: number): number;
function fn(msg: string): string;
function fn(msg: boolean): boolean;
function fn(msg: any): any { // 具体的执行函数,
  if(typeof msg == 'string') {
    return msg.split('').reverse().join('');
  } else if(typeof msg == 'number') {
    return Number(String(msg).split('').reverse().join(''));
  } else {
    return '错误';
  }
}

// 注意,function pickCard(x): any并不是重载列表的一部分,因此这里只有两个重载:一个是接收对象另一个接收数字。 以其它参数调用 pickCard会产生错误。
console.log(fn(123));
console.log(fn('abc'));

  • 继承

    • 组合继承 对象冒充+原型链
      • 对象冒充,只能继承构造函数里面的属性和方法。不能够继承到原型上的。
        // 类的三大特性: 封装 继承 多态
        // 在 es5 中函数首字母大写,我们称之为这是一个构造函数
        function Person() {
          this.name = '张三';
          this.age = 18;
      
          this.say = function() {
            console.log(this.name + '说');
          }
        }
      
        // 原型
        Person.prototype.eat = function() {
          console.log('我的名字是' + this.name);
        }
      
        // call改变 this 指向 bind, apply
        // 这三个什么区别
        // bind 默认执行
        // call(this, c1, c2, c3), apply(this, [c1, c2, c3]) 他们两个进行传参方式不一样
        // 子类
        function Son() {
          // 使用 call 进行继承
          Person.call(this); // 对象冒充
        }
      
        // 实例话一个子类
        const s = new Son();
        s.say(); // 张三说
        s.eat();  // eat is a function
      
    • 原型继承
      // 类的三大特性: 封装 继承 多态
      // 在 es5 中函数首字母大写,我们称之为这是一个构造函数
      function Person() {
        this.name = '张三';
        this.age = 18;
    
        this.say = function() {
          console.log(this.name + '说');
        }
      }
    
      // 原型
      Person.prototype.eat = function() {
        console.log('我的名字是' + this.name);
      }
    
      // call改变 this 指向 bind, apply
      // 这三个什么区别
      // bind 默认执行
      // call(this, c1, c2, c3), apply(this, [c1, c2, c3]) 他们两个进行传参方式不一样
      // 子类
      function Son() {
        // 使用 call 进行继承
        Person.call(this); // 对象冒充
      }
    
      // 原型继承
      Son.prototype = new Person();
    
      // 实例话一个子类
      const s = new Son();
      s.say(); // 张三说
      s.eat();  // 我的名字是张三
    
  • 静态属性和方法

    • 静态方法,在构造函数后面直接添加,调用的时候,构造函数可以直接调用。
      // 类的三大特性: 封装 继承 多态
      // 在 es5 中函数首字母大写,我们称之为这是一个构造函数
      function Person() {
        this.name = '张三';
        this.age = 18;
    
        this.say = function() {
          console.log(this.name + '说');
        }
      }
    
      // 原型
      Person.prototype.eat = function() {
        console.log('我的名字是' + this.name);
      }
    
      // call改变 this 指向 bind, apply
      // 这三个什么区别
      // bind 默认执行
      // call(this, c1, c2, c3), apply(this, [c1, c2, c3]) 他们两个进行传参方式不一样
      // 子类
      function Son() {
        // 使用 call 进行继承
        Person.call(this); // 对象冒充
      }
    
      // 原型继承
      Son.prototype = new Person();
    
      // 实例话一个子类
      const s = new Son();
      s.say();
      s.eat(); 
    
    
      // 添加静态属性
      s.sex = '男';
      s.staticFn = function() {
        console.log('我是静态方法');
      }
    
      // 调用静态属性和方法
      console.log(s.sex);
      s.staticFn();
    
  • es6的创建方式

    • es6类的继承方式
      class Person{
        constructor(name, age) {
          // super(name, age); // 继承
    
          this.name = name;
          this.age = age;
        }
    
        say() {
          console.log(this.name+ '说');
        }
        eat() {
          console.log('我的名字是' + this.name);
        }
      }
    
      // const p = new Person();
      // p.say();
      // p.eat();
    
    
      // es6 的类如何实现继承
      class Son extends Person{
        constructor(name, age) {
          super(name, age);
        }
      }
    
      const s = new Son('张三', 18);
      s.say();
      s.eat();
    
    • ts 中类的继承和属性及方法的定义
      // es6 定义 类 的方式
      class Person{
        // name: string == this.name = name;
        name: string;
        age: number;
        constructor(name: string, age: number) {
          // super(name, age); // 继承
    
          // = 赋值曹植
          this.name = name;
          this.age = age;
        }
    
        say(): void {
          console.log(this.name+ '说');
        }
        eat(): void {
          console.log('我的名字是' + this.name);
        }
      }
    
      // const p = new Person();
      // p.say();
      // p.eat();
    
    
      // es6 的类如何实现继承
      class Son extends Person{
        constructor(name: string, age: number) {
          super(name, age);
        }
      }
    
      const s = new Son('张三', 18);
      s.say();
      s.eat();
    

  • 类的 4 大修饰符
  • public(公共的) private(私有的) protected (protected成员在派生类中仍然可以访问) readonly(只读的)static(静态属性)
  • public(公共的)(在TypeScript里,成员都默认为 public。)

  public say():void {
    console.log(this.name + '说');
  }
  • private(私有的)(当成员被标记成 private时,它就不能在声明它的类的外部访问。)

  private eat(): void {
    console.log(this.name + '吃');
  }
  • protected(protected修饰符与 private修饰符的行为很相似,但有一点不同, protected成员在派生类中仍然可以访问。例)

  protected go(): void {
    console.log(this.name + '走开了');
  }
  • readonly(只读的)(你可以使用 readonly关键字将属性设置为只读的。 只读属性必须在声明时或构造函数里被初始化。)

  readonly name: string;
  • static(静态属性)(到目前为止,我们只讨论了类的实例成员,那些仅当类被实例化的时候才会被初始化的属性。 我们也可以创建类的静态成员,这些属性存在于类本身上面而不是类的实例上。)
  class Grid {
      static origin = {x: 0, y: 0};
      calculateDistanceFromOrigin(point: {x: number; y: number;}) {
          // ...好多代码
      }
      constructor (public scale: number) { }
  }

  let grid1 = new Grid(1.0);  // 1x scale
  let grid2 = new Grid(5.0);  // 5x scale

  // 静态属性的调用
  console.log(grid1.calculateDistanceFromOrigin({x: 10, y: 10}));
  console.log(grid2.calculateDistanceFromOrigin({x: 10, y: 10}));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值