Skip to main content

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