# 函数

函数的约束,主要是约束函数的传参与返回值。

有返回值必须要定义函数返回值的类型,没有可以使用void

// 函数声明式
function fn(): string {
  let str:string = 'hello'
  return str
}
fn();

// 匿名函数
var fn1 = function(): number {
  let num:number = 1111
  return num
}
fn1();

// 传参
function param(name: string, age: number):void {
  let info:string = `${name} ---- ${age}`
  console.log(info)
}
param('chang', 18);

# 箭头函数

const param = (age: number):number => age

param(12);

# 可选参数

可传可不传,没传参的时候,它的值就是undefined。在参数后面使用 ? 来表示 可选参数必须放到正常参数后面。

function param2(name: string, age?: number):void {
  if (age) {
    let info:string = `${name} ---- ${age}`
    console.log(info)
  } else {
    let info:string = `${name} ----年龄保密`
    console.log(info)
  }
}
param2('chang', 18);
param2('chang');

# 默认参数

为参数提供一个默认值,当用户没有传递这个参数或传递的值是undefined时使用默认值。

这个可以随意放。

可选参数不能和默认参数一起使用。

function param3(name: string, age: number = 18):void {
  if (age) {
    let info:string = `${name} ---- ${age}`
    console.log(info)
  } else {
    let info:string = `${name} ----年龄保密`
    console.log(info)
  }
}
param3('chang', 30);
param3('chang');

# 剩余参数

同时操作多个参数,或者不知道要传入多少参数。

可以使用...来创建一个参数数组进行传参,...后面跟一个数组。

function param4(name: string, ...ages:number[]):void {
  let sum:string
  for(let i =0;i<ages.length;i++) {
    sum = `${name} ---- ${ages[i]}`
    console.log(sum)
  }
}
param4('chang', 30);
param4('chang', 12, 124, 11, 44);

// 获取所有参数
function param5(...ages:number[]):void {
  let args:IArguments = arguments
  console.log(args)
}

# 对象参数

对象参数建议使用接口来定义

interface User {
  name:string;
  age:number
}
function add(user: User):User {
  return User
}
add({name: 'xxx', age: 18})

# 定义this类型

在函数中调用this时ts是可以定义this类型的,这在js是无法使用的。

必须第一个参数来定义这个this类型,传参时忽略掉就行。

interface User {
  arr: number[];
  add:(this:User, age:number)=>void
}

let user: User = {
  arr: [1, 2, 3],
  add(this:User, age:number) {
    this.arr.push(age)
  }
}
user.add(4)