面试题答案
一键面试数组和元组类型在 TypeScript 中的定义与实现
- 数组类型
- 在 TypeScript 类型系统底层,数组类型本质上是一种泛型类型
Array<T>
或者T[]
。这里T
代表数组元素的类型。例如number[]
表示一个只包含number
类型元素的数组。这种定义方式允许在编译时对数组元素类型进行检查,确保只有符合类型T
的值才能被添加到数组中。 - 在实现层面,TypeScript 编译器在解析代码时,会依据数组类型定义来检查对数组的操作,比如添加元素、读取元素等操作是否符合指定的类型。如果不符合,就会抛出类型错误。
- 在 TypeScript 类型系统底层,数组类型本质上是一种泛型类型
- 元组类型
- 元组类型是 TypeScript 对 JavaScript 数组的扩展,它允许表示一个已知元素数量和类型的数组。例如
[string, number]
表示一个有两个元素的数组,第一个元素是string
类型,第二个元素是number
类型。 - 从底层原理看,元组类型同样基于数组,但增加了元素位置和类型的严格限制。TypeScript 编译器在处理元组时,会严格检查每个位置上元素的类型,这使得元组在类型安全性上比普通数组更高。
- 元组类型是 TypeScript 对 JavaScript 数组的扩展,它允许表示一个已知元素数量和类型的数组。例如
通用类型转换函数设计
- 类型定义
- 首先定义输入和输出类型:
type InputType = [[string, number], [string, number, boolean]]; type OutputType = [string, number, boolean?][];
- 定义类型转换函数:
function convertArray(input: InputType): OutputType { return input.flatMap((subArray) => { if (subArray.length === 2) { return [subArray[0], subArray[1]]; } else if (subArray.length === 3) { return subArray; } else { throw new Error('Invalid sub - array length'); } }); }
- 类型推断过程
- 函数
convertArray
的参数input
被明确指定为InputType
,这是一个已知的嵌套数组类型。 - 在函数体中,使用
flatMap
方法对input
进行操作。flatMap
方法的返回类型会根据回调函数的返回值进行推断。 - 回调函数中,根据
subArray
的长度进行不同处理。如果长度为 2,返回[subArray[0], subArray[1]]
,这符合OutputType
中元素类型[string, number]
。如果长度为 3,直接返回subArray
,符合OutputType
中元素类型[string, number, boolean]
。由于flatMap
会将所有子数组扁平化,最终返回的类型会被推断为OutputType
。
- 函数
- 处理边界情况
- 子数组长度异常:如果
subArray
的长度既不是 2 也不是 3,抛出Invalid sub - array length
错误。这确保了输入的嵌套数组结构符合预期,不会出现类型不匹配的情况。 - 类型兼容性:因为输入类型
InputType
已经保证了子数组元素类型的正确性,所以在转换过程中不需要额外的类型检查来确保元素类型的一致性。
- 子数组长度异常:如果
性能影响
- 编译时性能影响
- 由于 TypeScript 是静态类型语言,在编译时会对类型进行严格检查。在这个类型转换函数中,编译器需要验证输入类型
InputType
和输出类型OutputType
的兼容性,以及函数内部操作是否符合类型定义。这会增加编译时间,但这种检查有助于在开发阶段发现类型错误,提高代码质量。
- 由于 TypeScript 是静态类型语言,在编译时会对类型进行严格检查。在这个类型转换函数中,编译器需要验证输入类型
- 运行时性能影响
- 在运行时,
flatMap
方法是核心操作。flatMap
会遍历输入数组的每个元素,并对每个元素执行回调函数,然后将结果扁平化。这个操作的时间复杂度是 O(n),其中 n 是输入数组中所有子数组元素的总数。虽然flatMap
是高效的数组方法,但对于非常大的嵌套数组,性能可能会受到影响。另外,抛出错误(如Invalid sub - array length
)也会有一定的性能开销,因此尽量避免在运行时出现这种情况。
- 在运行时,