查看原文
其他

TypeScript 类型挑战:第一个元素

CUGGZ 前端充电宝 2022-07-21

高质量的类型可以提高项目的可维护性并避免一些潜在的漏洞。

一些前端面试中也考察到了 TypeScript 高级类型的定义,本系列主要解答来自 Type Challenges 项目中的 TS 类型挑战问题,以此更好的了解 TS 的类型系统,编写自己的类型工具,更好的应对前端面试。

下面来看一个难度为简单的题目:第一个元素

题目描述

实现一个通用First<T>,它接受一个数组T并返回它的第一个元素的类型。

例如:

type arr1 = ['a''b''c']
type arr2 = [321]

type head1 = First<arr1> // expected to be 'a'
type head2 = First<arr2> // expected to be 3

题目解答

要想获取数组T第一个元素的类型,可以这么写:

type First<T> = T[0];

这时就报错了:

我们需要使用extends来约束T是一个数组:

type First<T extends any[]> = T[0];

还要处理边界情况,如果数组为空,那T[0]是不能正常工作的。所以,当数组为空时就返回never类型,否则就返回T[0]。最终的实现如下:

type First<T extends any[]> = T extends [] ? never : T[0];

Type Challenges:https://github.com/type-challenges/type-challenges

往期推荐:

TypeScript 类型挑战:实现 Pick

TypeScript 类型挑战:实现 Readonly

TypeScript 实用工具类型

TypeScript 中的感叹号

React + TypeScript:如何处理常见事件?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存