函数声明
示例
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