TypeScript--函数声明

函数声明

示例

function sum(x: number, y: number): number {
    return x + y
}

// ✅正确
sum(2, 4)

// ❌错误
// Expected 2 arguments, but got 3.
sum(2, 4, 5)

// ❌错误
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)

函数表达式

示例

const sum = function(x: number, y: number): number {
    return x + y
}

// ✅正确
sum(2, 4)

// ❌错误
// Expected 2 arguments, but got 3.
sum(2, 4, 5)

// ❌错误
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)

事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的 sum,是通过赋值操作进行类型推论而推断出来的。

// 手动添加类型
const sum: (x: number, y: number) => number = function(x: number, y: number): number {
    return x + y
}

// ✅正确
sum(2, 4)

// ❌错误
// Expected 2 arguments, but got 3.
sum(2, 4, 5)

// ❌错误
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)

TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,右边是输出类型。

用接口定义函数的形状

interface Sum {
    (x: number, y: number): number
}

const sum: Sum = function (x: number, y: number) {
    return x + y
}

// ✅正确
sum(2, 4)

// ❌错误
// Expected 2 arguments, but got 3.
sum(2, 4, 5)

// ❌错误
// Expected 2 arguments, but got 1.
// An argument for 'y' was not provided.
sum(2)

可选参数

与接口中的可选属性类似,我们用 ? 表示可选的参数

function sum(x: number, y?: number): number {
    return y ? x + y : x
}

// ✅正确
sum(2)

// ✅正确
sum(2, 4)

注意:可选参数必须接在必需参数后面

// ❌错误
// A required parameter cannot follow an optional
function sum(x?: number, y: number): number {
    return x ? x + y : y
}

参数默认值

TypeScript 会将添加了默认值的参数识别为可选参数

function sum(x: number = 1, y: number): number {
    return x + y
}

// ✅正确
sum(2, 4)

补充:类型推论

如果没有明确的指定类型,那么 TypeScript 会依照类型推论(Type Inference)的规则推断出一个类型。

示例

let userName = 'Tom'

// ✅正确
userName = 'John'

// ❌错误
// Type 'number' is not assignable to type 'string'.
userName = 100

虽然 userName 没有指定类型,但是初始值 'Tom' 为字符串,所以推论 userName 的类型为字符串。

事实上,它等价于:

let userName: string = 'Tom'

// ✅正确
userName = 'John'

// ❌错误
// Type 'number' is not assignable to type 'string'.
userName = 123

如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查

let userName

// ✅正确
userName = 'John'

// ✅正确
userName = false

// ✅正确
userName = 100
posted @ 2021-04-14 09:31  蓦然回首!  阅读(631)  评论(0编辑  收藏  举报