TS 函数类型写法
一、返回值类型
函数返回值在 ()
后面添加类型即可。
function fn(): number {
return 1
}
const fn = function (): number {
return 1
}
const fn = (): number => {
return 1
}
const obj = {
fn(): number {
return 1
}
}
二、函数类型
函数类型,用来描述一个函数:
type FnType = (x: number, y: number) => number
三、完整的函数写法
let myAdd: (x: number, y: number) => number = function (
x: number,
y: number
): number {
return x + y
}
// 使用 FnType 类型
let myAdd: FnType = function (x: number, y: number): number {
return x + y
}
// ts 自动推导参数类型
let myAdd: FnType = function (x, y) {
return x + y
}
四、函数重载
JS 是动态类型,本身不需要支持重载,TS 为了保证类型安全,支持了函数签名的类型重载。
多个重载签名和一个实现签名:
// 重载签名(函数类型定义)
function toString(x: string): string
function toString(x: number): string
// 实现签名(函数体具体实现)
function toString(x: string | number) {
return String(x)
}
let a = toString('hello') // ok
let b = toString(2) // ok
let c = toString(true) // error
如果定义了重载签名,则实现签名对外不可见:
function toString(x: string): string
function toString(x: number): string {
return String(x)
}
len(2) // error
实现签名必须兼容重载签名:
function toString(x: string): string
function toString(x: number): string // error
// 函数实现
function toString(x: string) {
return String(x)
}
重载签名的类型不会合并:
// 重载签名(函数类型定义)
function toString(x: string): string
function toString(x: number): string
// 实现签名(函数体具体实现)
function toString(x: string | number) {
return String(x)
}
function stringOrNumber(x): string | number {
return x ? '' : 0
}
// input 是 string 和 number 的联合类型
// 即 string | number
const input = stringOrNumber(1)
toString('hello') // ok
toString(2) // ok
toString(input) // error