函数类型约束

其实就是对函数的输入输出进行类型限制。

函数声明
export {}
// 函数名(参数1:类型,参数2:类型):函数返回值类型
functionfun1(a:number,b:string):string{
  return'666'
}


fun1(2,'5')
// 参数个数不对应--报错
// fun1(2,'5',66)

可选参数使用 ?标注,c?:number,可以不传参,但是如果传参,必须使用对应类型

export {}
// 函数名(参数1:类型,参数2:类型,可选参数3?:类型):函数返回值类型
functionfun1(a:number,b:string,c?:number):string{
  return'666'
}


fun1(2,'5',66)

但是一般可选参数(ES6语法),都会使用默认值的方式标注,一旦设置默认值,参数就变成了可选参数:

// 函数名(参数1:类型,参数2:类型,可选参数3?:类型):函数返回值类型
functionfun1(a: number, b: string, c: number =6):string {
  return'666'
}


fun1(2,'5',66)

如果想接受任意个数的参数,可以使用 ES6 的 rest 操作符。注意,rest 是数组:

functionfun1(a: number, b: string,...rest: number[]): string {
  return'666'
}


fun1(2,'5',66,88,99)

注意:不管使用那种方式,可选参数必须放在参数的最后。

函数表达式

写法上并没有什么区别:

const fun2 =function (a: object, b: string): object {
  return {}
}
fun2({},'55')

但是,因为接受函数的是一个变量,而变量也应该是有一个类型的,一般情况下,TS 会根据函数表达式推断出我们的类型。如果是当作回调函数使用,我们需要约束传入的类型:

const fun2: (a: object, b: string) => object =function (a: object, b: string): object {
  return {}
}
fun2({},'55')

这种方式在定义接口时会经常用到,我们后面再说。

任意类型

因为 JS 本身是弱类型的原因,可以接受任意类型的参数。而 TS 是兼容 JS 的,所以在编码时难免会遇到任意类型的情况,比如:

functionstr(value:any){
  // 因为 JSON.stringify 就是能够接
  // 受任意类型的方法,所以value就需要是一个任意类型的
  returnJSON.stringify(value)
}
str(6)
str("xiling")

使用 any 就可以使用任意类型,语法上就不会报错了。注意只是语法上不会报错,因为使用 any 类型,TS 是不会做类型检查的,所以,使用 any 是有极大的类型安全问题的。

因为使用 any,就可以像使用传统的 JS 一样,导致很多人大量的无节制地使用 any ,俗称 any 大法好

隐式类型推断

如果一个变量没有第一类型,会自动根据值的类型进行类型推断。

typescript function做为参数 typescript 函数类型_typescript

typescript function做为参数 typescript 函数类型_git_02

如果定义变量没有赋值,则会推断为 any 类型。但是,强烈建议变量声明时,给与明确的类型约束。

未完待续...