现在无论是前端,还是基于Node.js的后端,对TypeScript使用越来越多。今天我们说一个TypeScript高级使用技巧——提取已有对象的类型。
在ts中,通常我们是先声明类型,再创建该类型的对象:
type User = {
name: string,
age: number
}
const me: User = { name: 'Youmoo', age: 18 };
复制
在某些情况下我们并不知道一个对象的类型,(如引用三方库的对象,而三方库并没有暴露该对象的类型时)
我们可以借助ts,让它帮我们推断出对象类型:
const animal = { type: 'cat', name: 'Tom' };
// 对于以上对象,我们需要提取出它的类型,并创建一个同类型的对象
type Animal = typeof animal;
// 定义一个同类型的对象
const mouse: Animal = { type: 'mouse', name: 'Jerry' };
复制
在visual studio code中,可以看到ts帮我们正确地推导出了Animal类型:
以上是简单的object对象,若我们想提取数组内元素的类型呢?
方法有多种。
一、利用下标提取元素类型
type Animals = Array<{ type: string, name: string }>;
type Animal = Animals[number];
复制
二、利用conditional+infer
type Animals = Array<{ type: string, name: string }>;
type Animal = Animals extends (infer T)[] ? T : never;
复制
有了以上技巧,可以引出一些有意思的玩法。
比如,将string数组中的元素提取为常量类型。
const valid_answers = ['yes', 'no', 'answer'] as const;
type Answer = (typeof valid_answers)[number];
const ans1: Answer = 'yes';// 没问题
const ans2: Answer = 'nope';// 编译不通过
复制
其中Answer的类型定义是:
我们甚至可以继续向内,提取更深层的字段类型:
type Foo = { x: Array<{ y: string }> };
type TypeY = Foo['x'][number]['y'];
复制
你说,TypeY是什么类型呢?
文章参考自推文: https://twitter.com/sulco/status/1215255647056486403
文章转载自背井,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
2025年4月中国数据库流行度排行榜:OB高分复登顶,崖山稳驭撼十强
墨天轮编辑部
1866次阅读
2025-04-09 15:33:27
2025年3月国产数据库大事记
墨天轮编辑部
866次阅读
2025-04-03 15:21:16
2025年3月国产数据库中标情况一览:TDSQL大单622万、GaussDB大单581万……
通讯员
603次阅读
2025-04-10 15:35:48
征文大赛 |「码」上数据库—— KWDB 2025 创作者计划启动
KaiwuDB
495次阅读
2025-04-01 20:42:12
数据库,没有关税却有壁垒
多明戈教你玩狼人杀
485次阅读
2025-04-11 09:38:42
国产数据库需要扩大场景覆盖面才能在竞争中更有优势
白鳝的洞穴
463次阅读
2025-04-14 09:40:20
最近我为什么不写评论国产数据库的文章了
白鳝的洞穴
403次阅读
2025-04-07 09:44:54
天津市政府数据库框采结果公布!
通讯员
359次阅读
2025-04-10 12:32:35
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
353次阅读
2025-04-17 17:02:24
优炫数据库成功入围新疆维吾尔自治区行政事业单位数据库2025年框架协议采购!
优炫软件
336次阅读
2025-04-18 10:01:22