编程前端开发者 / TypeScript 开发者

如何在 TypeScript 中实现严格的数组和元组(tuples)类型,并使用它们的原因是什么?它们之间有什么区别以及使用时的注意事项?

用 Hintsage AI 助手通过面试

回答

在 TypeScript 中,可以通过 type[]Array<type> 的方式严格指定数组的元素类型。例如:

let arr: number[] = [1, 2, 3];

元组是具有固定长度和每个元素类型的数组:

let tuple: [string, number] = ["age", 30];
  • 数组:允许任意数量的同一类型元素。
  • 元组:严格固定类型的数量和顺序。可以创建类似记录的结构,或者从函数中返回不同类型的值。

注意事项:

  • 在元组上使用数组方法(push, pop)时,虽然 push 不被禁止,但结果将突破保证的类型范围。
  • 不小心扩展元组会导致 "不安全" 的代码。
  • 在函数中解构元组时,如果类型或长度错误会导致错误。

难题

在 TypeScript 中,元组可以包含可变数量的元素吗,它将如何影响类型?

回答: 是的,元组可以通过 ... 语法包含剩余元素,但仍要求剩余元素的严格类型:

let tuple: [string, ...number[]] = ["id", 10, 20, 30];

然而,在 ... 之前的元素必须指定,剩余数组的类型必须是统一的。

由于对主题细微差别的不了解导致的真实错误示例


故事

在电子商务项目中,开发人员试图通过 push 将超过两个元素保存在元组 [string, number] 中。这在编译阶段没有报错,但导致期望正好两个元素的函数出现了故障,这导致在解析订单时出现错误。


故事

一个函数返回一个元组 [string, number],然而消费者期待的是字符串数组。类型不匹配导致了难以追踪的错误,因此不正确的值进入了生产环境。


故事

在将代码从 JavaScript 迁移到 TypeScript 时,使用了数组而不是元组来返回多个不同类型的值。这破坏了严格的类型,并导致后续代码中出现了依赖于值的顺序和类型的错误。