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

如何定义仅含单一类型(数字或字符串)的TypeScript数组?

解决方案:定义纯字符串或纯数字的数组(禁止混合类型)

你遇到的问题是:(string | number)[]允许数组同时存字符串和数字,不符合“类型不可混合”的要求;而string[] | number[]定义的空数组无法直接调用push,因为TypeScript无法推断空数组的具体类型。下面是几种可行的解决办法:

方法1:类型断言明确初始类型

直接给空数组断言为具体的数组类型,让TS确定数组的元素类型,push方法就能正常使用:

// 纯数字数组
const numArr = [] as number[];
numArr.push(123); // ✅ 正常
numArr.push('abc'); // ❌ 报错,不允许添加字符串

// 纯字符串数组
const strArr = [] as string[];
strArr.push('hello'); // ✅ 正常
strArr.push(456); // ❌ 报错,不允许添加数字

方法2:用泛型函数创建类型安全的数组

如果需要更灵活地创建不同类型的数组,可以写一个泛型函数,限制元素只能是string或number:

function createHomogeneousArray<T extends string | number>(): T[] {
  return [];
}

// 创建纯数字数组
const nums = createHomogeneousArray<number>();
nums.push(789); // ✅ 正常
nums.push('test'); // ❌ 报错

// 创建纯字符串数组
const strs = createHomogeneousArray<string>();
strs.push('world'); // ✅ 正常
strs.push(101); // ❌ 报错

为什么string[] | number[]的写法会报错?

当你写const arr: string[] | number[] = []时,空数组[]的类型是never[],它兼容string[]和number[],但TS无法确定arr到底是哪种类型的数组。调用push时,TS不知道应该接受字符串还是数字,所以会抛出错误。必须通过类型断言或泛型明确数组的具体类型后,才能正常调用数组方法。

内容的提问来源于stack exchange,提问作者Islam Y-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:15:35