函数的类型

  1. /* 函数的类型 */
  2. //声明输入和输出的类型
  3. function getName_2401(fristName: string, lastName: string): string {
  4. return fristName + ' ' + lastName
  5. }
  6. let myName = getName_2401('mmo', 'fun') // 正确
  7. let myName = getName_2401('mmo') // 报错,缺少值
  8. let myName = getName_2401('mmo', 'fun', '123') // 报错,没定义值
  9. //声明输入和输出的类型
  10. function getName_2402(fristName: string, lastName?: string): string {
  11. if(!lastName) {
  12. return fristName
  13. }
  14. return fristName + ' ' + lastName
  15. }
  16. let myName = getName_2402('mmo', 'fun') // 正确
  17. let myName = getName_2402('mmo') // 正确
  18. //可选参数:默认值
  19. function getName_2403(fristName: string, lastName: string = '666'): string {
  20. return fristName + ' ' + lastName
  21. }
  22. let myName = getName_2403('mmo', 'fun') // 正确 [LOG]: "mmo fun"
  23. let myName = getName_2403('mmo') // 正确 [LOG]: "mmo 666"

image.png

答案

// 第一处空白答案
number

// 第二处空白答案
animalType

解析

第一处空白是函数的参数类型,依据代码

foo(0);

可以看出参数的类型应该是 number 类型。
第二处空白是函数的返回值类型,函数返回的是数组 animal 的 0 号元素。所以函数返回值类型为

{ name: string; weight: number; }

由于代码块中已经声明类型别名 animalType,所以这里用 animalType 更合适,可以增加代码阅读性。

类型推论 - 函数

/* 类型推论 - 函数 */

// fristName, lastName推论为any,return推论为string(因为函数内进行string的拼接)
function getName_2404(fristName, lastName?) {
    return fristName + ' ' + lastName
}
let myName = getName_2404('mmo')

// fristName, lastName推论为any
function getName_2405(fristName, lastName?) {
    return fristName + '' + lastName
}
let myName = getName_2405('mmo')

// 自动推论为string
function getName_2404(fristName = 'mmo', lastName = '123') {
    return fristName + ' ' + lastName
}
let myName = getName_2404('mmo')

image.png

答案

B

解析

变量 animal 被赋值为函数,因此变量 animal 会被推论为具体的函数类型。

  • A - any 不是具体的函数类型。故错误。
  • B - 本选项是一个函数类型,且函数的参数和返回值类型与赋值函数的参数和返回值类型相符。故正确。
  • C - 本选项是一个对象类型(函数的返回值类型)。故错误。

函数表达式 vs 函数声明

/* 函数表达式 vs 函数声明 */

// 函数声明
function getName_2407(fristName, lastName) {
    return fristName + lastName
}

// 函数表达式,匿名函数赋值给变量
let getName_2408 = function(fristName, lastName) {
    return fristName + lastName
}

// 通过类型别名 给变量定义类型
type GetUserNameFunc_2409 = (x: string, y: string) => string
let getName_2409: GetUserNameFunc_2409 = function (fristName, lastName) {
    return fristName + lastName
}

getName_2409('mmo','123')

image.png

答案

B

解析

变量 getAnimal 被赋值为函数,因此变量 getAnimal 会被推论为具体的函数类型。

  • A - 本选项的 animalType 类型是定义的类型别名,是一个对象类型。故错误。
  • B - 本选项是一个函数类型,且函数的参数和返回值结构类型,与赋值函数的参数和返回值结构类型相符。故正确。
  • C - 本选项是一个函数类型,但本选项中函数的返回值类型是一个联合类型,联合类型中均为基本数据类型。与赋值函数的返回值类型不符合。故错误。
  • D - 本选项的联合类型中均为基本数据类型。故错误。

箭头函数

/* 箭头函数 */

// 箭头函数 箭头函数没有this,所以不能被当做构造函数使用
let getName_2410 = (fristName: string, lastName: string): string => {
    return fristName + lastName
}

函数的重载

/* 函数的重载 */

// 错误示例
function double_2411(x: number | string): number | string {
    if(typeof x === 'number') {
        return x * 2
    } else {
        return x + "," + x
    }
}

double_2411(1).toFixed(2)   //报错,因为私有属性不能被调用
double_2411('1').length  //报错,因为私有属性不能被调用

// 正确示例 注意:函数重载从上往下匹配,多个函数定义有包含关系,需要把精确的放在最前面
function double_2412(x: number): number;
function double_2412(x: string): string;
function double_2412(x: number | string): number | string {
    if (typeof x === 'number') {
        return x * 2
    } else {
        return x + "," + x
    }
}

double_2412(1).toFixed(2)   //正确
double_2412('1').length  //正确