如何在已知类型时保留数组类型?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
相关产品推荐
相关产品推荐

