当前位置: 首页 > article >正文

TS:如何推导函数类型

假如存在一个函数如下:

// Watcher 类型,存在一个 on 函数
type Watcher = {
  on(event: string, callback: (oldValue: any, newValue: any) => void): void;
};

// watch 函数,返回一个 Watcher 对象
declare function watch(obj: Object): Watcher;

// 创建一个 PersonWatcher 对象
const PersonWatcher = watch({
  name: 'Alice',
  age: 18,
  sex: 'female',
});

// 调用方法
PersonWatcher.on('value', (oldValue, newValue) => {});

在上述代码中,我们只能知道 Watcher 中存在一个 on 函数,接收的 event 参数为 string 类型,callback 函数参数任意,由此引出一个问题:TS 的类型标注到底应该精细到什么程度呢?是详细到每个细节,还是适度就好?

通常来说,这取决于项目的规模和复杂度。类型定义过细会增加开发成本,但适度的类型标注能显著提升代码的可维护性和可靠性。也就是说 TS 的作用是用开发成本维护成本

修改为:

// Watcher 类型,存在一个 on 函数
type Watcher<T> = {
  on<K extends string & keyof T>(event: `${K}Change`, callback: (oldValue: T[K], newValue: T[K]) => void): void;
};

// watch 函数,返回一个 Watcher 对象
declare function watch<T>(obj: T): Watcher<T>;

const PersonWatcher = watch({
  name: 'Alice',
  age: 18,
  sex: 'female',
  address: {},
});

PersonWatcher.on('nameChange', (oldValue, newValue) => {});
PersonWatcher.on('ageChange', (oldValue, newValue) => {});
PersonWatcher.on('addressChange', (oldValue, newValue) => {});

代码解释:

1、Watcher<T> 类型:Watcher 是一个泛型类型,接受类型参数 T。这个类型包含一个 on 方法,用于监听对象属性的变化。

1)K extends string & keyof T:这里 K 是泛型,表示 T 对象中的某个属性的键名,且必须是字符串类型。

2)event:参数是模版字符串类型,要求传入的事件名称必须符合 "属性名 + Change" 的格式。比如:如果 T 有属性 name,那么 event 必须是 nameChange。

3)callback:函数用于处理变化事件,参数类型与被监听属性的类型一致,即 T[K],表示对象的属性值。

2、watch 函数:接受一个对象 obj 作为参数,返回 Watcher<T> 对象,其中 T 是 obj 的类型。

由此,这个函数的类型就书写的很详细啦!简单举个 🌰 阐述一下,在开发中,还需要具体问题具体对待。


http://www.kler.cn/a/374747.html

相关文章:

  • gin框架可以构建微服务吗?
  • 数字信号处理Python示例(1)使用Python生成正弦信号
  • c语言水仙花,超简单讲解
  • SpringBoot3+SpringSecurity6基于若依系统整合自定义登录流程
  • 【简道云 -注册/登录安全分析报告】
  • SQL之排名RANK()、ROW_NUMBER()、DENSE_RANK() 和 NTILE() 的区别(SQL 和 Hive SQL 都支持)
  • 探索Unity:从游戏引擎到元宇宙体验,聚焦内容创作
  • 双十一大促有哪些值得入手的产品?这五款产品实用又划算!
  • Three.js 粒子系统教程构建炫酷的 3D 粒子效果
  • 蘑菇书(EasyRL)学习笔记(2)
  • 如何在算家云搭建GFP-GAN(图像生成)
  • h510主板怎么装win7_h510装win7完美解决方案
  • VB.NET中如何利用WCF(Windows Communication Foundation)进行服务间通信
  • 抗扭截面模量公式
  • OSError: Can‘t load tokenizer for ‘bert-base-uncased‘.
  • vscode开发项目常用插件
  • AIGC:开启人工智能生成内容的新时代
  • Kafka集群数据迁移方案
  • 20241028软考架构-------软考案例7答案
  • Kubernetes——part10-1 kubernetes日志收集方案 ELK
  • Kubernetes——part10-2 kubernetes 日志收集方案 EFK
  • 红帽认证有必要考吗?这四大人群推荐考取!
  • axios竟态问题
  • npm入门教程14:npm依赖管理
  • 在米尔电子MPSOC实现12G SDI视频采集H.265压缩SGMII万兆以太网推流
  • 阿里巴巴独家的SpringCloud Alibaba学习笔记,面面俱到,太全了