joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  404 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

在 TypeScript 中,声明入参函数的类型有多种方式,以下是总结和推荐的几种方法:


1. 内联定义函数类型

直接在参数中定义函数的类型,指定其参数和返回值类型。

function execute(fn: (arg: number) => string): void {
  const result = fn(42);
  console.log(result);
}

适用场景:

  • 函数类型简单,不需要复用。
  • 希望代码更紧凑,直接在参数中定义类型。

2. 使用类型别名定义函数类型

通过 type 关键字为函数类型创建一个别名,使代码更具可读性和复用性。

type TransformFunction = (input: number) => string;

function execute(fn: TransformFunction): void {
  const result = fn(42);
  console.log(result);
}

适用场景:

  • 函数类型复杂或需要多次复用。
  • 提高代码的可维护性和可读性。

3. 使用 typeof 获取已定义函数的类型

如果目标函数已经定义,可以直接使用 typeof 获取其类型。

function add(a: number, b: number): number {
  return a + b;
}

type AddFunctionType = typeof add;

function execute(fn: AddFunctionType): void {
  const result = fn(10, 20);
  console.log(result);
}

适用场景:

  • 目标函数已经定义,且希望直接引用其类型。
  • 避免重复定义相同的函数类型。

4. 带多个参数或复杂签名的函数类型

可以定义带有多个参数或复杂签名的函数类型。

function calculate(fn: (a: number, b: number) => number): void {
  const result = fn(10, 5);
  console.log(result);
}

适用场景:

  • 函数有多个参数或复杂的参数列表。
  • 需要明确指定每个参数的类型。

5. 支持可选参数或默认参数的函数类型

可以通过在类型定义中添加可选参数(?)或默认参数来定义灵活的函数类型。

type OptionalParamFunction = (a: number, b?: number) => number;

function process(fn: OptionalParamFunction): void {
  const result1 = fn(10); // 只传递一个参数
  const result2 = fn(10, 5); // 传递两个参数
  console.log(result1, result2);
}

适用场景:

  • 函数参数可能有默认值或部分参数是可选的。
  • 提高函数类型的灵活性。

6. 泛型函数类型

如果函数需要支持泛型,可以在类型定义中使用泛型参数。

function apply<T>(fn: (value: T) => T, input: T): T {
  return fn(input);
}

适用场景:

  • 函数需要处理多种类型的输入和输出。
  • 提高代码的通用性和复用性。

总结

方法 特点 适用场景
内联定义函数类型 简单直接,在参数中定义函数类型 类型简单、无需复用
使用类型别名 提高代码可读性和复用性,适合复杂类型 类型复杂、需要多次复用
使用 typeof 快速获取已定义函数的类型 函数已定义,避免重复定义
多参数或复杂签名 支持多参数或复杂签名 参数较多或签名复杂
可选参数或默认参数 支持灵活的参数定义 参数可能是可选或有默认值
泛型函数类型 支持泛型,提高通用性 需要处理多种类型

根据具体需求选择合适的方法,可以使代码更加清晰、简洁且易于维护。

posted on   joken1310  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示