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

如何在已知类型时保留数组类型?TypeScript断言函数优化

实现保留元素类型的泛型数组验证函数

当前的assertArray函数返回unknown[],无法保留原数组的元素类型。以下是两种满足需求的实现方案,既能验证输入为数组,又能推导并返回对应正确类型,同时支持任意数组类型的灵活处理:


方案1:泛型结合Extract类型提取数组分支

该方案自动处理联合类型输入,提取其中的数组分支作为返回类型:

function assertArray<T>(value: T): Extract<T, unknown[]> {
  if (!Array.isArray(value)) {
    throw new Error("Input is not an array");
  }
  return value as Extract<T, unknown[]>;
}

使用示例:

// 联合类型输入:自动推导返回number[]
const numValue: number | number[] = [1, 2, 3];
const verifiedNumArray = assertArray(numValue);

// 单一数组类型输入:返回string[]
const strArray: string[] = ["foo", "bar"];
const verifiedStrArray = assertArray(strArray);

// 自定义对象数组:返回{ id: number }[]
const objArray: { id: number }[] = [{ id: 1 }, { id: 2 }];
const verifiedObjArray = assertArray(objArray);

方案2:使用断言函数缩小参数类型

若无需返回数组,而是直接在原变量上缩小类型,可采用TypeScript断言函数语法:

function assertArray<T>(value: unknown): asserts value is T[] {
  if (!Array.isArray(value)) {
    throw new Error("Input is not an array");
  }
}

使用示例:

const value: number | number[] = [1, 2, 3];
assertArray<number>(value);
// 此时value的类型已被缩小为number[],可直接调用数组方法
value.forEach(num => console.log(num.toFixed(2)));

原理说明

  • 方案1中的Extract<T, unknown[]>用于从联合类型T中筛选出数组类型分支,确保返回类型与输入的数组类型完全匹配。
  • 泛型T会自动推断输入参数的类型,复杂场景下可手动指定类型参数。
  • 两种方案均支持任意元素类型的数组验证,同时严格保留类型信息,满足灵活性需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:55:05