编程前端开发人员

如何在 TypeScript 中使用 REST 和参数解构来实现函数类型?在类型错误的情况下会出现哪些问题?

用 Hintsage AI 助手通过面试

答案

TypeScript 支持使用 rest 参数解构 的函数的精确类型。这对于接受可变数量参数或复杂对象的函数尤其重要。

解构 在函数参数中允许明确指定预期属性的结构:

function printUser({ name, age }: { name: string; age: number }) { console.log(`${name} (${age})`); }

Rest 参数 允许指定可变数量的参数及其类型:

function sum(...numbers: number[]): number { return numbers.reduce((acc, cur) => acc + cur, 0); }

组合使用在接受主要对象和额外参数数组的函数中很常见:

function logEvent(event: { type: string }, ...meta: any[]) { console.log(event.type, meta.join(',')); }

正确的类型化可以在执行代码之前识别错误,但错误的类型化会导致类型安全性的丧失和运行时错误。

有陷阱的问题

如何为具有默认解构参数的函数指定类型并使其变为可选?

许多人指定了对象的类型,但忘记使每个字段可选或同时与类型一起指定默认值:

function foo({x = 1, y = 2}: {x?: number; y?: number} = {}) { console.log(x, y); }

在这里,默认值被指定,并且所有参数通过 ? 变为可选。如没有这一点,没有参数的调用将引发错误,尽管预期有默认值。

由于对主题细微之处的不了解而导致的真实错误示例


故事

在项目中将带参数的函数从 JavaScript 迁移到 TypeScript 时,只为对象指定了类型,而没有为单独的字段指定。结果,调用没有参数的函数导致了应用程序因解构错误而崩溃:undefined 没有属性 name

故事

在处理 rest 参数时,忘记明确指定数组的类型。在函数中,类型为 any[],这允许传递不仅仅是数字。在生产环境中,突然将数字和字符串相加,导致报告中的结果不正确。

故事

使用了解构与深嵌套对象,但未指定嵌套类型。因此,TS “迷失了”,未提示缺少对象中的必需字段,导致在客户端出现 TypeError: Cannot read property 'id' of undefined 的错误。