You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用扩展运算符实现返回同类型数组的TypeScript泛型函数?

解决方案

当你将参数类型从[...T]改为T后,默认情况下TypeScript会把数组字面量推断为宽泛的联合数组类型(比如(string|number|boolean)[]),而非具体的元组类型。要保持返回类型与入参的元组类型完全一致,需要通过泛型约束保留元组推断行为,具体有两种实现方式:

方式一:用剩余元组约束强制推断元组

将泛型约束设为T extends [...unknown[]],让TypeScript优先把传入的数组字面量推断为元组类型,返回类型直接写T即可:

const parseItems = <T extends [...unknown[]]>(items: T): T => {
  // 你的业务处理逻辑,比如解析操作
  return items.map(item => item) as T;
  // 注意:Array.map默认返回数组类型,需断言为T以匹配元组类型
};

const items = parseItems(['hello', 101, true]); // 类型为[string, number, boolean]

方式二:通过readonly约束触发元组推断

利用readonly unknown[]作为泛型约束也能触发元组推断,若不需要返回类型带readonly修饰,可通过映射类型去除:

// 带readonly的版本
const parseItems = <T extends readonly unknown[]>(items: T): T => {
  return [...items] as T;
};
const readonlyItems = parseItems(['hello', 101, true]); // 类型为readonly [string, number, boolean]

// 去除readonly的版本
const parseItems = <T extends readonly unknown[]>(items: T): { -readonly [K in keyof T]: T[K] } => {
  return [...items] as { -readonly [K in keyof T]: T[K] };
};
const items = parseItems(['hello', 101, true]); // 类型为[string, number, boolean]

核心原理

原代码中的[...T]参数类型是通过剩余元组语法触发了TypeScript的元组推断机制。改为T作为参数类型后,需要通过泛型约束([...unknown[]]或readonly unknown[])来维持这种推断行为,确保泛型T被推断为具体的元组类型,而非宽泛的数组类型。

内容的提问来源于stack exchange,提问作者Cequiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:35:00